From 67d6312a6698e5f79f80756fa2fb9c235529793f Mon Sep 17 00:00:00 2001 From: RogueException Date: Thu, 14 Jul 2016 14:33:53 -0300 Subject: [PATCH] Ignore message and presence updates if the guild has not synced yet --- src/Discord.Net/DiscordSocketClient.cs | 44 ++++++++++++++++++- .../Entities/WebSocket/CachedGuild.cs | 1 + 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net/DiscordSocketClient.cs b/src/Discord.Net/DiscordSocketClient.cs index cba5f286b..cec7bdf59 100644 --- a/src/Discord.Net/DiscordSocketClient.cs +++ b/src/Discord.Net/DiscordSocketClient.cs @@ -963,6 +963,12 @@ namespace Discord var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; if (channel != null) { + if (!(channel as ICachedGuildChannel)?.Guild.IsSynced ?? true) + { + await _gatewayLogger.DebugAsync("Ignored MESSAGE_CREATE, guild is not synced yet.").ConfigureAwait(false); + return; + } + var author = channel.GetUser(data.Author.Value.Id, true); if (author != null) @@ -991,6 +997,12 @@ namespace Discord var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; if (channel != null) { + if (!(channel as ICachedGuildChannel)?.Guild.IsSynced ?? true) + { + await _gatewayLogger.DebugAsync("Ignored MESSAGE_UPDATE, guild is not synced yet.").ConfigureAwait(false); + return; + } + IMessage before = null, after = null; CachedMessage cachedMsg = channel.GetMessage(data.Id); if (cachedMsg != null) @@ -1019,11 +1031,17 @@ namespace Discord case "MESSAGE_DELETE": { await _gatewayLogger.DebugAsync("Received Dispatch (MESSAGE_DELETE)").ConfigureAwait(false); - + var data = (payload as JToken).ToObject(_serializer); var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; if (channel != null) { + if (!(channel as ICachedGuildChannel)?.Guild.IsSynced ?? true) + { + await _gatewayLogger.DebugAsync("Ignored MESSAGE_DELETE, guild is not synced yet.").ConfigureAwait(false); + return; + } + var msg = channel.RemoveMessage(data.Id); if (msg != null) await _messageDeletedEvent.InvokeAsync(data.Id, Optional.Create(msg)).ConfigureAwait(false); @@ -1045,6 +1063,12 @@ namespace Discord var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; if (channel != null) { + if (!(channel as ICachedGuildChannel)?.Guild.IsSynced ?? true) + { + await _gatewayLogger.DebugAsync("Ignored MESSAGE_DELETE_BULK, guild is not synced yet.").ConfigureAwait(false); + return; + } + foreach (var id in data.Ids) { var msg = channel.RemoveMessage(id); @@ -1077,6 +1101,12 @@ namespace Discord break; } + if (!guild.IsSynced) + { + await _gatewayLogger.DebugAsync("Ignored PRESENCE_UPDATE, guild is not synced yet.").ConfigureAwait(false); + return; + } + IPresence before; var user = guild.GetUser(data.User.Id); if (user != null) @@ -1108,6 +1138,12 @@ namespace Discord var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; if (channel != null) { + if (!(channel as ICachedGuildChannel)?.Guild.IsSynced ?? true) + { + await _gatewayLogger.DebugAsync("Ignored TYPING_START, guild is not synced yet.").ConfigureAwait(false); + return; + } + var user = channel.GetUser(data.UserId, true); if (user != null) await _userIsTypingEvent.InvokeAsync(user, channel).ConfigureAwait(false); @@ -1146,6 +1182,12 @@ namespace Discord var guild = DataStore.GetGuild(data.GuildId.Value); if (guild != null) { + if (!guild.IsSynced) + { + await _gatewayLogger.DebugAsync("Ignored VOICE_STATE_UPDATE, guild is not synced yet.").ConfigureAwait(false); + return; + } + VoiceState before, after; if (data.ChannelId != null) { diff --git a/src/Discord.Net/Entities/WebSocket/CachedGuild.cs b/src/Discord.Net/Entities/WebSocket/CachedGuild.cs index 95a549610..b71f076b7 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedGuild.cs +++ b/src/Discord.Net/Entities/WebSocket/CachedGuild.cs @@ -33,6 +33,7 @@ namespace Discord public AudioClient AudioClient { get; private set; } public bool HasAllMembers => _downloaderPromise.Task.IsCompleted; + public bool IsSynced => _syncPromise.Task.IsCompleted; public Task SyncPromise => _syncPromise.Task; public Task DownloaderPromise => _downloaderPromise.Task;