From cab41851ba563f70d0d2ed46abe9f271d1ce464f Mon Sep 17 00:00:00 2001 From: RogueException Date: Mon, 13 Mar 2017 21:33:41 -0300 Subject: [PATCH] Prevent duplicate GuildUnavailables --- src/Discord.Net.Core/Utils/Cacheable.cs | 1 - .../DiscordShardedClient.Events.cs | 1 - .../DiscordSocketClient.cs | 37 ++++++++++++++----- .../Entities/Guilds/SocketGuild.cs | 9 +++-- 4 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/Discord.Net.Core/Utils/Cacheable.cs b/src/Discord.Net.Core/Utils/Cacheable.cs index 10b61be90..f17aa8699 100644 --- a/src/Discord.Net.Core/Utils/Cacheable.cs +++ b/src/Discord.Net.Core/Utils/Cacheable.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Threading.Tasks; namespace Discord diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs index 874062c56..c52675e70 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs @@ -1,6 +1,5 @@ using System; using System.Threading.Tasks; -using Discord.Net; namespace Discord.WebSocket { diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index bdc0127c2..b7dd3729d 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -237,8 +237,8 @@ namespace Discord.WebSocket await _gatewayLogger.DebugAsync("Raising virtual GuildUnavailables").ConfigureAwait(false); foreach (var guild in State.Guilds) { - if (guild._available) - await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false); + if (guild.IsAvailable) + await GuildUnavailableAsync(guild).ConfigureAwait(false); } } @@ -477,10 +477,10 @@ namespace Discord.WebSocket { var model = data.Guilds[i]; var guild = AddGuild(model, state); - if (!guild._available || ApiClient.AuthTokenType == TokenType.User) + if (!guild.IsAvailable || ApiClient.AuthTokenType == TokenType.User) unavailableGuilds++; else - await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false); + await GuildAvailableAsync(guild).ConfigureAwait(false); } for (int i = 0; i < data.PrivateChannels.Length; i++) AddPrivateChannel(data.PrivateChannels[i], state); @@ -526,8 +526,8 @@ namespace Discord.WebSocket //Notify the client that these guilds are available again foreach (var guild in State.Guilds) { - if (guild._available) - await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false); + if (guild.IsAvailable) + await GuildAvailableAsync(guild).ConfigureAwait(false); } await _gatewayLogger.InfoAsync("Resumed previous session").ConfigureAwait(false); @@ -553,7 +553,7 @@ namespace Discord.WebSocket var unavailableGuilds = _unavailableGuilds; if (unavailableGuilds != 0) _unavailableGuilds = unavailableGuilds - 1; - await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false); + await GuildAvailableAsync(guild).ConfigureAwait(false); } else { @@ -630,7 +630,7 @@ namespace Discord.WebSocket //This is treated as an extension of GUILD_AVAILABLE _unavailableGuilds--; _lastGuildAvailableTime = Environment.TickCount; - await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false); + await GuildAvailableAsync(guild).ConfigureAwait(false); await _guildUpdatedEvent.InvokeAsync(before, guild).ConfigureAwait(false); } else @@ -651,7 +651,7 @@ namespace Discord.WebSocket var guild = State.GetGuild(data.Id); if (guild != null) { - await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false); + await GuildUnavailableAsync(guild).ConfigureAwait(false); _unavailableGuilds++; } else @@ -668,7 +668,7 @@ namespace Discord.WebSocket var guild = RemoveGuild(data.Id); if (guild != null) { - await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false); + await GuildUnavailableAsync(guild).ConfigureAwait(false); await _leftGuildEvent.InvokeAsync(guild).ConfigureAwait(false); } else @@ -1659,6 +1659,23 @@ namespace Discord.WebSocket return channel; } + private async Task GuildAvailableAsync(SocketGuild guild) + { + if (!guild.IsConnected) + { + guild.IsConnected = true; + await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false); + } + } + private async Task GuildUnavailableAsync(SocketGuild guild) + { + if (guild.IsConnected) + { + guild.IsConnected = false; + await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false); + } + } + //IDiscordClient ConnectionState IDiscordClient.ConnectionState => _connection.State; diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 007f52124..141d777b7 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -32,7 +32,6 @@ namespace Discord.WebSocket private ImmutableArray _emojis; private ImmutableArray _features; private AudioClient _audioClient; - internal bool _available; public string Name { get; private set; } public int AFKTimeout { get; private set; } @@ -40,8 +39,10 @@ namespace Discord.WebSocket public VerificationLevel VerificationLevel { get; private set; } public MfaLevel MfaLevel { get; private set; } public DefaultMessageNotifications DefaultMessageNotifications { get; private set; } - public int MemberCount { get; set; } + public int MemberCount { get; internal set; } public int DownloadedMemberCount { get; private set; } + internal bool IsAvailable { get; private set; } + public bool IsConnected { get; internal set; } internal ulong? AFKChannelId { get; private set; } internal ulong? EmbedChannelId { get; private set; } @@ -120,8 +121,8 @@ namespace Discord.WebSocket } internal void Update(ClientState state, ExtendedModel model) { - _available = !(model.Unavailable ?? false); - if (!_available) + IsAvailable = !(model.Unavailable ?? false); + if (!IsAvailable) { if (_channels == null) _channels = new ConcurrentHashSet();