From 983b50120daa5d9d472e889b2df8e42c9ef69d18 Mon Sep 17 00:00:00 2001 From: Christopher F Date: Fri, 11 Nov 2016 16:28:07 -0500 Subject: [PATCH] Support "MESSAGE_REACTION_REMOVE_ALL" dispatch --- .../API/Gateway/RemoveAllReactionsEvent.cs | 12 ++++++++ .../DiscordSocketClient.Events.cs | 6 ++++ .../DiscordSocketClient.cs | 29 +++++++++++++++++-- .../Entities/Messages/SocketUserMessage.cs | 4 +++ 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 src/Discord.Net.WebSocket/API/Gateway/RemoveAllReactionsEvent.cs diff --git a/src/Discord.Net.WebSocket/API/Gateway/RemoveAllReactionsEvent.cs b/src/Discord.Net.WebSocket/API/Gateway/RemoveAllReactionsEvent.cs new file mode 100644 index 000000000..944a6e7c9 --- /dev/null +++ b/src/Discord.Net.WebSocket/API/Gateway/RemoveAllReactionsEvent.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; + +namespace Discord.API.Gateway +{ + public class RemoveAllReactionsEvent + { + [JsonProperty("channel_id")] + public ulong ChannelId { get; set; } + [JsonProperty("message_id")] + public ulong MessageId { get; set; } + } +} diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs index 4454e619f..a150a6d15 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs @@ -83,6 +83,12 @@ namespace Discord.WebSocket remove { _reactionRemovedEvent.Remove(value); } } private readonly AsyncEvent, SocketReaction, Task>> _reactionRemovedEvent = new AsyncEvent, SocketReaction, Task>>(); + public event Func, Task> ReactionsCleared + { + add { _reactionsClearedEvent.Add(value); } + remove { _reactionsClearedEvent.Remove(value); } + } + private readonly AsyncEvent, Task>> _reactionsClearedEvent = new AsyncEvent, Task>>(); //Roles public event Func RoleCreated diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 238cdbcb1..ebe7c6835 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1306,7 +1306,7 @@ namespace Discord.WebSocket break; case "MESSAGE_REACTION_ADD": { - await _gatewayLogger.DebugAsync("Received Disbatch (MESSAGE_REACTION_ADD)").ConfigureAwait(false); + await _gatewayLogger.DebugAsync("Received Dispatch (MESSAGE_REACTION_ADD)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); var channel = State.GetChannel(data.ChannelId) as ISocketMessageChannel; @@ -1333,7 +1333,7 @@ namespace Discord.WebSocket } case "MESSAGE_REACTION_REMOVE": { - await _gatewayLogger.DebugAsync("Received Disbatch (MESSAGE_REACTION_REMOVE)").ConfigureAwait(false); + await _gatewayLogger.DebugAsync("Received Dispatch (MESSAGE_REACTION_REMOVE)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); var channel = State.GetChannel(data.ChannelId) as ISocketMessageChannel; @@ -1355,6 +1355,31 @@ namespace Discord.WebSocket await _gatewayLogger.WarningAsync("MESSAGE_REACTION_REMOVE referenced an unknown channel.").ConfigureAwait(false); return; } + break; + } + case "MESSAGE_REACTION_REMOVE_ALL": + { + await _gatewayLogger.DebugAsync("Received Dispatch (MESSAGE_REACTION_REMOVE_ALL)").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + var channel = State.GetChannel(data.ChannelId) as ISocketMessageChannel; + if (channel != null) + { + SocketUserMessage cachedMsg = channel.GetCachedMessage(data.MessageId) as SocketUserMessage; + if (cachedMsg != null) + { + cachedMsg.ClearReactions(); + await _reactionsClearedEvent.InvokeAsync(data.MessageId, cachedMsg).ConfigureAwait(false); + return; + } + await _reactionsClearedEvent.InvokeAsync(data.MessageId, Optional.Create()); + } + else + { + await _gatewayLogger.WarningAsync("MESSAGE_REACTION_REMOVE_ALL referenced an unknown channel.").ConfigureAwait(false); + return; + } + break; } case "MESSAGE_DELETE_BULK": diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs index 43e61f670..cd65f4513 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs @@ -122,6 +122,10 @@ namespace Discord.WebSocket if (_reactions.Contains(reaction)) _reactions.Remove(reaction); } + internal void ClearReactions() + { + _reactions.Clear(); + } public Task ModifyAsync(Action func, RequestOptions options = null) => MessageHelper.ModifyAsync(this, Discord, func, options);