From 9e982ccd4a9dac22659a222e4abe9cc6f831b81e Mon Sep 17 00:00:00 2001 From: RogueException Date: Thu, 6 Oct 2016 05:37:57 -0300 Subject: [PATCH] Added IMessage.Emojis --- src/Discord.Net.Core/API/CDN.cs | 2 + .../Entities/Messages/Emoji.cs | 20 ++++++++ .../Entities/Messages/IMessage.cs | 2 + .../{RestAttachment.cs => Attachment.cs} | 8 ++-- .../Messages/{RestEmbed.cs => Embed.cs} | 8 ++-- .../Entities/Messages/MessageHelper.cs | 20 ++++++++ .../Entities/Messages/RestMessage.cs | 13 +++-- .../Entities/Messages/RestUserMessage.cs | 27 ++++++----- .../Entities/Messages/SocketMessage.cs | 18 ++++--- .../Entities/Messages/SocketUserMessage.cs | 48 +++++++++++-------- 10 files changed, 115 insertions(+), 51 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Messages/Emoji.cs rename src/Discord.Net.Rest/Entities/Messages/{RestAttachment.cs => Attachment.cs} (73%) rename src/Discord.Net.Rest/Entities/Messages/{RestEmbed.cs => Embed.cs} (75%) diff --git a/src/Discord.Net.Core/API/CDN.cs b/src/Discord.Net.Core/API/CDN.cs index d7a3f1d39..e4fcbc8c4 100644 --- a/src/Discord.Net.Core/API/CDN.cs +++ b/src/Discord.Net.Core/API/CDN.cs @@ -12,5 +12,7 @@ => splashId != null ? $"{DiscordConfig.CDNUrl}splashes/{guildId}/{splashId}.jpg" : null; public static string GetChannelIconUrl(ulong channelId, string iconId) => iconId != null ? $"{DiscordConfig.CDNUrl}channel-icons/{channelId}/{iconId}.jpg" : null; + public static string GetEmojiUrl(ulong emojiId) + => $"{DiscordConfig.CDNUrl}emojis/{emojiId}.png"; } } diff --git a/src/Discord.Net.Core/Entities/Messages/Emoji.cs b/src/Discord.Net.Core/Entities/Messages/Emoji.cs new file mode 100644 index 000000000..0fdbc69e2 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Messages/Emoji.cs @@ -0,0 +1,20 @@ +using Discord.API; + +namespace Discord +{ + public struct Emoji + { + public ulong Id { get; } + public string Name { get; } + public int Index { get; } + + public string Url => CDN.GetEmojiUrl(Id); + + internal Emoji(ulong id, string name, int index) + { + Id = id; + Name = name; + Index = index; + } + } +} diff --git a/src/Discord.Net.Core/Entities/Messages/IMessage.cs b/src/Discord.Net.Core/Entities/Messages/IMessage.cs index be83e7482..6291c1a3d 100644 --- a/src/Discord.Net.Core/Entities/Messages/IMessage.cs +++ b/src/Discord.Net.Core/Entities/Messages/IMessage.cs @@ -27,6 +27,8 @@ namespace Discord IReadOnlyCollection Attachments { get; } /// Returns a collection of all embeds included in this message. IReadOnlyCollection Embeds { get; } + /// Returns a collection of all custom emoji included in this message. + IReadOnlyCollection Emojis { get; } /// Returns a collection of channel ids mentioned in this message. IReadOnlyCollection MentionedChannelIds { get; } /// Returns a collection of roles mentioned in this message. diff --git a/src/Discord.Net.Rest/Entities/Messages/RestAttachment.cs b/src/Discord.Net.Rest/Entities/Messages/Attachment.cs similarity index 73% rename from src/Discord.Net.Rest/Entities/Messages/RestAttachment.cs rename to src/Discord.Net.Rest/Entities/Messages/Attachment.cs index 5d31558c8..e185234ac 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestAttachment.cs +++ b/src/Discord.Net.Rest/Entities/Messages/Attachment.cs @@ -4,7 +4,7 @@ using Model = Discord.API.Attachment; namespace Discord { [DebuggerDisplay(@"{DebuggerDisplay,nq}")] - public class RestAttachment : IAttachment + public class Attachment : IAttachment { public ulong Id { get; } public string Filename { get; } @@ -14,7 +14,7 @@ namespace Discord public int? Height { get; } public int? Width { get; } - internal RestAttachment(ulong id, string filename, string url, string proxyUrl, int size, int? height, int? width) + internal Attachment(ulong id, string filename, string url, string proxyUrl, int size, int? height, int? width) { Id = id; Filename = filename; @@ -24,9 +24,9 @@ namespace Discord Height = height; Width = width; } - internal static RestAttachment Create(Model model) + internal static Attachment Create(Model model) { - return new RestAttachment(model.Id, model.Filename, model.Url, model.ProxyUrl, model.Size, + return new Attachment(model.Id, model.Filename, model.Url, model.ProxyUrl, model.Size, model.Height.IsSpecified ? model.Height.Value : (int?)null, model.Width.IsSpecified ? model.Width.Value : (int?)null); } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestEmbed.cs b/src/Discord.Net.Rest/Entities/Messages/Embed.cs similarity index 75% rename from src/Discord.Net.Rest/Entities/Messages/RestEmbed.cs rename to src/Discord.Net.Rest/Entities/Messages/Embed.cs index 32856ebb6..20979534e 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestEmbed.cs +++ b/src/Discord.Net.Rest/Entities/Messages/Embed.cs @@ -4,7 +4,7 @@ using Model = Discord.API.Embed; namespace Discord { [DebuggerDisplay(@"{DebuggerDisplay,nq}")] - public class RestEmbed : IEmbed + public class Embed : IEmbed { public string Description { get; } public string Url { get; } @@ -13,7 +13,7 @@ namespace Discord public EmbedProvider? Provider { get; } public EmbedThumbnail? Thumbnail { get; } - internal RestEmbed(string type, string title, string description, string url, EmbedProvider? provider, EmbedThumbnail? thumbnail) + internal Embed(string type, string title, string description, string url, EmbedProvider? provider, EmbedThumbnail? thumbnail) { Type = type; Title = title; @@ -22,9 +22,9 @@ namespace Discord Provider = provider; Thumbnail = thumbnail; } - internal static RestEmbed Create(Model model) + internal static Embed Create(Model model) { - return new RestEmbed(model.Type, model.Title, model.Description, model.Url, + return new Embed(model.Type, model.Title, model.Description, model.Url, model.Provider.IsSpecified ? EmbedProvider.Create(model.Provider.Value) : (EmbedProvider?)null, model.Thumbnail.IsSpecified ? EmbedThumbnail.Create(model.Thumbnail.Value) : (EmbedThumbnail?)null); } diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index 6918dfb27..085f73741 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -1,11 +1,18 @@ using Discord.API.Rest; using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Globalization; +using System.Linq; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace Discord.Rest { internal static class MessageHelper { + private static readonly Regex _emojiRegex = new Regex(@"<:(.+?):(\d+?)>", RegexOptions.Compiled); + public static async Task ModifyAsync(IMessage msg, BaseDiscordClient client, Action func, RequestOptions options) { @@ -29,5 +36,18 @@ namespace Discord.Rest { await client.ApiClient.RemovePinAsync(msg.ChannelId, msg.Id, options); } + + public static ImmutableArray GetEmojis(string text) + { + var matches = _emojiRegex.Matches(text); + var builder = ImmutableArray.CreateBuilder(matches.Count); + foreach (var match in matches.OfType()) + { + ulong id; + if (ulong.TryParse(match.Groups[2].Value, NumberStyles.None, CultureInfo.InvariantCulture, out id)) + builder.Add(new Emoji(id, match.Groups[1].Value, match.Index)); + } + return builder.ToImmutable(); + } } } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index 7b48cf771..3ef933afb 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -19,11 +19,12 @@ namespace Discord.Rest public virtual bool IsPinned => false; public virtual bool IsWebhook => false; public virtual DateTimeOffset? EditedTimestamp => null; - public virtual IReadOnlyCollection Attachments => ImmutableArray.Create(); - public virtual IReadOnlyCollection Embeds => ImmutableArray.Create(); + public virtual IReadOnlyCollection Attachments => ImmutableArray.Create(); + public virtual IReadOnlyCollection Embeds => ImmutableArray.Create(); + public virtual IReadOnlyCollection Emojis => ImmutableArray.Create(); public virtual IReadOnlyCollection MentionedChannelIds => ImmutableArray.Create(); - public virtual IReadOnlyCollection MentionedRoles => ImmutableArray.Create(); - public virtual IReadOnlyCollection MentionedUsers => ImmutableArray.Create(); + public virtual IReadOnlyCollection MentionedRoles => ImmutableArray.Create(); + public virtual IReadOnlyCollection MentionedUsers => ImmutableArray.Create(); public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks); @@ -57,5 +58,9 @@ namespace Discord.Rest public override string ToString() => Content; MessageType IMessage.Type => MessageType.Default; + IReadOnlyCollection IMessage.Attachments => Attachments; + IReadOnlyCollection IMessage.Embeds => Embeds; + IReadOnlyCollection IMessage.MentionedRoles => MentionedRoles; + IReadOnlyCollection IMessage.MentionedUsers => MentionedUsers; } } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs index b28b321bf..88855f33c 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs @@ -13,8 +13,9 @@ namespace Discord.Rest { private bool _isMentioningEveryone, _isTTS, _isPinned; private long? _editedTimestampTicks; - private ImmutableArray _attachments; - private ImmutableArray _embeds; + private ImmutableArray _attachments; + private ImmutableArray _embeds; + private ImmutableArray _emojis; private ImmutableArray _mentionedChannelIds; private ImmutableArray _mentionedRoles; private ImmutableArray _mentionedUsers; @@ -25,11 +26,12 @@ namespace Discord.Rest public override bool IsPinned => _isPinned; public override bool IsWebhook => WebhookId != null; public override DateTimeOffset? EditedTimestamp => DateTimeUtils.FromTicks(_editedTimestampTicks); - public override IReadOnlyCollection Attachments => _attachments; - public override IReadOnlyCollection Embeds => _embeds; + public override IReadOnlyCollection Attachments => _attachments; + public override IReadOnlyCollection Embeds => _embeds; + public override IReadOnlyCollection Emojis => _emojis; public override IReadOnlyCollection MentionedChannelIds => _mentionedChannelIds; - public override IReadOnlyCollection MentionedRoles => _mentionedRoles; - public override IReadOnlyCollection MentionedUsers => _mentionedUsers; + public override IReadOnlyCollection MentionedRoles => _mentionedRoles; + public override IReadOnlyCollection MentionedUsers => _mentionedUsers; internal RestUserMessage(BaseDiscordClient discord, ulong id, ulong channelId) : base(discord, id, channelId) @@ -62,13 +64,13 @@ namespace Discord.Rest var value = model.Attachments.Value; if (value.Length > 0) { - var attachments = ImmutableArray.CreateBuilder(value.Length); + var attachments = ImmutableArray.CreateBuilder(value.Length); for (int i = 0; i < value.Length; i++) - attachments.Add(RestAttachment.Create(value[i])); + attachments.Add(Attachment.Create(value[i])); _attachments = attachments.ToImmutable(); } else - _attachments = ImmutableArray.Create(); + _attachments = ImmutableArray.Create(); } if (model.Embeds.IsSpecified) @@ -76,13 +78,13 @@ namespace Discord.Rest var value = model.Embeds.Value; if (value.Length > 0) { - var embeds = ImmutableArray.CreateBuilder(value.Length); + var embeds = ImmutableArray.CreateBuilder(value.Length); for (int i = 0; i < value.Length; i++) - embeds.Add(RestEmbed.Create(value[i])); + embeds.Add(Embed.Create(value[i])); _embeds = embeds.ToImmutable(); } else - _embeds = ImmutableArray.Create(); + _embeds = ImmutableArray.Create(); } ImmutableArray mentions = ImmutableArray.Create(); @@ -105,6 +107,7 @@ namespace Discord.Rest _mentionedUsers = MentionUtils.GetUserMentions(text, null, mentions); _mentionedChannelIds = MentionUtils.GetChannelMentions(text, null); _mentionedRoles = MentionUtils.GetRoleMentions(text, null); + _emojis = MessageHelper.GetEmojis(text); model.Content = text; } } diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index a4418a2e8..9badd0e48 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Linq; using Model = Discord.API.Message; namespace Discord.WebSocket @@ -19,11 +20,12 @@ namespace Discord.WebSocket public virtual bool IsWebhook => false; public virtual DateTimeOffset? EditedTimestamp => null; - public virtual IReadOnlyCollection Attachments => ImmutableArray.Create(); - public virtual IReadOnlyCollection Embeds => ImmutableArray.Create(); - public virtual IReadOnlyCollection MentionedChannelIds => ImmutableArray.Create(); - public virtual IReadOnlyCollection MentionedRoles => ImmutableArray.Create(); - public virtual IReadOnlyCollection MentionedUsers => ImmutableArray.Create(); + public virtual IReadOnlyCollection Attachments => ImmutableArray.Create(); + public virtual IReadOnlyCollection Embeds => ImmutableArray.Create(); + public virtual IReadOnlyCollection Emojis => ImmutableArray.Create(); + public virtual IReadOnlyCollection MentionedChannels => ImmutableArray.Create(); + public virtual IReadOnlyCollection MentionedRoles => ImmutableArray.Create(); + public virtual IReadOnlyCollection MentionedUsers => ImmutableArray.Create(); public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks); @@ -55,7 +57,11 @@ namespace Discord.WebSocket //IMessage IUser IMessage.Author => Author; MessageType IMessage.Type => MessageType.Default; - + IReadOnlyCollection IMessage.Attachments => Attachments; + IReadOnlyCollection IMessage.Embeds => Embeds; + IReadOnlyCollection IMessage.MentionedChannelIds => MentionedChannels.Select(x => x.Id).ToImmutableArray(); + IReadOnlyCollection IMessage.MentionedRoles => MentionedRoles; + IReadOnlyCollection IMessage.MentionedUsers => MentionedUsers; ulong IMessage.ChannelId => Channel.Id; } } diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs index cb88f0430..8a5b9e34c 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; +using System.Linq; using System.Threading.Tasks; using Model = Discord.API.Message; @@ -14,11 +15,12 @@ namespace Discord.WebSocket { private bool _isMentioningEveryone, _isTTS, _isPinned; private long? _editedTimestampTicks; - private ImmutableArray _attachments; - private ImmutableArray _embeds; - private ImmutableArray _mentionedChannelIds; - private ImmutableArray _mentionedRoles; - private ImmutableArray _mentionedUsers; + private ImmutableArray _attachments; + private ImmutableArray _embeds; + private ImmutableArray _emojis; + private ImmutableArray _mentionedChannels; + private ImmutableArray _mentionedRoles; + private ImmutableArray _mentionedUsers; public ulong? WebhookId { get; private set; } @@ -27,11 +29,12 @@ namespace Discord.WebSocket public override bool IsWebhook => WebhookId != null; public override DateTimeOffset? EditedTimestamp => DateTimeUtils.FromTicks(_editedTimestampTicks); - public override IReadOnlyCollection Attachments => _attachments; - public override IReadOnlyCollection Embeds => _embeds; - public override IReadOnlyCollection MentionedChannelIds => _mentionedChannelIds; - public override IReadOnlyCollection MentionedRoles => _mentionedRoles; - public override IReadOnlyCollection MentionedUsers => _mentionedUsers; + public override IReadOnlyCollection Attachments => _attachments; + public override IReadOnlyCollection Embeds => _embeds; + public override IReadOnlyCollection Emojis => _emojis; + public override IReadOnlyCollection MentionedChannels => _mentionedChannels; + public override IReadOnlyCollection MentionedRoles => _mentionedRoles; + public override IReadOnlyCollection MentionedUsers => _mentionedUsers; internal SocketUserMessage(DiscordSocketClient discord, ulong id, ISocketMessageChannel channel, SocketUser author) : base(discord, id, channel, author) @@ -64,13 +67,13 @@ namespace Discord.WebSocket var value = model.Attachments.Value; if (value.Length > 0) { - var attachments = ImmutableArray.CreateBuilder(value.Length); + var attachments = ImmutableArray.CreateBuilder(value.Length); for (int i = 0; i < value.Length; i++) - attachments.Add(RestAttachment.Create(value[i])); + attachments.Add(Attachment.Create(value[i])); _attachments = attachments.ToImmutable(); } else - _attachments = ImmutableArray.Create(); + _attachments = ImmutableArray.Create(); } if (model.Embeds.IsSpecified) @@ -78,24 +81,24 @@ namespace Discord.WebSocket var value = model.Embeds.Value; if (value.Length > 0) { - var embeds = ImmutableArray.CreateBuilder(value.Length); + var embeds = ImmutableArray.CreateBuilder(value.Length); for (int i = 0; i < value.Length; i++) - embeds.Add(RestEmbed.Create(value[i])); + embeds.Add(Embed.Create(value[i])); _embeds = embeds.ToImmutable(); } else - _embeds = ImmutableArray.Create(); + _embeds = ImmutableArray.Create(); } - ImmutableArray mentions = ImmutableArray.Create(); + ImmutableArray mentions = ImmutableArray.Create(); if (model.Mentions.IsSpecified) { var value = model.Mentions.Value; if (value.Length > 0) { - var newMentions = ImmutableArray.CreateBuilder(value.Length); + var newMentions = ImmutableArray.CreateBuilder(value.Length); for (int i = 0; i < value.Length; i++) - newMentions.Add(RestUser.Create(Discord, value[i])); + newMentions.Add(SocketSimpleUser.Create(Discord, Discord.State, value[i])); mentions = newMentions.ToImmutable(); } } @@ -106,8 +109,11 @@ namespace Discord.WebSocket var guild = (Channel as SocketGuildChannel)?.Guild; _mentionedUsers = MentionUtils.GetUserMentions(text, Channel, mentions); - _mentionedChannelIds = MentionUtils.GetChannelMentions(text, guild); - _mentionedRoles = MentionUtils.GetRoleMentions(text, guild); + _mentionedChannels = MentionUtils.GetChannelMentions(text, guild) + .Select(x => guild?.GetChannel(x)) + .Where(x => x != null).ToImmutableArray(); + _mentionedRoles = MentionUtils.GetRoleMentions(text, guild); + _emojis = MessageHelper.GetEmojis(text); model.Content = text; } }