diff --git a/src/Discord.Net/WebSocket/DiscordSocketClient.cs b/src/Discord.Net/WebSocket/DiscordSocketClient.cs index 0d4dc8f23..429928d67 100644 --- a/src/Discord.Net/WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net/WebSocket/DiscordSocketClient.cs @@ -636,35 +636,41 @@ namespace Discord.WebSocket { type = "GUILD_AVAILABLE"; _lastGuildAvailableTime = Environment.TickCount; - } - await _gatewayLogger.DebugAsync($"Received Dispatch ({type})").ConfigureAwait(false); + await _gatewayLogger.DebugAsync($"Received Dispatch (GUILD_AVAILABLE)").ConfigureAwait(false); - SocketGuild guild; - if (data.Unavailable != false) - { - guild = AddGuild(data, DataStore); - if (ApiClient.AuthTokenType == TokenType.User) - await SyncGuildsAsync().ConfigureAwait(false); - await _joinedGuildEvent.InvokeAsync(guild).ConfigureAwait(false); + var guild = DataStore.GetGuild(data.Id); + if (guild != null) + { + guild.Update(data, UpdateSource.WebSocket, DataStore); + + var unavailableGuilds = _unavailableGuilds; + if (unavailableGuilds != 0) + _unavailableGuilds = unavailableGuilds - 1; + await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false); + } + else + { + await _gatewayLogger.WarningAsync($"GUILD_AVAILABLE referenced an unknown guild.").ConfigureAwait(false); + return; + } } else { - guild = DataStore.GetGuild(data.Id); + await _gatewayLogger.DebugAsync($"Received Dispatch (GUILD_CREATE)").ConfigureAwait(false); + + var guild = AddGuild(data, DataStore); if (guild != null) - guild.Update(data, UpdateSource.WebSocket, DataStore); + { + if (ApiClient.AuthTokenType == TokenType.User) + await SyncGuildsAsync().ConfigureAwait(false); + await _joinedGuildEvent.InvokeAsync(guild).ConfigureAwait(false); + } else { - await _gatewayLogger.WarningAsync($"{type} referenced an unknown guild.").ConfigureAwait(false); + await _gatewayLogger.WarningAsync($"GUILD_CREATE referenced an unknown guild.").ConfigureAwait(false); return; } - - var unavailableGuilds = _unavailableGuilds; - if (unavailableGuilds != 0) - _unavailableGuilds = unavailableGuilds - 1; } - - if (data.Unavailable != true) - await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false); } break; case "GUILD_UPDATE": @@ -736,25 +742,41 @@ namespace Discord.WebSocket { var data = (payload as JToken).ToObject(_serializer); if (data.Unavailable == true) - type = "GUILD_UNAVAILABLE"; - await _gatewayLogger.DebugAsync($"Received Dispatch ({type})").ConfigureAwait(false); - - var guild = RemoveGuild(data.Id); - if (guild != null) { - foreach (var member in guild.Members) - member.User.RemoveRef(this); + type = "GUILD_UNAVAILABLE"; + await _gatewayLogger.DebugAsync($"Received Dispatch (GUILD_UNAVAILABLE)").ConfigureAwait(false); - await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false); - if (data.Unavailable != true) - await _leftGuildEvent.InvokeAsync(guild).ConfigureAwait(false); - else + var guild = DataStore.GetGuild(data.Id); + if (guild != null) + { + foreach (var member in guild.Members) + member.User.RemoveRef(this); + await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false); _unavailableGuilds++; + } + else + { + await _gatewayLogger.WarningAsync($"GUILD_UNAVAILABLE referenced an unknown guild.").ConfigureAwait(false); + return; + } } else { - await _gatewayLogger.WarningAsync($"{type} referenced an unknown guild.").ConfigureAwait(false); - return; + await _gatewayLogger.DebugAsync($"Received Dispatch (GUILD_CREATE)").ConfigureAwait(false); + + var guild = DataStore.GetGuild(data.Id); + if (guild != null) + { + foreach (var member in guild.Members) + member.User.RemoveRef(this); + await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false); + await _leftGuildEvent.InvokeAsync(guild).ConfigureAwait(false); + } + else + { + await _gatewayLogger.WarningAsync($"GUILD_CREATE referenced an unknown guild.").ConfigureAwait(false); + return; + } } } break;