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);