diff --git a/src/Discord.Net/Models/Emotes/AttachedGuildEmote.cs b/src/Discord.Net/Models/Emotes/AttachedGuildEmote.cs index c2da51b8b..fc106578b 100644 --- a/src/Discord.Net/Models/Emotes/AttachedGuildEmote.cs +++ b/src/Discord.Net/Models/Emotes/AttachedGuildEmote.cs @@ -30,7 +30,7 @@ namespace Discord public IGuild Guild { get; set; } // IMentionable - public string Mention => throw new System.NotImplementedException(); + public string Mention => EmoteUtilities.FormatGuildEmote(Id, Name); public Task DeleteAsync() => Discord.Rest.DeleteGuildEmojiAsync(Guild.Id, Id); diff --git a/src/Discord.Net/Models/Emotes/Emote.cs b/src/Discord.Net/Models/Emotes/Emote.cs index 80bf8ce63..61575408b 100644 --- a/src/Discord.Net/Models/Emotes/Emote.cs +++ b/src/Discord.Net/Models/Emotes/Emote.cs @@ -13,6 +13,6 @@ namespace Discord public ulong Id { get; set; } public string Name { get; set; } - public string Mention => throw new System.NotImplementedException(); // TODO: EmojiUtils + public string Mention => EmoteUtilities.FormatGuildEmote(Id, Name); } } diff --git a/src/Discord.Net/Utilities/EmoteUtilities.cs b/src/Discord.Net/Utilities/EmoteUtilities.cs new file mode 100644 index 000000000..20819dc69 --- /dev/null +++ b/src/Discord.Net/Utilities/EmoteUtilities.cs @@ -0,0 +1,27 @@ +using System; + +namespace Discord +{ + public static class EmoteUtilities + { + public static string FormatGuildEmote(ulong id, string name) + => $"<:{name}:{id}>"; + + public static (ulong, string) ParseGuildEmote(string formatted) + { + if (formatted.IndexOf('<') != 0 || formatted.IndexOf(':') != 1 || formatted.IndexOf('>') != formatted.Length-1) + throw new ArgumentException("passed string does not match a guild emote format", nameof(formatted)); // TODO: grammar + + int closingIndex = formatted.IndexOf(':', 2); + if (closingIndex < 0) + throw new ArgumentException("passed string does not match a guild emote format", nameof(formatted)); + + string name = formatted.Substring(2, closingIndex-2); + string idStr = formatted.Substring(closingIndex + 1); + idStr = idStr.Substring(0, idStr.Length - 1); // ignore closing > + ulong id = ulong.Parse(idStr); // TODO: TryParse here? + + return (id, name); + } + } +} diff --git a/test/Discord.Tests.Unit/Utilities/EmoteTests.cs b/test/Discord.Tests.Unit/Utilities/EmoteTests.cs new file mode 100644 index 000000000..0d4527e66 --- /dev/null +++ b/test/Discord.Tests.Unit/Utilities/EmoteTests.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; + +namespace Discord.Tests.Unit +{ + public class EmoteTests + { + [Fact] + public void Parse() + { + string input = "<:gopher:243902586946715658>"; + var (resultId, resultName) = EmoteUtilities.ParseGuildEmote(input); + Assert.Equal(243902586946715658UL, resultId); + Assert.Equal("gopher", resultName); + + Assert.Throws(() => EmoteUtilities.ParseGuildEmote("foo")); + Assert.Throws(() => EmoteUtilities.ParseGuildEmote("(() => EmoteUtilities.ParseGuildEmote("<:foo")); + Assert.Throws(() => EmoteUtilities.ParseGuildEmote("<:foo>")); + } + + [Fact] + public void Format() + { + string result = EmoteUtilities.FormatGuildEmote(243902586946715658, "gopher"); + Assert.Equal("<:gopher:243902586946715658>", result); + } + } +}