diff --git a/application/src/main/java/org/togetherjava/tjbot/features/Features.java b/application/src/main/java/org/togetherjava/tjbot/features/Features.java index 1f6acbef2e..c360bacdd1 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/Features.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/Features.java @@ -6,6 +6,7 @@ import org.togetherjava.tjbot.config.FeatureBlacklist; import org.togetherjava.tjbot.config.FeatureBlacklistConfig; import org.togetherjava.tjbot.db.Database; +import org.togetherjava.tjbot.features.analytics.EmojiTrackerListener; import org.togetherjava.tjbot.features.analytics.Metrics; import org.togetherjava.tjbot.features.basic.MemberCountDisplayRoutine; import org.togetherjava.tjbot.features.basic.PingCommand; @@ -159,6 +160,7 @@ public static Collection createFeatures(JDA jda, Database database, Con // Message receivers features.add(new TopHelpersMessageListener(database, config)); features.add(new SuggestionsUpDownVoter(config, metrics)); + features.add(new EmojiTrackerListener(metrics)); features.add(new ScamBlocker(actionsStore, scamHistoryStore, config, metrics)); features.add(new MediaOnlyChannelListener(config, metrics)); features.add(new FileSharingMessageListener(config, metrics)); diff --git a/application/src/main/java/org/togetherjava/tjbot/features/analytics/EmojiTrackerListener.java b/application/src/main/java/org/togetherjava/tjbot/features/analytics/EmojiTrackerListener.java new file mode 100644 index 0000000000..f90b11b68b --- /dev/null +++ b/application/src/main/java/org/togetherjava/tjbot/features/analytics/EmojiTrackerListener.java @@ -0,0 +1,57 @@ +package org.togetherjava.tjbot.features.analytics; + +import net.dv8tion.jda.api.entities.emoji.CustomEmoji; +import net.dv8tion.jda.api.entities.emoji.Emoji; +import net.dv8tion.jda.api.entities.emoji.EmojiUnion; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent; + +import org.togetherjava.tjbot.features.MessageReceiverAdapter; + +/** + * Listener that tracks custom emoji usage across all channels for analytics purposes. + *

+ * Counts custom emojis used in messages and reactions so admins can see which emojis are unused and + * should be removed. + *

+ * Custom emojis are tracked by their Discord ID (e.g. {@code emoji-custom-123456789}). Animated + * custom emojis are tracked separately (e.g. {@code emoji-custom-animated-123456789}). + */ +public final class EmojiTrackerListener extends MessageReceiverAdapter { + private final Metrics metrics; + + /** + * Creates a new listener to track emoji usage across all channels. + * + * @param metrics to track emoji usage events + */ + public EmojiTrackerListener(Metrics metrics) { + super(); + + this.metrics = metrics; + } + + @Override + public void onMessageReceived(MessageReceivedEvent event) { + if (event.isWebhookMessage()) { + return; + } + + event.getMessage().getMentions().getCustomEmojis().forEach(this::trackCustomEmoji); + } + + @Override + public void onMessageReactionAdd(MessageReactionAddEvent event) { + EmojiUnion emoji = event.getEmoji(); + if (emoji.getType() != Emoji.Type.CUSTOM) { + return; + } + + trackCustomEmoji(emoji.asCustom()); + } + + private void trackCustomEmoji(CustomEmoji emoji) { + String prefix = emoji.isAnimated() ? "emoji-custom-animated-" : "emoji-custom-"; + metrics.count(prefix + emoji.getIdLong()); + } +}