diff --git a/src/Discord.Net.Core/GatewayIntents.cs b/src/Discord.Net.Core/GatewayIntents.cs
new file mode 100644
index 000000000..e58fc07d1
--- /dev/null
+++ b/src/Discord.Net.Core/GatewayIntents.cs
@@ -0,0 +1,41 @@
+using System;
+
+namespace Discord
+{
+ [Flags]
+ public enum GatewayIntents
+ {
+ /// This intent includes no events
+ None = 0,
+ /// This intent includes GUILD_CREATE, GUILD_UPDATE, GUILD_DELETE, GUILD_ROLE_CREATE, GUILD_ROLE_UPDATE, GUILD_ROLE_DELETE, CHANNEL_CREATE, CHANNEL_UPDATE, CHANNEL_DELETE, CHANNEL_PINS_UPDATE
+ Guilds = 1 << 0,
+ /// This intent includes GUILD_MEMBER_ADD, GUILD_MEMBER_UPDATE, GUILD_MEMBER_REMOVE
+ GuildMembers = 1 << 1,
+ /// This intent includes GUILD_BAN_ADD, GUILD_BAN_REMOVE
+ GuildBans = 1 << 2,
+ /// This intent includes GUILD_EMOJIS_UPDATE
+ GuildEmojis = 1 << 3,
+ /// This intent includes GUILD_INTEGRATIONS_UPDATE
+ GuildIntegrations = 1 << 4,
+ /// This intent includes WEBHOOKS_UPDATE
+ GuildWebhooks = 1 << 5,
+ /// This intent includes INVITE_CREATE, INVITE_DELETE
+ GuildInvites = 1 << 6,
+ /// This intent includes VOICE_STATE_UPDATE
+ GuildVoiceStates = 1 << 7,
+ /// This intent includes PRESENCE_UPDATE
+ GuildPresences = 1 << 8,
+ /// This intent includes MESSAGE_CREATE, MESSAGE_UPDATE, MESSAGE_DELETE, MESSAGE_DELETE_BULK
+ GuildMessages = 1 << 9,
+ /// This intent includes MESSAGE_REACTION_ADD, MESSAGE_REACTION_REMOVE, MESSAGE_REACTION_REMOVE_ALL, MESSAGE_REACTION_REMOVE_EMOJI
+ GuildMessageReactions = 1 << 10,
+ /// This intent includes TYPING_START
+ GuildMessageTyping = 1 << 11,
+ /// This intent includes CHANNEL_CREATE, MESSAGE_CREATE, MESSAGE_UPDATE, MESSAGE_DELETE, CHANNEL_PINS_UPDATE
+ DirectMessages = 1 << 12,
+ /// This intent includes MESSAGE_REACTION_ADD, MESSAGE_REACTION_REMOVE, MESSAGE_REACTION_REMOVE_ALL, MESSAGE_REACTION_REMOVE_EMOJI
+ DirectMessageReactions = 1 << 13,
+ /// This intent includes TYPING_START
+ DirectMessageTyping = 1 << 14,
+ }
+}
diff --git a/src/Discord.Net.WebSocket/API/Gateway/IdentifyParams.cs b/src/Discord.Net.WebSocket/API/Gateway/IdentifyParams.cs
index 1e0bf71c2..e3e24491d 100644
--- a/src/Discord.Net.WebSocket/API/Gateway/IdentifyParams.cs
+++ b/src/Discord.Net.WebSocket/API/Gateway/IdentifyParams.cs
@@ -1,4 +1,4 @@
-#pragma warning disable CS1591
+#pragma warning disable CS1591
using Newtonsoft.Json;
using System.Collections.Generic;
@@ -17,5 +17,7 @@ namespace Discord.API.Gateway
public Optional ShardingParams { get; set; }
[JsonProperty("guild_subscriptions")]
public Optional GuildSubscriptions { get; set; }
+ [JsonProperty("intents")]
+ public Optional Intents { get; set; }
}
}
diff --git a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs
index ef97615e2..1b21bd666 100644
--- a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs
+++ b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs
@@ -209,7 +209,7 @@ namespace Discord.API
await _sentGatewayMessageEvent.InvokeAsync(opCode).ConfigureAwait(false);
}
- public async Task SendIdentifyAsync(int largeThreshold = 100, int shardID = 0, int totalShards = 1, bool guildSubscriptions = true, RequestOptions options = null)
+ public async Task SendIdentifyAsync(int largeThreshold = 100, int shardID = 0, int totalShards = 1, bool guildSubscriptions = true, GatewayIntents? gatewayIntents = null, RequestOptions options = null)
{
options = RequestOptions.CreateOrClone(options);
var props = new Dictionary
@@ -220,12 +220,16 @@ namespace Discord.API
{
Token = AuthToken,
Properties = props,
- LargeThreshold = largeThreshold,
- GuildSubscriptions = guildSubscriptions
+ LargeThreshold = largeThreshold
};
if (totalShards > 1)
msg.ShardingParams = new int[] { shardID, totalShards };
+ if (gatewayIntents.HasValue)
+ msg.Intents = (int)gatewayIntents.Value;
+ else
+ msg.GuildSubscriptions = guildSubscriptions;
+
await SendGatewayAsync(GatewayOpCode.Identify, msg, options: options).ConfigureAwait(false);
}
public async Task SendResumeAsync(string sessionId, int lastSeq, RequestOptions options = null)
diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs
index 10470365f..d19f3f90c 100644
--- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs
+++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs
@@ -44,6 +44,7 @@ namespace Discord.WebSocket
private RestApplication _applicationInfo;
private bool _isDisposed;
private bool _guildSubscriptions;
+ private GatewayIntents? _gatewayIntents;
///
/// Provides access to a REST-only client with a shared state from this client.
@@ -137,6 +138,7 @@ namespace Discord.WebSocket
Rest = new DiscordSocketRestClient(config, ApiClient);
_heartbeatTimes = new ConcurrentQueue();
_guildSubscriptions = config.GuildSubscriptions;
+ _gatewayIntents = config.GatewayIntents;
_stateLock = new SemaphoreSlim(1, 1);
_gatewayLogger = LogManager.CreateLogger(ShardId == 0 && TotalShards == 1 ? "Gateway" : $"Shard #{ShardId}");
@@ -242,7 +244,7 @@ namespace Discord.WebSocket
else
{
await _gatewayLogger.DebugAsync("Identifying").ConfigureAwait(false);
- await ApiClient.SendIdentifyAsync(shardID: ShardId, totalShards: TotalShards, guildSubscriptions: _guildSubscriptions).ConfigureAwait(false);
+ await ApiClient.SendIdentifyAsync(shardID: ShardId, totalShards: TotalShards, guildSubscriptions: _guildSubscriptions, gatewayIntents: _gatewayIntents).ConfigureAwait(false);
}
//Wait for READY
@@ -517,7 +519,7 @@ namespace Discord.WebSocket
_sessionId = null;
_lastSeq = 0;
- await ApiClient.SendIdentifyAsync(shardID: ShardId, totalShards: TotalShards).ConfigureAwait(false);
+ await ApiClient.SendIdentifyAsync(shardID: ShardId, totalShards: TotalShards, guildSubscriptions: _guildSubscriptions, gatewayIntents: _gatewayIntents).ConfigureAwait(false);
}
break;
case GatewayOpCode.Reconnect:
diff --git a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs
index 98ab0ef9b..4b33c770f 100644
--- a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs
+++ b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs
@@ -121,9 +121,20 @@ namespace Discord.WebSocket
///
/// Gets or sets enabling dispatching of guild subscription events e.g. presence and typing events.
+ /// This is not used if are provided.
///
public bool GuildSubscriptions { get; set; } = true;
+ ///
+ /// Gets or sets gateway intents to limit what events are sent from Discord. Allows for more granular control than the property.
+ ///
+ ///
+ /// For more information, please see
+ /// GatewayIntents
+ /// on the official Discord API documentation.
+ ///
+ public GatewayIntents? GatewayIntents { get; set; }
+
///
/// Initializes a default configuration.
///