From a1876a1c6d91744bc9c60da5027d8ea2f8aef8b1 Mon Sep 17 00:00:00 2001 From: danthe1st Date: Sat, 5 Oct 2024 13:18:18 +0200 Subject: [PATCH 1/2] update JDA, use forwarding information in automod --- build.gradle.kts | 2 +- .../javabot/systems/moderation/AutoMod.java | 20 ++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 33b9ced4..f3f3e002 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -31,7 +31,7 @@ dependencies { // DIH4JDA (Command Framework) & JDA implementation("com.github.DynxstyGIT:DIH4JDA:120a15ad2e") - implementation("net.dv8tion:JDA:5.0.0") { + implementation("net.dv8tion:JDA:5.1.2") { exclude(module = "opus-java") } diff --git a/src/main/java/net/discordjug/javabot/systems/moderation/AutoMod.java b/src/main/java/net/discordjug/javabot/systems/moderation/AutoMod.java index ec1948b0..4e84eeff 100644 --- a/src/main/java/net/discordjug/javabot/systems/moderation/AutoMod.java +++ b/src/main/java/net/discordjug/javabot/systems/moderation/AutoMod.java @@ -8,7 +8,9 @@ import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.MessageReference; import net.dv8tion.jda.api.entities.channel.unions.MessageChannelUnion; +import net.dv8tion.jda.api.entities.messages.MessageSnapshot; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.events.message.MessageUpdateEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; @@ -132,7 +134,7 @@ private void checkContentAutomod(@Nonnull Message message) { } private void doAutomodActions(Message message, String reason) { - notificationService.withGuild(message.getGuild()).sendToModerationLog(c -> c.sendMessageFormat("Message by %s: `%s`", message.getAuthor().getAsMention(), message.getContentRaw())); + notificationService.withGuild(message.getGuild()).sendToModerationLog(c -> c.sendMessageFormat("Message by %s: `%s`", message.getAuthor().getAsMention(), getMessageContent(message))); moderationService .warn( message.getAuthor(), @@ -188,7 +190,7 @@ private void handleSpam(@Nonnull Message msg, Member member) { * @return True if a link is found and False if not. */ public boolean hasSuspiciousLink(@NotNull Message message) { - final String messageRaw = message.getContentRaw(); + final String messageRaw = getMessageContent(message); Matcher urlMatcher = URL_PATTERN.matcher(messageRaw); if (messageRaw.contains("http://") || messageRaw.contains("https://")) { // only do it for a links, so it won't iterate for each message @@ -217,7 +219,7 @@ public boolean hasSuspiciousLink(@NotNull Message message) { */ public boolean hasAdvertisingLink(@NotNull Message message) { // Advertising - Matcher matcher = INVITE_URL.matcher(cleanString(message.getContentRaw())); + Matcher matcher = INVITE_URL.matcher(cleanString(getMessageContent(message))); int start = 0; while (matcher.find(start)) { if (botConfig.get(message.getGuild()).getModerationConfig().getAutomodInviteExcludes().stream().noneMatch(matcher.group()::contains)) { @@ -232,4 +234,16 @@ private boolean isSuggestionsChannel(@NotNull MessageChannelUnion channel) { return channel.getType().isGuild() && channel.getIdLong() == botConfig.get(channel.asGuildMessageChannel().getGuild()).getModerationConfig().getSuggestionChannel().getIdLong(); } + + private String getMessageContent(Message msg) { + //see https://github.com/discord-jda/JDA/releases/tag/v5.1.2 + MessageReference messageReference = msg.getMessageReference(); + if (messageReference != null && messageReference.getType() == MessageReference.MessageReferenceType.FORWARD) { + MessageSnapshot snapshot = msg.getMessageSnapshots().get(0); + if (snapshot != null) { + return snapshot.getContentRaw(); + } + } + return msg.getContentRaw(); + } } \ No newline at end of file From 7562bd7faaa36767d3f7cf9860f0710239432400 Mon Sep 17 00:00:00 2001 From: danthe1st Date: Sat, 5 Oct 2024 13:34:18 +0200 Subject: [PATCH 2/2] use real forwarded content for message logs --- .../message_cache/model/CachedMessage.java | 4 +-- .../javabot/systems/moderation/AutoMod.java | 20 +++-------- .../discordjug/javabot/util/MessageUtils.java | 33 +++++++++++++++++++ 3 files changed, 39 insertions(+), 18 deletions(-) create mode 100644 src/main/java/net/discordjug/javabot/util/MessageUtils.java diff --git a/src/main/java/net/discordjug/javabot/data/h2db/message_cache/model/CachedMessage.java b/src/main/java/net/discordjug/javabot/data/h2db/message_cache/model/CachedMessage.java index d6e8d922..c22e538c 100644 --- a/src/main/java/net/discordjug/javabot/data/h2db/message_cache/model/CachedMessage.java +++ b/src/main/java/net/discordjug/javabot/data/h2db/message_cache/model/CachedMessage.java @@ -4,6 +4,7 @@ import java.util.List; import lombok.Data; +import net.discordjug.javabot.util.MessageUtils; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Message.Attachment; @@ -27,7 +28,7 @@ public static CachedMessage of(Message message) { CachedMessage cachedMessage = new CachedMessage(); cachedMessage.setMessageId(message.getIdLong()); cachedMessage.setAuthorId(message.getAuthor().getIdLong()); - cachedMessage.setMessageContent(message.getContentRaw().trim()); + cachedMessage.setMessageContent(MessageUtils.getMessageContent(message).trim()); cachedMessage.attachments = message .getAttachments() .stream() @@ -35,5 +36,4 @@ public static CachedMessage of(Message message) { .toList(); return cachedMessage; } - } diff --git a/src/main/java/net/discordjug/javabot/systems/moderation/AutoMod.java b/src/main/java/net/discordjug/javabot/systems/moderation/AutoMod.java index 4e84eeff..6c0b8503 100644 --- a/src/main/java/net/discordjug/javabot/systems/moderation/AutoMod.java +++ b/src/main/java/net/discordjug/javabot/systems/moderation/AutoMod.java @@ -5,12 +5,11 @@ import net.discordjug.javabot.systems.moderation.warn.model.WarnSeverity; import net.discordjug.javabot.systems.notification.NotificationService; import net.discordjug.javabot.util.ExceptionLogger; +import net.discordjug.javabot.util.MessageUtils; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Message; -import net.dv8tion.jda.api.entities.MessageReference; import net.dv8tion.jda.api.entities.channel.unions.MessageChannelUnion; -import net.dv8tion.jda.api.entities.messages.MessageSnapshot; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.events.message.MessageUpdateEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; @@ -134,7 +133,7 @@ private void checkContentAutomod(@Nonnull Message message) { } private void doAutomodActions(Message message, String reason) { - notificationService.withGuild(message.getGuild()).sendToModerationLog(c -> c.sendMessageFormat("Message by %s: `%s`", message.getAuthor().getAsMention(), getMessageContent(message))); + notificationService.withGuild(message.getGuild()).sendToModerationLog(c -> c.sendMessageFormat("Message by %s: `%s`", message.getAuthor().getAsMention(), MessageUtils.getMessageContent(message))); moderationService .warn( message.getAuthor(), @@ -190,7 +189,7 @@ private void handleSpam(@Nonnull Message msg, Member member) { * @return True if a link is found and False if not. */ public boolean hasSuspiciousLink(@NotNull Message message) { - final String messageRaw = getMessageContent(message); + final String messageRaw = MessageUtils.getMessageContent(message); Matcher urlMatcher = URL_PATTERN.matcher(messageRaw); if (messageRaw.contains("http://") || messageRaw.contains("https://")) { // only do it for a links, so it won't iterate for each message @@ -219,7 +218,7 @@ public boolean hasSuspiciousLink(@NotNull Message message) { */ public boolean hasAdvertisingLink(@NotNull Message message) { // Advertising - Matcher matcher = INVITE_URL.matcher(cleanString(getMessageContent(message))); + Matcher matcher = INVITE_URL.matcher(cleanString(MessageUtils.getMessageContent(message))); int start = 0; while (matcher.find(start)) { if (botConfig.get(message.getGuild()).getModerationConfig().getAutomodInviteExcludes().stream().noneMatch(matcher.group()::contains)) { @@ -235,15 +234,4 @@ private boolean isSuggestionsChannel(@NotNull MessageChannelUnion channel) { channel.getIdLong() == botConfig.get(channel.asGuildMessageChannel().getGuild()).getModerationConfig().getSuggestionChannel().getIdLong(); } - private String getMessageContent(Message msg) { - //see https://github.com/discord-jda/JDA/releases/tag/v5.1.2 - MessageReference messageReference = msg.getMessageReference(); - if (messageReference != null && messageReference.getType() == MessageReference.MessageReferenceType.FORWARD) { - MessageSnapshot snapshot = msg.getMessageSnapshots().get(0); - if (snapshot != null) { - return snapshot.getContentRaw(); - } - } - return msg.getContentRaw(); - } } \ No newline at end of file diff --git a/src/main/java/net/discordjug/javabot/util/MessageUtils.java b/src/main/java/net/discordjug/javabot/util/MessageUtils.java new file mode 100644 index 00000000..4a0d8d31 --- /dev/null +++ b/src/main/java/net/discordjug/javabot/util/MessageUtils.java @@ -0,0 +1,33 @@ +package net.discordjug.javabot.util; + +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.MessageReference; +import net.dv8tion.jda.api.entities.messages.MessageSnapshot; + +/** + * Utility class for JDA messages. + */ +public class MessageUtils { + + private MessageUtils() { + //prevent instantiation + } + + /** + * Gets the actual content of a message. + * In case of forwarded messages, this gets the content of the forwarded message. + * @param msg the message to check + * @return the content of the passed message + */ + public static String getMessageContent(Message msg) { + //see https://github.com/discord-jda/JDA/releases/tag/v5.1.2 + MessageReference messageReference = msg.getMessageReference(); + if (messageReference != null && messageReference.getType() == MessageReference.MessageReferenceType.FORWARD) { + MessageSnapshot snapshot = msg.getMessageSnapshots().get(0); + if (snapshot != null) { + return snapshot.getContentRaw(); + } + } + return msg.getContentRaw(); + } +} \ No newline at end of file