Skip to content

Commit 76c72b8

Browse files
Check if referenced message contains an emote when fetching images for image effect commands
1 parent 4596b29 commit 76c72b8

File tree

7 files changed

+74
-71
lines changed

7 files changed

+74
-71
lines changed

src/Kattbot.Common/Models/Emotes/TempEmote.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ public class TempEmote
77
public string Name { get; set; } = null!;
88

99
public bool Animated { get; set; }
10+
11+
public string ImageUrl { get; set; } = null!;
1012
}

src/Kattbot/Helpers/DiscordExtensions.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
using System;
2-
using System.Diagnostics;
32
using System.Linq;
43
using System.Threading;
54
using System.Threading.Tasks;
65
using DSharpPlus.Entities;
6+
using Kattbot.Common.Models.Emotes;
77
using Microsoft.Extensions.Logging;
88

99
namespace Kattbot.Helpers;
@@ -109,6 +109,17 @@ public static string SubstituteMentions(this DiscordMessage message)
109109
referencedMessage.Id);
110110
return imageUrl;
111111
}
112+
113+
TempEmote? singleEmojiParsedFromMessage = EmoteHelper.Parse(referencedMessage.Content.Trim());
114+
115+
if (singleEmojiParsedFromMessage != null)
116+
{
117+
logger?.LogDebug(
118+
"Found single emoji image url {ImageUrl} in referenced message {ReferencedMessageId}",
119+
singleEmojiParsedFromMessage.ImageUrl,
120+
referencedMessage.Id);
121+
return singleEmojiParsedFromMessage.ImageUrl;
122+
}
112123
}
113124

114125
logger?.LogDebug("Waiting for embed image in message {MessageId}", message.Id);

src/Kattbot/Helpers/EmoteHelper.cs

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
using System.Text;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Globalization;
4+
using System.Linq;
5+
using System.Text;
26
using System.Text.RegularExpressions;
37
using DSharpPlus.Entities;
48
using Kattbot.Common.Models.Emotes;
@@ -7,11 +11,12 @@ namespace Kattbot.Helpers;
711

812
public static class EmoteHelper
913
{
10-
public static readonly Regex EmoteRegex = new(@"<a{0,1}:\w+:\d+>");
11-
public static readonly Regex EmoteRegexGrouped = new(@"<(a{0,1}):(\w+):(\d+)>");
12-
public static readonly string EmoteCodeFormat = "<:{0}:{1}>";
13-
public static readonly string EmoteAnimatedCodeFormat = "<a:{0}:{1}>";
14-
public static readonly string EmoteNamePlaceholder = "x";
14+
private const string EmoteCodeFormat = "<:{0}:{1}>";
15+
private const string EmoteAnimatedCodeFormat = "<a:{0}:{1}>";
16+
private const string EmoteNamePlaceholder = "x";
17+
18+
private static readonly Regex EmoteRegex = new(@"<a{0,1}:\w+:\d+>");
19+
private static readonly Regex EmoteRegexGrouped = new(@"<(a{0,1}):(\w+):(\d+)>");
1520

1621
public static TempEmote? Parse(string emoteString)
1722
{
@@ -32,6 +37,7 @@ public static class EmoteHelper
3237
Id = id,
3338
Name = name,
3439
Animated = isAnimated,
40+
ImageUrl = BuildDiscordEmojiUrl(id, isAnimated),
3541
};
3642

3743
return parsed;
@@ -74,7 +80,7 @@ public static string GetExternalEmojiImageUrl(string code)
7480

7581
// flag = 0001F1E6 0001F1E9
7682
// https://emoji.aranja.com/static/emoji-data/img-twitter-72/1f1e6-1f1e9.png
77-
var utf32Encoding = new UTF32Encoding(true, false);
83+
var utf32Encoding = new UTF32Encoding(bigEndian: true, byteOrderMark: false);
7884

7985
byte[] bytes = utf32Encoding.GetBytes(code);
8086

@@ -90,7 +96,7 @@ public static string GetExternalEmojiImageUrl(string code)
9096

9197
for (var i = 0; i < bytesAsString.Length; i += 8)
9298
{
93-
string unicodePart = bytesAsString.Substring(i, 8)
99+
string unicodePart = bytesAsString.Substring(i, length: 8)
94100
.TrimStart('0')
95101
.ToLower();
96102

@@ -101,4 +107,22 @@ public static string GetExternalEmojiImageUrl(string code)
101107

102108
return $"https://emoji.aranja.com/static/emoji-data/img-twitter-72/{fileName}.png";
103109
}
110+
111+
public static List<string> ExtractEmotesFromMessage(string messageText)
112+
{
113+
MatchCollection result = EmoteRegex.Matches(messageText);
114+
115+
List<string> emojiStrings = result.Select(m => m.Value).ToList();
116+
117+
return emojiStrings;
118+
}
119+
120+
private static string BuildDiscordEmojiUrl(ulong id, bool isAnimated)
121+
{
122+
return id == 0
123+
? throw new InvalidOperationException("Cannot get URL of unicode emojis.")
124+
: isAnimated
125+
? $"https://cdn.discordapp.com/emojis/{id.ToString(CultureInfo.InvariantCulture)}.gif"
126+
: $"https://cdn.discordapp.com/emojis/{id.ToString(CultureInfo.InvariantCulture)}.png";
127+
}
104128
}

