| @@ -636,35 +636,41 @@ namespace Discord.WebSocket | |||||
| { | { | ||||
| type = "GUILD_AVAILABLE"; | type = "GUILD_AVAILABLE"; | ||||
| _lastGuildAvailableTime = Environment.TickCount; | _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 | else | ||||
| { | { | ||||
| guild = DataStore.GetGuild(data.Id); | |||||
| await _gatewayLogger.DebugAsync($"Received Dispatch (GUILD_CREATE)").ConfigureAwait(false); | |||||
| var guild = AddGuild(data, DataStore); | |||||
| if (guild != null) | 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 | else | ||||
| { | { | ||||
| await _gatewayLogger.WarningAsync($"{type} referenced an unknown guild.").ConfigureAwait(false); | |||||
| await _gatewayLogger.WarningAsync($"GUILD_CREATE referenced an unknown guild.").ConfigureAwait(false); | |||||
| return; | return; | ||||
| } | } | ||||
| var unavailableGuilds = _unavailableGuilds; | |||||
| if (unavailableGuilds != 0) | |||||
| _unavailableGuilds = unavailableGuilds - 1; | |||||
| } | } | ||||
| if (data.Unavailable != true) | |||||
| await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false); | |||||
| } | } | ||||
| break; | break; | ||||
| case "GUILD_UPDATE": | case "GUILD_UPDATE": | ||||
| @@ -736,25 +742,41 @@ namespace Discord.WebSocket | |||||
| { | { | ||||
| var data = (payload as JToken).ToObject<ExtendedGuild>(_serializer); | var data = (payload as JToken).ToObject<ExtendedGuild>(_serializer); | ||||
| if (data.Unavailable == true) | 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++; | _unavailableGuilds++; | ||||
| } | |||||
| else | |||||
| { | |||||
| await _gatewayLogger.WarningAsync($"GUILD_UNAVAILABLE referenced an unknown guild.").ConfigureAwait(false); | |||||
| return; | |||||
| } | |||||
| } | } | ||||
| else | 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; | break; | ||||