@@ -15,5 +15,7 @@ namespace Discord.API.Gateway | |||||
public int LargeThreshold { get; set; } | public int LargeThreshold { get; set; } | ||||
[JsonProperty("shard")] | [JsonProperty("shard")] | ||||
public Optional<int[]> ShardingParams { get; set; } | public Optional<int[]> ShardingParams { get; set; } | ||||
[JsonProperty("guild_subscriptions")] | |||||
public Optional<bool> GuildSubscriptions { get; set; } | |||||
} | } | ||||
} | } |
@@ -215,7 +215,7 @@ namespace Discord.API | |||||
await _sentGatewayMessageEvent.InvokeAsync(opCode).ConfigureAwait(false); | await _sentGatewayMessageEvent.InvokeAsync(opCode).ConfigureAwait(false); | ||||
} | } | ||||
public async Task SendIdentifyAsync(int largeThreshold = 100, int shardID = 0, int totalShards = 1, RequestOptions options = null) | |||||
public async Task SendIdentifyAsync(int largeThreshold = 100, int shardID = 0, int totalShards = 1, bool guildSubscriptions = true, RequestOptions options = null) | |||||
{ | { | ||||
options = RequestOptions.CreateOrClone(options); | options = RequestOptions.CreateOrClone(options); | ||||
var props = new Dictionary<string, string> | var props = new Dictionary<string, string> | ||||
@@ -226,7 +226,8 @@ namespace Discord.API | |||||
{ | { | ||||
Token = AuthToken, | Token = AuthToken, | ||||
Properties = props, | Properties = props, | ||||
LargeThreshold = largeThreshold | |||||
LargeThreshold = largeThreshold, | |||||
GuildSubscriptions = guildSubscriptions | |||||
}; | }; | ||||
if (totalShards > 1) | if (totalShards > 1) | ||||
msg.ShardingParams = new int[] { shardID, totalShards }; | msg.ShardingParams = new int[] { shardID, totalShards }; | ||||
@@ -43,6 +43,7 @@ namespace Discord.WebSocket | |||||
private DateTimeOffset? _statusSince; | private DateTimeOffset? _statusSince; | ||||
private RestApplication _applicationInfo; | private RestApplication _applicationInfo; | ||||
private bool _isDisposed; | private bool _isDisposed; | ||||
private bool _guildSubscriptions; | |||||
/// <summary> | /// <summary> | ||||
/// Provides access to a REST-only client with a shared state from this client. | /// Provides access to a REST-only client with a shared state from this client. | ||||
@@ -135,6 +136,7 @@ namespace Discord.WebSocket | |||||
State = new ClientState(0, 0); | State = new ClientState(0, 0); | ||||
Rest = new DiscordSocketRestClient(config, ApiClient); | Rest = new DiscordSocketRestClient(config, ApiClient); | ||||
_heartbeatTimes = new ConcurrentQueue<long>(); | _heartbeatTimes = new ConcurrentQueue<long>(); | ||||
_guildSubscriptions = config.GuildSubscriptions; | |||||
_stateLock = new SemaphoreSlim(1, 1); | _stateLock = new SemaphoreSlim(1, 1); | ||||
_gatewayLogger = LogManager.CreateLogger(ShardId == 0 && TotalShards == 1 ? "Gateway" : $"Shard #{ShardId}"); | _gatewayLogger = LogManager.CreateLogger(ShardId == 0 && TotalShards == 1 ? "Gateway" : $"Shard #{ShardId}"); | ||||
@@ -240,7 +242,7 @@ namespace Discord.WebSocket | |||||
else | else | ||||
{ | { | ||||
await _gatewayLogger.DebugAsync("Identifying").ConfigureAwait(false); | await _gatewayLogger.DebugAsync("Identifying").ConfigureAwait(false); | ||||
await ApiClient.SendIdentifyAsync(shardID: ShardId, totalShards: TotalShards).ConfigureAwait(false); | |||||
await ApiClient.SendIdentifyAsync(shardID: ShardId, totalShards: TotalShards, guildSubscriptions: _guildSubscriptions).ConfigureAwait(false); | |||||
} | } | ||||
//Wait for READY | //Wait for READY | ||||
@@ -77,7 +77,7 @@ namespace Discord.WebSocket | |||||
/// <para> | /// <para> | ||||
/// By default, the Discord gateway will only send offline members if a guild has less than a certain number | /// By default, the Discord gateway will only send offline members if a guild has less than a certain number | ||||
/// of members (determined by <see cref="LargeThreshold"/> in this library). This behaviour is why | /// of members (determined by <see cref="LargeThreshold"/> in this library). This behaviour is why | ||||
/// sometimes a user may be missing from the WebSocket cache for collections such as | |||||
/// sometimes a user may be missing from the WebSocket cache for collections such as | |||||
/// <see cref="Discord.WebSocket.SocketGuild.Users"/>. | /// <see cref="Discord.WebSocket.SocketGuild.Users"/>. | ||||
/// </para> | /// </para> | ||||
/// <para> | /// <para> | ||||
@@ -86,7 +86,7 @@ namespace Discord.WebSocket | |||||
/// downloaded to the WebSocket cache. | /// downloaded to the WebSocket cache. | ||||
/// </para> | /// </para> | ||||
/// <para> | /// <para> | ||||
/// For more information, please see | |||||
/// For more information, please see | |||||
/// <see href="https://discordapp.com/developers/docs/topics/gateway#request-guild-members">Request Guild Members</see> | /// <see href="https://discordapp.com/developers/docs/topics/gateway#request-guild-members">Request Guild Members</see> | ||||
/// on the official Discord API documentation. | /// on the official Discord API documentation. | ||||
/// </para> | /// </para> | ||||
@@ -95,7 +95,7 @@ namespace Discord.WebSocket | |||||
/// traffic. If you are using the command system, the default user TypeReader may fail to find the user | /// traffic. If you are using the command system, the default user TypeReader may fail to find the user | ||||
/// due to this issue. This may be resolved at v3 of the library. Until then, you may want to consider | /// due to this issue. This may be resolved at v3 of the library. Until then, you may want to consider | ||||
/// overriding the TypeReader and use | /// overriding the TypeReader and use | ||||
/// <see cref="DiscordRestClient.GetUserAsync(System.UInt64,Discord.RequestOptions)"/> | |||||
/// <see cref="DiscordRestClient.GetUserAsync(System.UInt64,Discord.RequestOptions)"/> | |||||
/// or <see cref="DiscordRestClient.GetGuildUserAsync"/> | /// or <see cref="DiscordRestClient.GetGuildUserAsync"/> | ||||
/// as a backup. | /// as a backup. | ||||
/// </note> | /// </note> | ||||
@@ -120,6 +120,11 @@ namespace Discord.WebSocket | |||||
public bool? ExclusiveBulkDelete { get; set; } = null; | public bool? ExclusiveBulkDelete { get; set; } = null; | ||||
/// <summary> | /// <summary> | ||||
/// Gets or sets enabling dispatching of guild subscription events e.g. presence and typing events. | |||||
/// </summary> | |||||
public bool GuildSubscriptions { get; set; } = true; | |||||
/// <summary> | |||||
/// Initializes a default configuration. | /// Initializes a default configuration. | ||||
/// </summary> | /// </summary> | ||||
public DiscordSocketConfig() | public DiscordSocketConfig() | ||||