From 5a44b0c688bd627093f8941dca3838d45264c477 Mon Sep 17 00:00:00 2001 From: Chris Johnston Date: Sun, 1 Sep 2019 21:59:57 -0700 Subject: [PATCH] Move WS reaction implementation to SocketReactionMessage Copies the reaction implementation from SocketUserMessage into SocketReactionMessage. Updates SocketSystemMessage and SocketUserMessage to use SocketReactionMessage as the base class. --- .../Messages/SocketReactionMessage.cs | 55 +++++++++++++++++++ .../Entities/Messages/SocketSystemMessage.cs | 2 +- .../Entities/Messages/SocketUserMessage.cs | 36 +----------- 3 files changed, 58 insertions(+), 35 deletions(-) create mode 100644 src/Discord.Net.WebSocket/Entities/Messages/SocketReactionMessage.cs diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketReactionMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketReactionMessage.cs new file mode 100644 index 000000000..689818fae --- /dev/null +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketReactionMessage.cs @@ -0,0 +1,55 @@ +using Discord.Rest; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; + +namespace Discord.WebSocket +{ + /// + /// Represents a WebSocket-based message that reactions can be added to. + /// + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] + public abstract class SocketReactionMessage : SocketMessage, IReactionMessage + { + private readonly List _reactions = new List(); + + internal SocketReactionMessage(DiscordSocketClient discord, ulong id, ISocketMessageChannel channel, SocketUser author, MessageSource source) + : base(discord, id, channel, author, source) + { + } + + /// + public IReadOnlyDictionary Reactions => _reactions.GroupBy(r => r.Emote).ToDictionary(x => x.Key, x => new ReactionMetadata { ReactionCount = x.Count(), IsMe = x.Any(y => y.UserId == Discord.CurrentUser.Id) }); + + internal void AddReaction(SocketReaction reaction) + { + _reactions.Add(reaction); + } + internal void RemoveReaction(SocketReaction reaction) + { + if (_reactions.Contains(reaction)) + _reactions.Remove(reaction); + } + internal void ClearReactions() + { + _reactions.Clear(); + } + + /// + public Task AddReactionAsync(IEmote emote, RequestOptions options = null) + => MessageHelper.AddReactionAsync(this, emote, Discord, options); + /// + public Task RemoveReactionAsync(IEmote emote, IUser user, RequestOptions options = null) + => MessageHelper.RemoveReactionAsync(this, user.Id, emote, Discord, options); + /// + public Task RemoveReactionAsync(IEmote emote, ulong userId, RequestOptions options = null) + => MessageHelper.RemoveReactionAsync(this, userId, emote, Discord, options); + /// + public Task RemoveAllReactionsAsync(RequestOptions options = null) + => MessageHelper.RemoveAllReactionsAsync(this, Discord, options); + /// + public IAsyncEnumerable> GetReactionUsersAsync(IEmote emote, int limit, RequestOptions options = null) + => MessageHelper.GetReactionUsersAsync(this, emote, limit, Discord, options); + } +} diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketSystemMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketSystemMessage.cs index d0ce5025b..a2bcec3b8 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketSystemMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketSystemMessage.cs @@ -7,7 +7,7 @@ namespace Discord.WebSocket /// Represents a WebSocket-based message sent by the system. /// [DebuggerDisplay(@"{DebuggerDisplay,nq}")] - public class SocketSystemMessage : SocketMessage, ISystemMessage + public class SocketSystemMessage : SocketReactionMessage, ISystemMessage { /// public MessageType Type { get; private set; } diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs index 948e4576e..544cebbf4 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs @@ -13,9 +13,8 @@ namespace Discord.WebSocket /// Represents a WebSocket-based message sent by a user. /// [DebuggerDisplay(@"{DebuggerDisplay,nq}")] - public class SocketUserMessage : SocketMessage, IUserMessage + public class SocketUserMessage : SocketReactionMessage, IUserMessage { - private readonly List _reactions = new List(); private bool _isMentioningEveryone, _isTTS, _isPinned, _isSuppressed; private long? _editedTimestampTicks; private ImmutableArray _attachments = ImmutableArray.Create(); @@ -42,8 +41,6 @@ namespace Discord.WebSocket public override IReadOnlyCollection MentionedRoles => MessageHelper.FilterTagsByValue(TagType.RoleMention, _tags); /// public override IReadOnlyCollection MentionedUsers => MessageHelper.FilterTagsByValue(TagType.UserMention, _tags); - /// - public IReadOnlyDictionary Reactions => _reactions.GroupBy(r => r.Emote).ToDictionary(x => x.Key, x => new ReactionMetadata { ReactionCount = x.Count(), IsMe = x.Any(y => y.UserId == Discord.CurrentUser.Id) }); internal SocketUserMessage(DiscordSocketClient discord, ulong id, ISocketMessageChannel channel, SocketUser author, MessageSource source) : base(discord, id, channel, author, source) @@ -126,42 +123,13 @@ namespace Discord.WebSocket model.Content = text; } } - internal void AddReaction(SocketReaction reaction) - { - _reactions.Add(reaction); - } - internal void RemoveReaction(SocketReaction reaction) - { - if (_reactions.Contains(reaction)) - _reactions.Remove(reaction); - } - internal void ClearReactions() - { - _reactions.Clear(); - } - + /// /// Only the author of a message may modify the message. /// Message content is too long, length must be less or equal to . public Task ModifyAsync(Action func, RequestOptions options = null) => MessageHelper.ModifyAsync(this, Discord, func, options); - /// - public Task AddReactionAsync(IEmote emote, RequestOptions options = null) - => MessageHelper.AddReactionAsync(this, emote, Discord, options); - /// - public Task RemoveReactionAsync(IEmote emote, IUser user, RequestOptions options = null) - => MessageHelper.RemoveReactionAsync(this, user.Id, emote, Discord, options); - /// - public Task RemoveReactionAsync(IEmote emote, ulong userId, RequestOptions options = null) - => MessageHelper.RemoveReactionAsync(this, userId, emote, Discord, options); - /// - public Task RemoveAllReactionsAsync(RequestOptions options = null) - => MessageHelper.RemoveAllReactionsAsync(this, Discord, options); - /// - public IAsyncEnumerable> GetReactionUsersAsync(IEmote emote, int limit, RequestOptions options = null) - => MessageHelper.GetReactionUsersAsync(this, emote, limit, Discord, options); - /// public Task PinAsync(RequestOptions options = null) => MessageHelper.PinAsync(this, Discord, options);