From 141d7f0ffb1dd1a82aff07ef153c7aa5c427a82b Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sat, 27 Aug 2022 17:23:31 +0200 Subject: [PATCH 01/16] added AttachmentListener checks if the message attachment contains blacklisted file extensions --- application/config.json.template | 6 +- .../togetherjava/tjbot/commands/Features.java | 7 +- .../attachment/AttachmentListener.java | 126 ++++++++++++++++++ .../org/togetherjava/tjbot/config/Config.java | 17 ++- 4 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java diff --git a/application/config.json.template b/application/config.json.template index 6c433a2043..1ba02fc076 100644 --- a/application/config.json.template +++ b/application/config.json.template @@ -44,5 +44,9 @@ "Other" ], "categoryRoleSuffix": " - Helper" - } + }, + "blacklistedFileExtension":[ + "exe", + "tar" + ] } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/Features.java b/application/src/main/java/org/togetherjava/tjbot/commands/Features.java index 44b1d7eb4f..884bee894b 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/Features.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/Features.java @@ -2,12 +2,16 @@ import net.dv8tion.jda.api.JDA; import org.jetbrains.annotations.NotNull; -import org.togetherjava.tjbot.commands.basic.*; +import org.togetherjava.tjbot.commands.basic.PingCommand; +import org.togetherjava.tjbot.commands.basic.RoleSelectCommand; +import org.togetherjava.tjbot.commands.basic.SuggestionsUpDownVoter; +import org.togetherjava.tjbot.commands.basic.VcActivityCommand; import org.togetherjava.tjbot.commands.filesharing.FileSharingMessageListener; import org.togetherjava.tjbot.commands.help.*; import org.togetherjava.tjbot.commands.mathcommands.TeXCommand; import org.togetherjava.tjbot.commands.mathcommands.wolframalpha.WolframAlphaCommand; import org.togetherjava.tjbot.commands.moderation.*; +import org.togetherjava.tjbot.commands.moderation.attachment.AttachmentListener; import org.togetherjava.tjbot.commands.moderation.scam.ScamBlocker; import org.togetherjava.tjbot.commands.moderation.scam.ScamHistoryPurgeRoutine; import org.togetherjava.tjbot.commands.moderation.scam.ScamHistoryStore; @@ -81,6 +85,7 @@ public enum Features { features.add(new ScamBlocker(actionsStore, scamHistoryStore, config)); features.add(new ImplicitAskListener(config, helpSystemHelper)); features.add(new FileSharingMessageListener(config)); + features.add(new AttachmentListener(config, modAuditLogWriter)); // Event receivers features.add(new RejoinModerationRoleListener(actionsStore, config)); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java new file mode 100644 index 0000000000..bb26e63d1e --- /dev/null +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java @@ -0,0 +1,126 @@ +package org.togetherjava.tjbot.commands.moderation.attachment; + +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.MessageBuilder; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.MessageEmbed; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.requests.RestAction; +import net.dv8tion.jda.api.requests.restaction.AuditableRestAction; +import org.jetbrains.annotations.NotNull; +import org.jooq.tools.StringUtils; +import org.togetherjava.tjbot.commands.MessageReceiverAdapter; +import org.togetherjava.tjbot.config.Config; +import org.togetherjava.tjbot.moderation.ModAuditLogWriter; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +/** + * Listener that receives all sent messages in every channel and checks if the message has any + * blacklisted file attached. + *

+ * If there was a blacklisted file attached, delete the message and send the user a dm, telling what + * they did wrong and also inform the mods. + */ +public class AttachmentListener extends MessageReceiverAdapter { + + private final Config config; + + private final ModAuditLogWriter modAuditLogWriter; + + /** + * Creates a AttachmentListener to receive all message sent in any channel. + * + * @param config to find the blacklisted media attachments + * @param modAuditLogWriter to inform the mods about the suspicious attachment + */ + public AttachmentListener(@NotNull Config config, + @NotNull ModAuditLogWriter modAuditLogWriter) { + super(Pattern.compile(".*")); + this.config = config; + this.modAuditLogWriter = modAuditLogWriter; + } + + @Override + public void onMessageReceived(@NotNull MessageReceivedEvent event) { + if (event.getAuthor().isBot() || event.isWebhookMessage()) { + return; + } + if (attachmentContainsBlacklistedFileExtension(event)) { + deleteMessage(event).flatMap(any -> dmUser(event)).queue(); + warnMods(event); + } + } + + private AuditableRestAction deleteMessage(@NotNull MessageReceivedEvent event) { + return event.getMessage().delete(); + } + + private RestAction dmUser(@NotNull MessageReceivedEvent event) { + return dmUser(event.getMessage(), event.getAuthor().getIdLong(), event.getJDA()); + } + + private RestAction dmUser(Message originalMessage, long userId, @NotNull JDA jda) { + Message dmMessage = createDmMessage(originalMessage); + return jda.openPrivateChannelById(userId) + .flatMap(channel -> channel.sendMessage(dmMessage)); + } + + private Message createDmMessage(Message originalMessage) { + String originalMessageContent = originalMessage.getContentDisplay(); + String blacklistedAttachments = getBlacklistedAttachmentsFromMessage(originalMessage); + String dmMessageContent = + "Hey there, you posted a message with a blacklisted file attachment: %s. Following file extension are blacklisted: %s ." + .formatted(blacklistedAttachments, config.getBlacklistedFileExtensions()); + // No embedded needed if there was no message from the user + if (StringUtils.isEmpty(originalMessageContent)) { + return new MessageBuilder(dmMessageContent).build(); + } + return createMessageWithOriginalMessageAsEmbedded(originalMessageContent, dmMessageContent); + } + + private Message createMessageWithOriginalMessageAsEmbedded(String originalMessageContent, + String dmMessageContent) { + MessageEmbed originalMessageEmbed = + new EmbedBuilder().setDescription(originalMessageContent) + .setColor(Color.ORANGE) + .build(); + return new MessageBuilder(dmMessageContent).setEmbeds(originalMessageEmbed).build(); + } + + private String getBlacklistedAttachmentsFromMessage(Message originalMessage) { + List blacklistedAttachments = new ArrayList<>(); + originalMessage.getAttachments() + .stream() + .filter(attachment -> config.getBlacklistedFileExtensions() + .contains(attachment.getFileExtension())) + .forEach(attachment -> blacklistedAttachments.add(attachment.getFileName())); + return String.join(", ", blacklistedAttachments); + } + + private boolean attachmentContainsBlacklistedFileExtension(MessageReceivedEvent event) { + Message message = event.getMessage(); + List attachments = message.getAttachments(); + if (attachments.isEmpty()) { + return false; + } + return attachments.stream() + .anyMatch(attachment -> config.getBlacklistedFileExtensions() + .contains(attachment.getFileExtension())); + } + + private void warnMods(@NotNull MessageReceivedEvent event) { + Message sentUserMessage = event.getMessage(); + String blacklistedAttachmentsFromMessage = + getBlacklistedAttachmentsFromMessage(sentUserMessage); + modAuditLogWriter.write( + "Message with blacklisted attachment detected: %s" + .formatted(blacklistedAttachmentsFromMessage), + "Sent Message: %s".formatted(sentUserMessage), event.getAuthor(), + sentUserMessage.getTimeCreated(), event.getGuild()); + } +} diff --git a/application/src/main/java/org/togetherjava/tjbot/config/Config.java b/application/src/main/java/org/togetherjava/tjbot/config/Config.java index 9888d12191..bf222871d1 100644 --- a/application/src/main/java/org/togetherjava/tjbot/config/Config.java +++ b/application/src/main/java/org/togetherjava/tjbot/config/Config.java @@ -8,6 +8,8 @@ import java.io.IOException; import java.nio.file.Path; +import java.util.Collections; +import java.util.List; /** * Configuration of the application. Create instances using {@link #load(Path)}. @@ -28,6 +30,7 @@ public final class Config { private final ScamBlockerConfig scamBlocker; private final String wolframAlphaAppId; private final HelpSystemConfig helpSystem; + private final List blacklistedFileExtension; @SuppressWarnings("ConstructorWithTooManyParameters") @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) @@ -45,7 +48,8 @@ private Config(@JsonProperty("token") String token, @JsonProperty("quarantinedRolePattern") String quarantinedRolePattern, @JsonProperty("scamBlocker") ScamBlockerConfig scamBlocker, @JsonProperty("wolframAlphaAppId") String wolframAlphaAppId, - @JsonProperty("helpSystem") HelpSystemConfig helpSystem) { + @JsonProperty("helpSystem") HelpSystemConfig helpSystem, + @JsonProperty("blacklistedFileExtension") List blacklistedFileExtension) { this.token = token; this.gistApiKey = gistApiKey; this.databasePath = databasePath; @@ -61,6 +65,7 @@ private Config(@JsonProperty("token") String token, this.scamBlocker = scamBlocker; this.wolframAlphaAppId = wolframAlphaAppId; this.helpSystem = helpSystem; + this.blacklistedFileExtension = blacklistedFileExtension; } /** @@ -216,4 +221,14 @@ public String getQuarantinedRolePattern() { public @NotNull HelpSystemConfig getHelpSystem() { return helpSystem; } + + /** + * Gets a list of all blacklistedFileExtensions. + * + * @return a list of all blacklistedFileExtensions + */ + public @NotNull List getBlacklistedFileExtensions() { + return Collections.unmodifiableList(blacklistedFileExtension); + } + } From 1774d413a64d2e509fe98a5b8841c8cc1637c232 Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sat, 27 Aug 2022 18:33:43 +0200 Subject: [PATCH 02/16] added review feedback --- application/config.json.template | 4 ++-- .../commands/moderation/attachment/AttachmentListener.java | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/application/config.json.template b/application/config.json.template index 1ba02fc076..a1a959cb8e 100644 --- a/application/config.json.template +++ b/application/config.json.template @@ -45,8 +45,8 @@ ], "categoryRoleSuffix": " - Helper" }, - "blacklistedFileExtension":[ + "blacklistedFileExtension": [ "exe", "tar" - ] + ] } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java index bb26e63d1e..67c1db4e25 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java @@ -27,9 +27,7 @@ * they did wrong and also inform the mods. */ public class AttachmentListener extends MessageReceiverAdapter { - private final Config config; - private final ModAuditLogWriter modAuditLogWriter; /** @@ -50,7 +48,7 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) { if (event.getAuthor().isBot() || event.isWebhookMessage()) { return; } - if (attachmentContainsBlacklistedFileExtension(event)) { + if (attachmentContainsBlacklistedFileExtension(event.getMessage())) { deleteMessage(event).flatMap(any -> dmUser(event)).queue(); warnMods(event); } @@ -102,8 +100,7 @@ private String getBlacklistedAttachmentsFromMessage(Message originalMessage) { return String.join(", ", blacklistedAttachments); } - private boolean attachmentContainsBlacklistedFileExtension(MessageReceivedEvent event) { - Message message = event.getMessage(); + private boolean attachmentContainsBlacklistedFileExtension(Message message) { List attachments = message.getAttachments(); if (attachments.isEmpty()) { return false; From 21052b82c7a8e4c8195645571e49417c7188dcf4 Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sat, 27 Aug 2022 18:46:25 +0200 Subject: [PATCH 03/16] added review feedback --- .../attachment/AttachmentListener.java | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java index 67c1db4e25..4a1426ed3c 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java @@ -1,13 +1,11 @@ package org.togetherjava.tjbot.commands.moderation.attachment; import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.requests.RestAction; -import net.dv8tion.jda.api.requests.restaction.AuditableRestAction; import org.jetbrains.annotations.NotNull; import org.jooq.tools.StringUtils; import org.togetherjava.tjbot.commands.MessageReceiverAdapter; @@ -49,22 +47,19 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) { return; } if (attachmentContainsBlacklistedFileExtension(event.getMessage())) { - deleteMessage(event).flatMap(any -> dmUser(event)).queue(); + deleteMessageAndDmUser(event); warnMods(event); } } - private AuditableRestAction deleteMessage(@NotNull MessageReceivedEvent event) { - return event.getMessage().delete(); + private void deleteMessageAndDmUser(@NotNull MessageReceivedEvent event) { + event.getMessage().delete().flatMap(any -> dmUser(event)).queue(); } private RestAction dmUser(@NotNull MessageReceivedEvent event) { - return dmUser(event.getMessage(), event.getAuthor().getIdLong(), event.getJDA()); - } - - private RestAction dmUser(Message originalMessage, long userId, @NotNull JDA jda) { - Message dmMessage = createDmMessage(originalMessage); - return jda.openPrivateChannelById(userId) + Message dmMessage = createDmMessage(event.getMessage()); + return event.getJDA() + .openPrivateChannelById(event.getAuthor().getIdLong()) .flatMap(channel -> channel.sendMessage(dmMessage)); } From 87fbb7f3ade0704e97a2863d14ae83dd18a8f4d9 Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sat, 27 Aug 2022 20:35:45 +0200 Subject: [PATCH 04/16] added review feedback --- application/config.json.template | 6 +++--- .../commands/moderation/attachment/AttachmentListener.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/application/config.json.template b/application/config.json.template index a1a959cb8e..455846bc29 100644 --- a/application/config.json.template +++ b/application/config.json.template @@ -45,8 +45,8 @@ ], "categoryRoleSuffix": " - Helper" }, - "blacklistedFileExtension": [ - "exe", - "tar" + "blacklistedFileExtension": [ + "exe", + "tar" ] } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java index 4a1426ed3c..8a4d018798 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java @@ -47,12 +47,12 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) { return; } if (attachmentContainsBlacklistedFileExtension(event.getMessage())) { - deleteMessageAndDmUser(event); + handleBadMessage(event); warnMods(event); } } - private void deleteMessageAndDmUser(@NotNull MessageReceivedEvent event) { + private void handleBadMessage(@NotNull MessageReceivedEvent event) { event.getMessage().delete().flatMap(any -> dmUser(event)).queue(); } From a4e567800cd2b0a752278443c98cccb72b820aba Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sat, 27 Aug 2022 21:02:03 +0200 Subject: [PATCH 05/16] added review feedback --- application/config.json.template | 3 +- .../togetherjava/tjbot/commands/Features.java | 4 +-- ...ava => BlacklistedAttachmentListener.java} | 35 +++++++------------ .../org/togetherjava/tjbot/config/Config.java | 4 +-- 4 files changed, 18 insertions(+), 28 deletions(-) rename application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/{AttachmentListener.java => BlacklistedAttachmentListener.java} (76%) diff --git a/application/config.json.template b/application/config.json.template index 455846bc29..31408b3995 100644 --- a/application/config.json.template +++ b/application/config.json.template @@ -46,7 +46,6 @@ "categoryRoleSuffix": " - Helper" }, "blacklistedFileExtension": [ - "exe", - "tar" + "exe" ] } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/Features.java b/application/src/main/java/org/togetherjava/tjbot/commands/Features.java index 884bee894b..ee5858c994 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/Features.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/Features.java @@ -11,7 +11,7 @@ import org.togetherjava.tjbot.commands.mathcommands.TeXCommand; import org.togetherjava.tjbot.commands.mathcommands.wolframalpha.WolframAlphaCommand; import org.togetherjava.tjbot.commands.moderation.*; -import org.togetherjava.tjbot.commands.moderation.attachment.AttachmentListener; +import org.togetherjava.tjbot.commands.moderation.attachment.BlacklistedAttachmentListener; import org.togetherjava.tjbot.commands.moderation.scam.ScamBlocker; import org.togetherjava.tjbot.commands.moderation.scam.ScamHistoryPurgeRoutine; import org.togetherjava.tjbot.commands.moderation.scam.ScamHistoryStore; @@ -85,7 +85,7 @@ public enum Features { features.add(new ScamBlocker(actionsStore, scamHistoryStore, config)); features.add(new ImplicitAskListener(config, helpSystemHelper)); features.add(new FileSharingMessageListener(config)); - features.add(new AttachmentListener(config, modAuditLogWriter)); + features.add(new BlacklistedAttachmentListener(config, modAuditLogWriter)); // Event receivers features.add(new RejoinModerationRoleListener(actionsStore, config)); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java similarity index 76% rename from application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java rename to application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java index 8a4d018798..1858b19881 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/AttachmentListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java @@ -13,20 +13,15 @@ import org.togetherjava.tjbot.moderation.ModAuditLogWriter; import java.awt.*; -import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; /** - * Listener that receives all sent messages in every channel and checks if the message has any - * blacklisted file attached. - *

- * If there was a blacklisted file attached, delete the message and send the user a dm, telling what - * they did wrong and also inform the mods. + * Reacts to blacklisted attachmenents being posted, upon which they are deleted. */ -public class AttachmentListener extends MessageReceiverAdapter { - private final Config config; +public class BlacklistedAttachmentListener extends MessageReceiverAdapter { private final ModAuditLogWriter modAuditLogWriter; + private final List blacklistedFileExtensions; /** * Creates a AttachmentListener to receive all message sent in any channel. @@ -34,11 +29,11 @@ public class AttachmentListener extends MessageReceiverAdapter { * @param config to find the blacklisted media attachments * @param modAuditLogWriter to inform the mods about the suspicious attachment */ - public AttachmentListener(@NotNull Config config, + public BlacklistedAttachmentListener(@NotNull Config config, @NotNull ModAuditLogWriter modAuditLogWriter) { super(Pattern.compile(".*")); - this.config = config; this.modAuditLogWriter = modAuditLogWriter; + this.blacklistedFileExtensions = config.getBlacklistedFileExtensions(); } @Override @@ -46,7 +41,7 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) { if (event.getAuthor().isBot() || event.isWebhookMessage()) { return; } - if (attachmentContainsBlacklistedFileExtension(event.getMessage())) { + if (doesMessageContainBlacklistedContent(event.getMessage())) { handleBadMessage(event); warnMods(event); } @@ -68,7 +63,7 @@ private Message createDmMessage(Message originalMessage) { String blacklistedAttachments = getBlacklistedAttachmentsFromMessage(originalMessage); String dmMessageContent = "Hey there, you posted a message with a blacklisted file attachment: %s. Following file extension are blacklisted: %s ." - .formatted(blacklistedAttachments, config.getBlacklistedFileExtensions()); + .formatted(blacklistedAttachments, blacklistedFileExtensions); // No embedded needed if there was no message from the user if (StringUtils.isEmpty(originalMessageContent)) { return new MessageBuilder(dmMessageContent).build(); @@ -86,22 +81,18 @@ private Message createMessageWithOriginalMessageAsEmbedded(String originalMessag } private String getBlacklistedAttachmentsFromMessage(Message originalMessage) { - List blacklistedAttachments = new ArrayList<>(); - originalMessage.getAttachments() + List blacklistedAttachments = originalMessage.getAttachments() .stream() - .filter(attachment -> config.getBlacklistedFileExtensions() - .contains(attachment.getFileExtension())) - .forEach(attachment -> blacklistedAttachments.add(attachment.getFileName())); + .filter(attachment -> blacklistedFileExtensions.contains(attachment.getFileExtension())) + .map(Message.Attachment::getFileName) + .toList(); return String.join(", ", blacklistedAttachments); } - private boolean attachmentContainsBlacklistedFileExtension(Message message) { + private boolean doesMessageContainBlacklistedContent(Message message) { List attachments = message.getAttachments(); - if (attachments.isEmpty()) { - return false; - } return attachments.stream() - .anyMatch(attachment -> config.getBlacklistedFileExtensions() + .anyMatch(attachment -> blacklistedFileExtensions .contains(attachment.getFileExtension())); } diff --git a/application/src/main/java/org/togetherjava/tjbot/config/Config.java b/application/src/main/java/org/togetherjava/tjbot/config/Config.java index bf222871d1..f50b9d989c 100644 --- a/application/src/main/java/org/togetherjava/tjbot/config/Config.java +++ b/application/src/main/java/org/togetherjava/tjbot/config/Config.java @@ -223,9 +223,9 @@ public String getQuarantinedRolePattern() { } /** - * Gets a list of all blacklistedFileExtensions. + * Gets a list of all blacklisted file extensions. * - * @return a list of all blacklistedFileExtensions + * @return a list of all blacklisted file extensions */ public @NotNull List getBlacklistedFileExtensions() { return Collections.unmodifiableList(blacklistedFileExtension); From f45d56c13267f4afcb8392fef25df619b6b43d29 Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sat, 27 Aug 2022 21:23:39 +0200 Subject: [PATCH 06/16] added review feedback --- .../BlacklistedAttachmentListener.java | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java index 1858b19881..78aaa32ee4 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java @@ -7,7 +7,6 @@ import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.requests.RestAction; import org.jetbrains.annotations.NotNull; -import org.jooq.tools.StringUtils; import org.togetherjava.tjbot.commands.MessageReceiverAdapter; import org.togetherjava.tjbot.config.Config; import org.togetherjava.tjbot.moderation.ModAuditLogWriter; @@ -42,37 +41,37 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) { return; } if (doesMessageContainBlacklistedContent(event.getMessage())) { - handleBadMessage(event); - warnMods(event); + handleBadMessage(event.getMessage()); + warnMods(event.getMessage()); } } - private void handleBadMessage(@NotNull MessageReceivedEvent event) { - event.getMessage().delete().flatMap(any -> dmUser(event)).queue(); + private void handleBadMessage(@NotNull Message message) { + message.delete().flatMap(any -> dmUser(message)).queue(); } - private RestAction dmUser(@NotNull MessageReceivedEvent event) { - Message dmMessage = createDmMessage(event.getMessage()); - return event.getJDA() - .openPrivateChannelById(event.getAuthor().getIdLong()) + private RestAction dmUser(@NotNull Message message) { + Message dmMessage = createDmMessage(message); + return message.getJDA() + .openPrivateChannelById(message.getAuthor().getIdLong()) .flatMap(channel -> channel.sendMessage(dmMessage)); } private Message createDmMessage(Message originalMessage) { String originalMessageContent = originalMessage.getContentDisplay(); - String blacklistedAttachments = getBlacklistedAttachmentsFromMessage(originalMessage); + String blacklistedAttachments = + String.join(", ", getBlacklistedAttachmentsFromMessage(originalMessage)); String dmMessageContent = "Hey there, you posted a message with a blacklisted file attachment: %s. Following file extension are blacklisted: %s ." .formatted(blacklistedAttachments, blacklistedFileExtensions); // No embedded needed if there was no message from the user - if (StringUtils.isEmpty(originalMessageContent)) { + if (originalMessageContent.isEmpty()) { return new MessageBuilder(dmMessageContent).build(); } - return createMessageWithOriginalMessageAsEmbedded(originalMessageContent, dmMessageContent); + return createBaseResponse(originalMessageContent, dmMessageContent); } - private Message createMessageWithOriginalMessageAsEmbedded(String originalMessageContent, - String dmMessageContent) { + private Message createBaseResponse(String originalMessageContent, String dmMessageContent) { MessageEmbed originalMessageEmbed = new EmbedBuilder().setDescription(originalMessageContent) .setColor(Color.ORANGE) @@ -80,13 +79,12 @@ private Message createMessageWithOriginalMessageAsEmbedded(String originalMessag return new MessageBuilder(dmMessageContent).setEmbeds(originalMessageEmbed).build(); } - private String getBlacklistedAttachmentsFromMessage(Message originalMessage) { - List blacklistedAttachments = originalMessage.getAttachments() + private List getBlacklistedAttachmentsFromMessage(Message originalMessage) { + return originalMessage.getAttachments() .stream() .filter(attachment -> blacklistedFileExtensions.contains(attachment.getFileExtension())) .map(Message.Attachment::getFileName) .toList(); - return String.join(", ", blacklistedAttachments); } private boolean doesMessageContainBlacklistedContent(Message message) { @@ -96,14 +94,13 @@ private boolean doesMessageContainBlacklistedContent(Message message) { .contains(attachment.getFileExtension())); } - private void warnMods(@NotNull MessageReceivedEvent event) { - Message sentUserMessage = event.getMessage(); + private void warnMods(@NotNull Message sentUserMessage) { String blacklistedAttachmentsFromMessage = - getBlacklistedAttachmentsFromMessage(sentUserMessage); + String.join(", ", getBlacklistedAttachmentsFromMessage(sentUserMessage)); modAuditLogWriter.write( - "Message with blacklisted attachment detected: %s" + "Message with blacklisted content detected: %s" .formatted(blacklistedAttachmentsFromMessage), - "Sent Message: %s".formatted(sentUserMessage), event.getAuthor(), - sentUserMessage.getTimeCreated(), event.getGuild()); + "Sent Message: %s".formatted(sentUserMessage), sentUserMessage.getAuthor(), + sentUserMessage.getTimeCreated(), sentUserMessage.getGuild()); } } From aabb469c1640aeaf553d208e8f81352cfc9aa75a Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sat, 27 Aug 2022 21:50:09 +0200 Subject: [PATCH 07/16] added review feedback --- application/config.json.template | 39 ++++++++++++++++++- .../BlacklistedAttachmentListener.java | 6 ++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/application/config.json.template b/application/config.json.template index 31408b3995..7522287207 100644 --- a/application/config.json.template +++ b/application/config.json.template @@ -46,6 +46,43 @@ "categoryRoleSuffix": " - Helper" }, "blacklistedFileExtension": [ - "exe" + "exe", + "pif", + "application", + "gadget", + "msi", + "msp", + "com", + "scr", + "hta", + "cpl", + "msc", + "jar", + "bat", + "cmd", + "vb", + "vbs", + "vbe", + "js", + "jse", + "ws", + "wsf", + "wsh", + "wsc", + "ps1", + "ps1xml", + "ps2", + "ps2xml", + "psc1", + "psc2", + "msh", + "msh1", + "msh2", + "mshxml", + "msh1xml", + "msh2xml", + "scf", + "lnk", + "inf" ] } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java index 78aaa32ee4..19b8084fd3 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java @@ -13,6 +13,7 @@ import java.awt.*; import java.util.List; +import java.util.Objects; import java.util.regex.Pattern; /** @@ -82,7 +83,8 @@ private Message createBaseResponse(String originalMessageContent, String dmMessa private List getBlacklistedAttachmentsFromMessage(Message originalMessage) { return originalMessage.getAttachments() .stream() - .filter(attachment -> blacklistedFileExtensions.contains(attachment.getFileExtension())) + .filter(attachment -> blacklistedFileExtensions + .contains(Objects.requireNonNull(attachment.getFileExtension()).toLowerCase())) .map(Message.Attachment::getFileName) .toList(); } @@ -91,7 +93,7 @@ private boolean doesMessageContainBlacklistedContent(Message message) { List attachments = message.getAttachments(); return attachments.stream() .anyMatch(attachment -> blacklistedFileExtensions - .contains(attachment.getFileExtension())); + .contains(Objects.requireNonNull(attachment.getFileExtension()).toLowerCase())); } private void warnMods(@NotNull Message sentUserMessage) { From e7b44194fc3e8df08fb6db1491622bb461ac8594 Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sat, 27 Aug 2022 21:52:45 +0200 Subject: [PATCH 08/16] added review feedback --- .../src/main/java/org/togetherjava/tjbot/config/Config.java | 1 - 1 file changed, 1 deletion(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/config/Config.java b/application/src/main/java/org/togetherjava/tjbot/config/Config.java index f50b9d989c..0f87cb21d1 100644 --- a/application/src/main/java/org/togetherjava/tjbot/config/Config.java +++ b/application/src/main/java/org/togetherjava/tjbot/config/Config.java @@ -230,5 +230,4 @@ public String getQuarantinedRolePattern() { public @NotNull List getBlacklistedFileExtensions() { return Collections.unmodifiableList(blacklistedFileExtension); } - } From 5143aacead692cc8bb3156ededed3a548e13904a Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sat, 27 Aug 2022 23:38:45 +0200 Subject: [PATCH 09/16] added review feedback --- .../moderation/attachment/BlacklistedAttachmentListener.java | 1 + 1 file changed, 1 insertion(+) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java index 19b8084fd3..4f1b35e690 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java @@ -96,6 +96,7 @@ private boolean doesMessageContainBlacklistedContent(Message message) { .contains(Objects.requireNonNull(attachment.getFileExtension()).toLowerCase())); } + private void warnMods(@NotNull Message sentUserMessage) { String blacklistedAttachmentsFromMessage = String.join(", ", getBlacklistedAttachmentsFromMessage(sentUserMessage)); From 90b6065133b454ff2a8175518ae14ef5a26d0ab1 Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sun, 28 Aug 2022 00:02:31 +0200 Subject: [PATCH 10/16] added review feedback --- application/config.json.template | 52 +++++++++---------- .../BlacklistedAttachmentListener.java | 18 ++++--- 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/application/config.json.template b/application/config.json.template index 7522287207..7f1b661786 100644 --- a/application/config.json.template +++ b/application/config.json.template @@ -46,43 +46,41 @@ "categoryRoleSuffix": " - Helper" }, "blacklistedFileExtension": [ - "exe", - "pif", "application", - "gadget", - "msi", - "msp", - "com", - "scr", - "hta", - "cpl", - "msc", - "jar", "bat", "cmd", - "vb", - "vbs", - "vbe", - "js", + "com", + "cpl", + "exe", + "gadget", + "hta", + "inf" "jse", - "ws", - "wsf", - "wsh", - "wsc", + "lnk", + "msc", + "msh", + "msh1", + "msh1xml", + "msh2", + "msh2xml", + "mshxml", + "msi", + "msp", + "pif", "ps1", "ps1xml", "ps2", "ps2xml", "psc1", "psc2", - "msh", - "msh1", - "msh2", - "mshxml", - "msh1xml", - "msh2xml", "scf", - "lnk", - "inf" + "scr", + "vb", + "vbe", + "vbs", + "ws", + "wsc", + "wsf", + "wsh" ] } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java index 4f1b35e690..4ca319cd72 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java @@ -13,6 +13,7 @@ import java.awt.*; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.regex.Pattern; @@ -63,8 +64,13 @@ private Message createDmMessage(Message originalMessage) { String blacklistedAttachments = String.join(", ", getBlacklistedAttachmentsFromMessage(originalMessage)); String dmMessageContent = - "Hey there, you posted a message with a blacklisted file attachment: %s. Following file extension are blacklisted: %s ." - .formatted(blacklistedAttachments, blacklistedFileExtensions); + """ + Hey there, you posted a message containing a blacklisted file attachment: %s. + We had to delete your message for security reasons. + + Feel free to repost your message without, or with a different file instead. Sorry for any inconvenience caused by this 🙇️ + """ + .formatted(blacklistedAttachments); // No embedded needed if there was no message from the user if (originalMessageContent.isEmpty()) { return new MessageBuilder(dmMessageContent).build(); @@ -83,8 +89,8 @@ private Message createBaseResponse(String originalMessageContent, String dmMessa private List getBlacklistedAttachmentsFromMessage(Message originalMessage) { return originalMessage.getAttachments() .stream() - .filter(attachment -> blacklistedFileExtensions - .contains(Objects.requireNonNull(attachment.getFileExtension()).toLowerCase())) + .filter(attachment -> blacklistedFileExtensions.contains( + Objects.requireNonNull(attachment.getFileExtension()).toLowerCase(Locale.US))) .map(Message.Attachment::getFileName) .toList(); } @@ -92,8 +98,8 @@ private List getBlacklistedAttachmentsFromMessage(Message originalMessag private boolean doesMessageContainBlacklistedContent(Message message) { List attachments = message.getAttachments(); return attachments.stream() - .anyMatch(attachment -> blacklistedFileExtensions - .contains(Objects.requireNonNull(attachment.getFileExtension()).toLowerCase())); + .anyMatch(attachment -> blacklistedFileExtensions.contains( + Objects.requireNonNull(attachment.getFileExtension()).toLowerCase(Locale.US))); } From b94177e35d6ce7f4460cd9a301be5158b2ccfe80 Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sun, 28 Aug 2022 11:25:42 +0200 Subject: [PATCH 11/16] added review feedback --- .../BlacklistedAttachmentListener.java | 28 +++++++++---------- .../org/togetherjava/tjbot/config/Config.java | 20 ++++++++----- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java index 4ca319cd72..a405e3c88c 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java @@ -14,7 +14,6 @@ import java.awt.*; import java.util.List; import java.util.Locale; -import java.util.Objects; import java.util.regex.Pattern; /** @@ -54,13 +53,14 @@ private void handleBadMessage(@NotNull Message message) { private RestAction dmUser(@NotNull Message message) { Message dmMessage = createDmMessage(message); - return message.getJDA() - .openPrivateChannelById(message.getAuthor().getIdLong()) - .flatMap(channel -> channel.sendMessage(dmMessage)); + return message.getAuthor() + .openPrivateChannel() + .flatMap(privateChannel -> privateChannel.sendMessage(dmMessage)); + } private Message createDmMessage(Message originalMessage) { - String originalMessageContent = originalMessage.getContentDisplay(); + String contentRaw = originalMessage.getContentRaw(); String blacklistedAttachments = String.join(", ", getBlacklistedAttachmentsFromMessage(originalMessage)); String dmMessageContent = @@ -71,11 +71,11 @@ private Message createDmMessage(Message originalMessage) { Feel free to repost your message without, or with a different file instead. Sorry for any inconvenience caused by this 🙇️ """ .formatted(blacklistedAttachments); - // No embedded needed if there was no message from the user - if (originalMessageContent.isEmpty()) { + // No embed needed if there was no message from the user + if (contentRaw.isEmpty()) { return new MessageBuilder(dmMessageContent).build(); } - return createBaseResponse(originalMessageContent, dmMessageContent); + return createBaseResponse(contentRaw, dmMessageContent); } private Message createBaseResponse(String originalMessageContent, String dmMessageContent) { @@ -89,17 +89,17 @@ private Message createBaseResponse(String originalMessageContent, String dmMessa private List getBlacklistedAttachmentsFromMessage(Message originalMessage) { return originalMessage.getAttachments() .stream() - .filter(attachment -> blacklistedFileExtensions.contains( - Objects.requireNonNull(attachment.getFileExtension()).toLowerCase(Locale.US))) + .filter(attachment -> blacklistedFileExtensions + .contains(attachment.getFileExtension().toLowerCase(Locale.US))) .map(Message.Attachment::getFileName) .toList(); } private boolean doesMessageContainBlacklistedContent(Message message) { - List attachments = message.getAttachments(); - return attachments.stream() - .anyMatch(attachment -> blacklistedFileExtensions.contains( - Objects.requireNonNull(attachment.getFileExtension()).toLowerCase(Locale.US))); + return message.getAttachments() + .stream() + .anyMatch(attachment -> blacklistedFileExtensions + .contains(attachment.getFileExtension().toLowerCase(Locale.US))); } diff --git a/application/src/main/java/org/togetherjava/tjbot/config/Config.java b/application/src/main/java/org/togetherjava/tjbot/config/Config.java index 677464df7a..9febc042cd 100644 --- a/application/src/main/java/org/togetherjava/tjbot/config/Config.java +++ b/application/src/main/java/org/togetherjava/tjbot/config/Config.java @@ -232,21 +232,27 @@ public HelpSystemConfig getHelpSystem() { } /** - + * * Gets the REGEX pattern used to identify the channel that is supposed to contain only Media. * * @return the channel name pattern */ - + @Nonnull public String getMediaOnlyChannelPattern() { return mediaOnlyChannelPattern; } - - * Gets a list of all blacklisted file extensions. - * - * @return a list of all blacklisted file extensions - */ + + * + + Gets a + list of + all blacklisted + file extensions.**@return + a list + of all + blacklisted file extensions*/ + public @NotNull List getBlacklistedFileExtensions() { return Collections.unmodifiableList(blacklistedFileExtension); } From 8f2d28db4175aba7836cbcc458b5e1f2c9d0ff7a Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sun, 28 Aug 2022 11:29:00 +0200 Subject: [PATCH 12/16] added review feedback --- .../org/togetherjava/tjbot/config/Config.java | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/config/Config.java b/application/src/main/java/org/togetherjava/tjbot/config/Config.java index 9febc042cd..27a2955eba 100644 --- a/application/src/main/java/org/togetherjava/tjbot/config/Config.java +++ b/application/src/main/java/org/togetherjava/tjbot/config/Config.java @@ -232,7 +232,6 @@ public HelpSystemConfig getHelpSystem() { } /** - * * Gets the REGEX pattern used to identify the channel that is supposed to contain only Media. * * @return the channel name pattern @@ -243,16 +242,13 @@ public String getMediaOnlyChannelPattern() { return mediaOnlyChannelPattern; } - * - - Gets a - list of - all blacklisted - file extensions.**@return - a list - of all - blacklisted file extensions*/ + /** + * Gets a list of all blacklisted file extensions.**@return a list of all blacklisted file + * extensions + */ - public @NotNull List getBlacklistedFileExtensions() { + @Nonnull + public List getBlacklistedFileExtensions() { return Collections.unmodifiableList(blacklistedFileExtension); + } } From 416afb7f1be6270bf69aae451fcb55cc73bfe4f2 Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sun, 28 Aug 2022 12:21:36 +0200 Subject: [PATCH 13/16] added review feedback --- .../moderation/attachment/BlacklistedAttachmentListener.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java index a405e3c88c..b6ed553358 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java @@ -43,12 +43,11 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) { } if (doesMessageContainBlacklistedContent(event.getMessage())) { handleBadMessage(event.getMessage()); - warnMods(event.getMessage()); } } private void handleBadMessage(@NotNull Message message) { - message.delete().flatMap(any -> dmUser(message)).queue(); + message.delete().flatMap(any -> dmUser(message)).queue(any -> warnMods(message)); } private RestAction dmUser(@NotNull Message message) { @@ -56,7 +55,6 @@ private RestAction dmUser(@NotNull Message message) { return message.getAuthor() .openPrivateChannel() .flatMap(privateChannel -> privateChannel.sendMessage(dmMessage)); - } private Message createDmMessage(Message originalMessage) { From c72f69b3c1d309830ceef98b796b151396db5357 Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sun, 28 Aug 2022 12:27:30 +0200 Subject: [PATCH 14/16] fixed typo --- .../moderation/attachment/BlacklistedAttachmentListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java index b6ed553358..d1146fddf7 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java @@ -17,7 +17,7 @@ import java.util.regex.Pattern; /** - * Reacts to blacklisted attachmenents being posted, upon which they are deleted. + * Reacts to blacklisted attachments being posted, upon which they are deleted. */ public class BlacklistedAttachmentListener extends MessageReceiverAdapter { private final ModAuditLogWriter modAuditLogWriter; From 9db679cd0e353fc9071ee1f26102721f6f21f2ab Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Sun, 28 Aug 2022 18:38:43 +0200 Subject: [PATCH 15/16] added review feedback --- .../attachment/BlacklistedAttachmentListener.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java index d1146fddf7..cdf1d9ea5a 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java @@ -6,7 +6,6 @@ import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.requests.RestAction; -import org.jetbrains.annotations.NotNull; import org.togetherjava.tjbot.commands.MessageReceiverAdapter; import org.togetherjava.tjbot.config.Config; import org.togetherjava.tjbot.moderation.ModAuditLogWriter; @@ -29,15 +28,14 @@ public class BlacklistedAttachmentListener extends MessageReceiverAdapter { * @param config to find the blacklisted media attachments * @param modAuditLogWriter to inform the mods about the suspicious attachment */ - public BlacklistedAttachmentListener(@NotNull Config config, - @NotNull ModAuditLogWriter modAuditLogWriter) { + public BlacklistedAttachmentListener(Config config, ModAuditLogWriter modAuditLogWriter) { super(Pattern.compile(".*")); this.modAuditLogWriter = modAuditLogWriter; this.blacklistedFileExtensions = config.getBlacklistedFileExtensions(); } @Override - public void onMessageReceived(@NotNull MessageReceivedEvent event) { + public void onMessageReceived(MessageReceivedEvent event) { if (event.getAuthor().isBot() || event.isWebhookMessage()) { return; } @@ -46,11 +44,11 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) { } } - private void handleBadMessage(@NotNull Message message) { + private void handleBadMessage(Message message) { message.delete().flatMap(any -> dmUser(message)).queue(any -> warnMods(message)); } - private RestAction dmUser(@NotNull Message message) { + private RestAction dmUser(Message message) { Message dmMessage = createDmMessage(message); return message.getAuthor() .openPrivateChannel() @@ -100,8 +98,7 @@ private boolean doesMessageContainBlacklistedContent(Message message) { .contains(attachment.getFileExtension().toLowerCase(Locale.US))); } - - private void warnMods(@NotNull Message sentUserMessage) { + private void warnMods(Message sentUserMessage) { String blacklistedAttachmentsFromMessage = String.join(", ", getBlacklistedAttachmentsFromMessage(sentUserMessage)); modAuditLogWriter.write( From f3ab6f4f2620a5bb533fea74ff865dbd7ff40c20 Mon Sep 17 00:00:00 2001 From: MartinReinhart Date: Mon, 29 Aug 2022 12:30:15 +0200 Subject: [PATCH 16/16] added review feedback --- .../attachment/BlacklistedAttachmentListener.java | 10 +++++++++- .../java/org/togetherjava/tjbot/config/Config.java | 7 +++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java index cdf1d9ea5a..5fbc6cd0a2 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/attachment/BlacklistedAttachmentListener.java @@ -10,6 +10,7 @@ import org.togetherjava.tjbot.config.Config; import org.togetherjava.tjbot.moderation.ModAuditLogWriter; +import javax.annotation.Nonnull; import java.awt.*; import java.util.List; import java.util.Locale; @@ -18,7 +19,7 @@ /** * Reacts to blacklisted attachments being posted, upon which they are deleted. */ -public class BlacklistedAttachmentListener extends MessageReceiverAdapter { +public final class BlacklistedAttachmentListener extends MessageReceiverAdapter { private final ModAuditLogWriter modAuditLogWriter; private final List blacklistedFileExtensions; @@ -48,6 +49,7 @@ private void handleBadMessage(Message message) { message.delete().flatMap(any -> dmUser(message)).queue(any -> warnMods(message)); } + @Nonnull private RestAction dmUser(Message message) { Message dmMessage = createDmMessage(message); return message.getAuthor() @@ -55,10 +57,12 @@ private RestAction dmUser(Message message) { .flatMap(privateChannel -> privateChannel.sendMessage(dmMessage)); } + @Nonnull private Message createDmMessage(Message originalMessage) { String contentRaw = originalMessage.getContentRaw(); String blacklistedAttachments = String.join(", ", getBlacklistedAttachmentsFromMessage(originalMessage)); + String dmMessageContent = """ Hey there, you posted a message containing a blacklisted file attachment: %s. @@ -67,6 +71,7 @@ private Message createDmMessage(Message originalMessage) { Feel free to repost your message without, or with a different file instead. Sorry for any inconvenience caused by this 🙇️ """ .formatted(blacklistedAttachments); + // No embed needed if there was no message from the user if (contentRaw.isEmpty()) { return new MessageBuilder(dmMessageContent).build(); @@ -74,6 +79,7 @@ private Message createDmMessage(Message originalMessage) { return createBaseResponse(contentRaw, dmMessageContent); } + @Nonnull private Message createBaseResponse(String originalMessageContent, String dmMessageContent) { MessageEmbed originalMessageEmbed = new EmbedBuilder().setDescription(originalMessageContent) @@ -82,6 +88,7 @@ private Message createBaseResponse(String originalMessageContent, String dmMessa return new MessageBuilder(dmMessageContent).setEmbeds(originalMessageEmbed).build(); } + @Nonnull private List getBlacklistedAttachmentsFromMessage(Message originalMessage) { return originalMessage.getAttachments() .stream() @@ -101,6 +108,7 @@ private boolean doesMessageContainBlacklistedContent(Message message) { private void warnMods(Message sentUserMessage) { String blacklistedAttachmentsFromMessage = String.join(", ", getBlacklistedAttachmentsFromMessage(sentUserMessage)); + modAuditLogWriter.write( "Message with blacklisted content detected: %s" .formatted(blacklistedAttachmentsFromMessage), diff --git a/application/src/main/java/org/togetherjava/tjbot/config/Config.java b/application/src/main/java/org/togetherjava/tjbot/config/Config.java index 27a2955eba..116799262a 100644 --- a/application/src/main/java/org/togetherjava/tjbot/config/Config.java +++ b/application/src/main/java/org/togetherjava/tjbot/config/Config.java @@ -236,17 +236,16 @@ public HelpSystemConfig getHelpSystem() { * * @return the channel name pattern */ - @Nonnull public String getMediaOnlyChannelPattern() { return mediaOnlyChannelPattern; } /** - * Gets a list of all blacklisted file extensions.**@return a list of all blacklisted file - * extensions + * Gets a list of all blacklisted file extensions. + * + * @return a list of all blacklisted file extensions */ - @Nonnull public List getBlacklistedFileExtensions() { return Collections.unmodifiableList(blacklistedFileExtension);