| @@ -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<ExtendedGuild>(_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; | |||