src/Kattbot/Program.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ private static void AddInternalServices(IServiceCollection services)
6868
{
6969
services.AddTransient<EmoteEntityBuilder>();
7070
services.AddTransient<DateTimeProvider>();
71-
services.AddTransient<EmoteParser>();
7271
services.AddTransient<GuildSettingsService>();
7372
services.AddTransient<ImageService>();
7473
services.AddTransient<DiscordErrorLogger>();

src/Kattbot/Services/EmoteEntityBuilder.cs

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,41 +9,33 @@ namespace Kattbot.Services;
99

1010
public class EmoteEntityBuilder
1111
{
12-
private readonly EmoteParser _emoteParser;
13-
14-
public EmoteEntityBuilder(EmoteParser emoteParser)
15-
{
16-
_emoteParser = emoteParser;
17-
}
18-
1912
public List<EmoteEntity> BuildFromSocketUserMessage(DiscordMessage message, ulong guildId)
2013
{
21-
List<string> emojiStrings = _emoteParser.ExtractEmotesFromMessage(message.Content);
14+
List<string> emojiStrings = EmoteHelper.ExtractEmotesFromMessage(message.Content);
2215

23-
List<EmoteEntity> emotes = emojiStrings.Select(
24-
s =>
25-
{
26-
TempEmote? parsedEmote = EmoteHelper.Parse(s);
27-
28-
if (parsedEmote == null)
29-
{
30-
throw new Exception($"{s} is not a valid emote string");
31-
}
16+
List<EmoteEntity> emotes = emojiStrings.Select(s =>
17+
{
18+
TempEmote? parsedEmote = EmoteHelper.Parse(s);
3219

33-
var emoteEntitiy = new EmoteEntity
34-
{
35-
EmoteId = parsedEmote.Id,
36-
EmoteName = parsedEmote.Name,
37-
EmoteAnimated = parsedEmote.Animated,
38-
DateTime = DateTimeOffset.UtcNow,
39-
UserId = message.Author.Id,
40-
MessageId = message.Id,
41-
GuildId = guildId,
42-
Source = EmoteSource.Message,
43-
};
20+
if (parsedEmote == null)
21+
{
22+
throw new Exception($"{s} is not a valid emote string");
23+
}
4424

45-
return emoteEntitiy;
46-
})
25+
var emoteEntity = new EmoteEntity
26+
{
27+
EmoteId = parsedEmote.Id,
28+
EmoteName = parsedEmote.Name,
29+
EmoteAnimated = parsedEmote.Animated,
30+
DateTime = DateTimeOffset.UtcNow,
31+
UserId = message.Author.Id,
32+
MessageId = message.Id,
33+
GuildId = guildId,
34+
Source = EmoteSource.Message,
35+
};
36+
37+
return emoteEntity;
38+
})
4739
.ToList();
4840

4941
return emotes;

src/Kattbot/Services/EmoteParser.cs

Lines changed: 0 additions & 18 deletions
This file was deleted.
Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using Kattbot.Helpers;
23
using Kattbot.Services;
34
using Microsoft.VisualStudio.TestTools.UnitTesting;
45

@@ -7,32 +8,24 @@ namespace Kattbot.Tests;
78
[TestClass]
89
public class EmoteParserTests
910
{
10-
private EmoteParser _sut = null!;
11-
12-
[TestInitialize]
13-
public void Initialize()
14-
{
15-
_sut = new EmoteParser();
16-
}
17-
1811
[TestMethod]
1912
public void ParseEmotes_WithMessageContaingEmotes_ReturnEmote()
2013
{
2114
const string testMessage = "Some text <:emoji_1:123123123>";
2215

23-
List<string> emotes = _sut.ExtractEmotesFromMessage(testMessage);
16+
List<string> emotes = EmoteHelper.ExtractEmotesFromMessage(testMessage);
2417

25-
Assert.AreEqual(emotes.Count, actual: 1);
26-
Assert.AreEqual(emotes[0], "<:emoji_1:123123123>");
18+
Assert.HasCount(expected: 1, emotes);
19+
Assert.AreEqual("<:emoji_1:123123123>", emotes[0]);
2720
}
2821

2922
[TestMethod]
3023
public void ParseEmotes_WithMessageContaingThreeEmotes_ReturnThreeEmotes()
3124
{
3225
const string testMessage = "Some text <:emoji_1:123123123> other <:emoji_2:123123123><:emoji_3:123123123>";
3326

34-
List<string> emotes = _sut.ExtractEmotesFromMessage(testMessage);
27+
List<string> emotes = EmoteHelper.ExtractEmotesFromMessage(testMessage);
3528

36-
Assert.AreEqual(emotes.Count, actual: 3);
29+
Assert.HasCount(expected: 3, emotes);
3730
}
3831
}

0 commit comments

Comments
 (0)