Browse Source

Ignore message and presence updates if the guild has not synced yet

tags/1.0-rc
RogueException 9 years ago
parent
commit
67d6312a66
2 changed files with 44 additions and 1 deletions
  1. +43
    -1
      src/Discord.Net/DiscordSocketClient.cs
  2. +1
    -0
      src/Discord.Net/Entities/WebSocket/CachedGuild.cs

+ 43
- 1
src/Discord.Net/DiscordSocketClient.cs View File

@@ -963,6 +963,12 @@ namespace Discord
var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel;
if (channel != null) 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); var author = channel.GetUser(data.Author.Value.Id, true);


if (author != null) if (author != null)
@@ -991,6 +997,12 @@ namespace Discord
var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel;
if (channel != null) 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; IMessage before = null, after = null;
CachedMessage cachedMsg = channel.GetMessage(data.Id); CachedMessage cachedMsg = channel.GetMessage(data.Id);
if (cachedMsg != null) if (cachedMsg != null)
@@ -1019,11 +1031,17 @@ namespace Discord
case "MESSAGE_DELETE": case "MESSAGE_DELETE":
{ {
await _gatewayLogger.DebugAsync("Received Dispatch (MESSAGE_DELETE)").ConfigureAwait(false); await _gatewayLogger.DebugAsync("Received Dispatch (MESSAGE_DELETE)").ConfigureAwait(false);
var data = (payload as JToken).ToObject<API.Message>(_serializer); var data = (payload as JToken).ToObject<API.Message>(_serializer);
var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel;
if (channel != null) 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); var msg = channel.RemoveMessage(data.Id);
if (msg != null) if (msg != null)
await _messageDeletedEvent.InvokeAsync(data.Id, Optional.Create<IMessage>(msg)).ConfigureAwait(false); await _messageDeletedEvent.InvokeAsync(data.Id, Optional.Create<IMessage>(msg)).ConfigureAwait(false);
@@ -1045,6 +1063,12 @@ namespace Discord
var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel;
if (channel != null) 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) foreach (var id in data.Ids)
{ {
var msg = channel.RemoveMessage(id); var msg = channel.RemoveMessage(id);
@@ -1077,6 +1101,12 @@ namespace Discord
break; break;
} }


if (!guild.IsSynced)
{
await _gatewayLogger.DebugAsync("Ignored PRESENCE_UPDATE, guild is not synced yet.").ConfigureAwait(false);
return;
}

IPresence before; IPresence before;
var user = guild.GetUser(data.User.Id); var user = guild.GetUser(data.User.Id);
if (user != null) if (user != null)
@@ -1108,6 +1138,12 @@ namespace Discord
var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel;
if (channel != null) 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); var user = channel.GetUser(data.UserId, true);
if (user != null) if (user != null)
await _userIsTypingEvent.InvokeAsync(user, channel).ConfigureAwait(false); await _userIsTypingEvent.InvokeAsync(user, channel).ConfigureAwait(false);
@@ -1146,6 +1182,12 @@ namespace Discord
var guild = DataStore.GetGuild(data.GuildId.Value); var guild = DataStore.GetGuild(data.GuildId.Value);
if (guild != null) if (guild != null)
{ {
if (!guild.IsSynced)
{
await _gatewayLogger.DebugAsync("Ignored VOICE_STATE_UPDATE, guild is not synced yet.").ConfigureAwait(false);
return;
}

VoiceState before, after; VoiceState before, after;
if (data.ChannelId != null) if (data.ChannelId != null)
{ {


+ 1
- 0
src/Discord.Net/Entities/WebSocket/CachedGuild.cs View File

@@ -33,6 +33,7 @@ namespace Discord
public AudioClient AudioClient { get; private set; } public AudioClient AudioClient { get; private set; }


public bool HasAllMembers => _downloaderPromise.Task.IsCompleted; public bool HasAllMembers => _downloaderPromise.Task.IsCompleted;
public bool IsSynced => _syncPromise.Task.IsCompleted;
public Task SyncPromise => _syncPromise.Task; public Task SyncPromise => _syncPromise.Task;
public Task DownloaderPromise => _downloaderPromise.Task; public Task DownloaderPromise => _downloaderPromise.Task;




Loading…
Cancel
Save