Skip to content

Commit 97801ad

Browse files
Track emoji usage in messages and reactions (#1449)
* Track emoji usage in messages and reactions * Track emoji usage in messages and reactions
1 parent 8d2c1b6 commit 97801ad

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

application/src/main/java/org/togetherjava/tjbot/features/Features.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.togetherjava.tjbot.config.FeatureBlacklist;
77
import org.togetherjava.tjbot.config.FeatureBlacklistConfig;
88
import org.togetherjava.tjbot.db.Database;
9+
import org.togetherjava.tjbot.features.analytics.EmojiTrackerListener;
910
import org.togetherjava.tjbot.features.analytics.Metrics;
1011
import org.togetherjava.tjbot.features.basic.MemberCountDisplayRoutine;
1112
import org.togetherjava.tjbot.features.basic.PingCommand;
@@ -159,6 +160,7 @@ public static Collection<Feature> createFeatures(JDA jda, Database database, Con
159160
// Message receivers
160161
features.add(new TopHelpersMessageListener(database, config));
161162
features.add(new SuggestionsUpDownVoter(config, metrics));
163+
features.add(new EmojiTrackerListener(metrics));
162164
features.add(new ScamBlocker(actionsStore, scamHistoryStore, config, metrics));
163165
features.add(new MediaOnlyChannelListener(config, metrics));
164166
features.add(new FileSharingMessageListener(config, metrics));
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package org.togetherjava.tjbot.features.analytics;
2+
3+
import net.dv8tion.jda.api.entities.emoji.CustomEmoji;
4+
import net.dv8tion.jda.api.entities.emoji.Emoji;
5+
import net.dv8tion.jda.api.entities.emoji.EmojiUnion;
6+
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
7+
import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent;
8+
9+
import org.togetherjava.tjbot.features.MessageReceiverAdapter;
10+
11+
/**
12+
* Listener that tracks custom emoji usage across all channels for analytics purposes.
13+
* <p>
14+
* Counts custom emojis used in messages and reactions so admins can see which emojis are unused and
15+
* should be removed.
16+
* <p>
17+
* Custom emojis are tracked by their Discord ID (e.g. {@code emoji-custom-123456789}). Animated
18+
* custom emojis are tracked separately (e.g. {@code emoji-custom-animated-123456789}).
19+
*/
20+
public final class EmojiTrackerListener extends MessageReceiverAdapter {
21+
private final Metrics metrics;
22+
23+
/**
24+
* Creates a new listener to track emoji usage across all channels.
25+
*
26+
* @param metrics to track emoji usage events
27+
*/
28+
public EmojiTrackerListener(Metrics metrics) {
29+
super();
30+
31+
this.metrics = metrics;
32+
}
33+
34+
@Override
35+
public void onMessageReceived(MessageReceivedEvent event) {
36+
if (event.isWebhookMessage()) {
37+
return;
38+
}
39+
40+
event.getMessage().getMentions().getCustomEmojis().forEach(this::trackCustomEmoji);
41+
}
42+
43+
@Override
44+
public void onMessageReactionAdd(MessageReactionAddEvent event) {
45+
EmojiUnion emoji = event.getEmoji();
46+
if (emoji.getType() != Emoji.Type.CUSTOM) {
47+
return;
48+
}
49+
50+
trackCustomEmoji(emoji.asCustom());
51+
}
52+
53+
private void trackCustomEmoji(CustomEmoji emoji) {
54+
String prefix = emoji.isAnimated() ? "emoji-custom-animated-" : "emoji-custom-";
55+
metrics.count(prefix + emoji.getIdLong());
56+
}
57+
}

0 commit comments

Comments
 (0)