From 32bb5380ff1304e1e4affcefd6b935c4a35d02f9 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Mon, 24 Oct 2022 08:22:50 +0200 Subject: [PATCH 01/26] Report Command --- .../togetherjava/tjbot/commands/Features.java | 2 + .../moderation/modmail/ModMailCommand.java | 2 +- .../moderation/report/ReportCommand.java | 170 ++++++++++++++++++ .../moderation/report/package-info.java | 11 ++ 4 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java create mode 100644 application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/package-info.java 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 853b5be019..9263ab1088 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/Features.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/Features.java @@ -15,6 +15,7 @@ import org.togetherjava.tjbot.commands.moderation.*; import org.togetherjava.tjbot.commands.moderation.attachment.BlacklistedAttachmentListener; import org.togetherjava.tjbot.commands.moderation.modmail.ModMailCommand; +import org.togetherjava.tjbot.commands.moderation.report.ReportCommand; import org.togetherjava.tjbot.commands.moderation.scam.ScamBlocker; import org.togetherjava.tjbot.commands.moderation.scam.ScamHistoryPurgeRoutine; import org.togetherjava.tjbot.commands.moderation.scam.ScamHistoryStore; @@ -132,6 +133,7 @@ public static Collection createFeatures(JDA jda, Database database, Con features.add(new AskCommand(config, helpSystemHelper, database)); features.add(new ModMailCommand(jda, config)); features.add(new HelpThreadCommand(config, helpSystemHelper)); + features.add(new ReportCommand(config)); // Mixtures features.add(new HelpThreadOverviewUpdater(config, helpSystemHelper)); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/modmail/ModMailCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/modmail/ModMailCommand.java index c50f8af208..8a83c3badb 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/modmail/ModMailCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/modmail/ModMailCommand.java @@ -35,7 +35,7 @@ /** * Implements the /modmail command, which allows users to contact a moderator within the server * which forwards messages to moderators in a dedicated channel given by - * {@link Config#getModAuditLogChannelPattern()}. + * {@link Config#getModMailChannelPattern()}. */ public final class ModMailCommand extends SlashCommandAdapter { diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java new file mode 100644 index 0000000000..a88fc0dbf6 --- /dev/null +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java @@ -0,0 +1,170 @@ +package org.togetherjava.tjbot.commands.moderation.report; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.MessageEmbed; +import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; +import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; +import net.dv8tion.jda.api.events.interaction.command.MessageContextInteractionEvent; +import net.dv8tion.jda.api.interactions.InteractionHook; +import net.dv8tion.jda.api.interactions.commands.build.Commands; +import net.dv8tion.jda.api.interactions.components.Modal; +import net.dv8tion.jda.api.interactions.components.text.TextInput; +import net.dv8tion.jda.api.interactions.components.text.TextInputStyle; +import net.dv8tion.jda.api.requests.restaction.MessageCreateAction; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.togetherjava.tjbot.commands.BotCommandAdapter; +import org.togetherjava.tjbot.commands.CommandVisibility; +import org.togetherjava.tjbot.commands.MessageContextCommand; +import org.togetherjava.tjbot.config.Config; + +import java.awt.*; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; +import java.util.regex.Pattern; + + +/** + * Implements the /report command, which allows users to contact a moderator within the server which + * forwards messages to moderators in a dedicated channel given by + * {@link Config#getModMailChannelPattern()} ()}. + */ + +public final class ReportCommand extends BotCommandAdapter implements MessageContextCommand { + + private static final Logger logger = LoggerFactory.getLogger(ReportCommand.class); + public static final String COMMAND_NAME = "report"; + private static final String MESSAGE_INPUT = "message"; + private static final int COOLDOWN_DURATION_VALUE = 3; + private static final ChronoUnit COOLDOWN_DURATION_UNIT = ChronoUnit.MINUTES; + private static final Color AMBIENT_COLOR = Color.BLACK; + public static String REPORTED_MESSAGE; + public static String REPORTED_MESSAGE_URL; + private final Cache authorToLastModMailInvocation = createCooldownCache(); + private final Predicate modMailChannelNamePredicate; + private final String configModMailChannelPattern; + + public ReportCommand(Config config) { + super(Commands.message(COMMAND_NAME), CommandVisibility.GUILD); + + modMailChannelNamePredicate = + Pattern.compile(config.getModMailChannelPattern()).asMatchPredicate(); + + configModMailChannelPattern = config.getModMailChannelPattern(); + } + + private Cache createCooldownCache() { + return Caffeine.newBuilder() + .maximumSize(1_000) + .expireAfterAccess(COOLDOWN_DURATION_VALUE, TimeUnit.of(COOLDOWN_DURATION_UNIT)) + .build(); + } + + @Override + public void onMessageContext(MessageContextInteractionEvent event) { + REPORTED_MESSAGE = event.getTarget().getContentRaw(); + REPORTED_MESSAGE_URL = event.getTarget().getJumpUrl(); + + TextInput body = TextInput.create(MESSAGE_INPUT, "Message", TextInputStyle.PARAGRAPH) + .setPlaceholder("Reason for reporting") + .setRequiredRange(10, 200) + .build(); + + Modal modal = Modal.create(generateComponentId(), "Report").addActionRow(body).build(); + + event.replyModal(modal).queue(); + } + + @Override + public void onModalSubmitted(ModalInteractionEvent event, List args) { + long userId = event.getUser().getIdLong(); + + if (handleIsOnCooldown(userId, event)) { + return; + } + authorToLastModMailInvocation.put(userId, Instant.now()); + event.deferReply().setEphemeral(true).queue(); + + long guildId = Objects.requireNonNull(event.getGuild(), "Could not retrieve the guildId.") + .getIdLong(); + Optional modMailAuditLog = getModMailChannel(event.getJDA(), guildId); + if (modMailAuditLog.isEmpty()) { + logger.warn( + "Cannot find the designated modmail channel in server by id {} with the pattern {}", + guildId, configModMailChannelPattern); + return; + } + String modalMessage = event.getValue(MESSAGE_INPUT).getAsString(); + MessageCreateAction message = + createModMessage(modalMessage, userId, modMailAuditLog.orElseThrow()); + + sendMessage(event, message); + + event.getHook().editOriginal("Thank you for your feedback!").queue(); + + } + + private boolean handleIsOnCooldown(long userId, ModalInteractionEvent event) { + if (!isChannelOnCooldown(userId)) { + return false; + } + event.reply("Can only be used once per %s minutes.".formatted(COOLDOWN_DURATION_VALUE)) + .setEphemeral(true) + .queue(); + return true; + } + + private boolean isChannelOnCooldown(long userId) { + return Optional.ofNullable(authorToLastModMailInvocation.getIfPresent(userId)) + .map(sinceCommandInvoked -> sinceCommandInvoked.plus(COOLDOWN_DURATION_VALUE, + COOLDOWN_DURATION_UNIT)) + .filter(Instant.now()::isBefore) + .isPresent(); + } + + private Optional getModMailChannel(JDA jda, long guildId) { + return jda.getGuildById(guildId) + .getTextChannelCache() + .stream() + .filter(channel -> modMailChannelNamePredicate.test(channel.getName())) + .findAny(); + } + + private MessageCreateAction createModMessage(String modalMessage, long userID, + TextChannel modMailAuditLog) { + return modMailAuditLog.sendMessageEmbeds(createReportMessage(modalMessage, userID)); + } + + private void sendMessage(ModalInteractionEvent event, MessageCreateAction message) { + InteractionHook hook = event.getHook(); + message.mapToResult().map(result -> { + if (result.isSuccess()) { + return "Your message has been forwarded, thanks."; + } + logger.warn("There was an issue with forwarding users message."); + return "There was an issue forwarding your message, sorry. We are investigating."; + }).flatMap(hook::editOriginal).queue(); + } + + private MessageEmbed createReportMessage(String modalMessage, long userId) { + return new EmbedBuilder().setTitle("Report") + .setDescription((""" + Reported Message: **%s** + [Reported Message URL](%s) + Modal Message: **%s**""").formatted(REPORTED_MESSAGE, REPORTED_MESSAGE_URL, + modalMessage)) + .setAuthor("Author ID: %s".formatted(userId)) + .setColor(AMBIENT_COLOR) + .setTimestamp(Instant.now()) + .build(); + } +} diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/package-info.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/package-info.java new file mode 100644 index 0000000000..dc98de6cbb --- /dev/null +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/package-info.java @@ -0,0 +1,11 @@ +/** + * This packages offers all the functionality for messaging moderators trough report see + * {@link org.togetherjava.tjbot.commands.moderation.report.ReportCommand} as main entry point. + */ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package org.togetherjava.tjbot.commands.moderation.report; + +import org.togetherjava.tjbot.annotations.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; From ccc131f035dc87a68f438147af5a6627a02f3253 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Mon, 24 Oct 2022 08:32:38 +0200 Subject: [PATCH 02/26] making fields private --- .../tjbot/commands/moderation/report/ReportCommand.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java index a88fc0dbf6..2b97a7c044 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java @@ -42,13 +42,13 @@ public final class ReportCommand extends BotCommandAdapter implements MessageContextCommand { private static final Logger logger = LoggerFactory.getLogger(ReportCommand.class); - public static final String COMMAND_NAME = "report"; + private static final String COMMAND_NAME = "report"; private static final String MESSAGE_INPUT = "message"; private static final int COOLDOWN_DURATION_VALUE = 3; private static final ChronoUnit COOLDOWN_DURATION_UNIT = ChronoUnit.MINUTES; private static final Color AMBIENT_COLOR = Color.BLACK; - public static String REPORTED_MESSAGE; - public static String REPORTED_MESSAGE_URL; + private static String REPORTED_MESSAGE; + private static String REPORTED_MESSAGE_URL; private final Cache authorToLastModMailInvocation = createCooldownCache(); private final Predicate modMailChannelNamePredicate; private final String configModMailChannelPattern; From de77ea1686231774db59f14d8f828647c4c4ec13 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Mon, 24 Oct 2022 08:36:07 +0200 Subject: [PATCH 03/26] removing Constant, naming convention since its not a constant --- .../commands/moderation/report/ReportCommand.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java index 2b97a7c044..9b24bf9b3d 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java @@ -47,8 +47,8 @@ public final class ReportCommand extends BotCommandAdapter implements MessageCon private static final int COOLDOWN_DURATION_VALUE = 3; private static final ChronoUnit COOLDOWN_DURATION_UNIT = ChronoUnit.MINUTES; private static final Color AMBIENT_COLOR = Color.BLACK; - private static String REPORTED_MESSAGE; - private static String REPORTED_MESSAGE_URL; + private static String reportedMessage; + private static String reportedMessageUrl; private final Cache authorToLastModMailInvocation = createCooldownCache(); private final Predicate modMailChannelNamePredicate; private final String configModMailChannelPattern; @@ -71,8 +71,8 @@ private Cache createCooldownCache() { @Override public void onMessageContext(MessageContextInteractionEvent event) { - REPORTED_MESSAGE = event.getTarget().getContentRaw(); - REPORTED_MESSAGE_URL = event.getTarget().getJumpUrl(); + reportedMessage = event.getTarget().getContentRaw(); + reportedMessageUrl = event.getTarget().getJumpUrl(); TextInput body = TextInput.create(MESSAGE_INPUT, "Message", TextInputStyle.PARAGRAPH) .setPlaceholder("Reason for reporting") @@ -160,7 +160,7 @@ private MessageEmbed createReportMessage(String modalMessage, long userId) { .setDescription((""" Reported Message: **%s** [Reported Message URL](%s) - Modal Message: **%s**""").formatted(REPORTED_MESSAGE, REPORTED_MESSAGE_URL, + Modal Message: **%s**""").formatted(reportedMessage, reportedMessageUrl, modalMessage)) .setAuthor("Author ID: %s".formatted(userId)) .setColor(AMBIENT_COLOR) From 3f9e4341e0b45db18afb2474704c51d4ff6b0eb4 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Mon, 24 Oct 2022 08:39:42 +0200 Subject: [PATCH 04/26] Instance methods writing to static fields fix --- .../tjbot/commands/moderation/report/ReportCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java index 9b24bf9b3d..69cc051252 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java @@ -47,11 +47,11 @@ public final class ReportCommand extends BotCommandAdapter implements MessageCon private static final int COOLDOWN_DURATION_VALUE = 3; private static final ChronoUnit COOLDOWN_DURATION_UNIT = ChronoUnit.MINUTES; private static final Color AMBIENT_COLOR = Color.BLACK; - private static String reportedMessage; - private static String reportedMessageUrl; private final Cache authorToLastModMailInvocation = createCooldownCache(); private final Predicate modMailChannelNamePredicate; private final String configModMailChannelPattern; + private String reportedMessage; + private String reportedMessageUrl; public ReportCommand(Config config) { super(Commands.message(COMMAND_NAME), CommandVisibility.GUILD); From 03492dfe551fa7c0b97c0fdd0d64ce6fd6a9a49b Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Mon, 24 Oct 2022 08:44:36 +0200 Subject: [PATCH 05/26] Adding comments for constructor --- .../tjbot/commands/moderation/report/ReportCommand.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java index 69cc051252..0ecf50133c 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java @@ -53,6 +53,11 @@ public final class ReportCommand extends BotCommandAdapter implements MessageCon private String reportedMessage; private String reportedMessageUrl; + /** + * Creates a new instance. + * + * @param config to get the channel to forward reports to + */ public ReportCommand(Config config) { super(Commands.message(COMMAND_NAME), CommandVisibility.GUILD); From 1cfed5e1f655b3be8ae99bcbd9210abd2c2116aa Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Mon, 24 Oct 2022 08:58:19 +0200 Subject: [PATCH 06/26] Little spelling improvements, comment improvements and capitalization --- .../moderation/report/ReportCommand.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java index 0ecf50133c..2d7c9e3538 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java @@ -47,7 +47,7 @@ public final class ReportCommand extends BotCommandAdapter implements MessageCon private static final int COOLDOWN_DURATION_VALUE = 3; private static final ChronoUnit COOLDOWN_DURATION_UNIT = ChronoUnit.MINUTES; private static final Color AMBIENT_COLOR = Color.BLACK; - private final Cache authorToLastModMailInvocation = createCooldownCache(); + private final Cache authorToLastReportInvocation = createCooldownCache(); private final Predicate modMailChannelNamePredicate; private final String configModMailChannelPattern; private String reportedMessage; @@ -56,7 +56,7 @@ public final class ReportCommand extends BotCommandAdapter implements MessageCon /** * Creates a new instance. * - * @param config to get the channel to forward reports to + * @param config to get the channel to forward reports to. */ public ReportCommand(Config config) { super(Commands.message(COMMAND_NAME), CommandVisibility.GUILD); @@ -91,26 +91,26 @@ public void onMessageContext(MessageContextInteractionEvent event) { @Override public void onModalSubmitted(ModalInteractionEvent event, List args) { - long userId = event.getUser().getIdLong(); + long userID = event.getUser().getIdLong(); - if (handleIsOnCooldown(userId, event)) { + if (handleIsOnCooldown(userID, event)) { return; } - authorToLastModMailInvocation.put(userId, Instant.now()); + authorToLastReportInvocation.put(userID, Instant.now()); event.deferReply().setEphemeral(true).queue(); - long guildId = Objects.requireNonNull(event.getGuild(), "Could not retrieve the guildId.") + long guildID = Objects.requireNonNull(event.getGuild(), "Could not retrieve the guildId.") .getIdLong(); - Optional modMailAuditLog = getModMailChannel(event.getJDA(), guildId); + Optional modMailAuditLog = getModMailChannel(event.getJDA(), guildID); if (modMailAuditLog.isEmpty()) { logger.warn( "Cannot find the designated modmail channel in server by id {} with the pattern {}", - guildId, configModMailChannelPattern); + guildID, configModMailChannelPattern); return; } String modalMessage = event.getValue(MESSAGE_INPUT).getAsString(); MessageCreateAction message = - createModMessage(modalMessage, userId, modMailAuditLog.orElseThrow()); + createModMessage(modalMessage, userID, modMailAuditLog.orElseThrow()); sendMessage(event, message); @@ -118,8 +118,8 @@ public void onModalSubmitted(ModalInteractionEvent event, List args) { } - private boolean handleIsOnCooldown(long userId, ModalInteractionEvent event) { - if (!isChannelOnCooldown(userId)) { + private boolean handleIsOnCooldown(long userID, ModalInteractionEvent event) { + if (!isChannelOnCooldown(userID)) { return false; } event.reply("Can only be used once per %s minutes.".formatted(COOLDOWN_DURATION_VALUE)) @@ -129,15 +129,15 @@ private boolean handleIsOnCooldown(long userId, ModalInteractionEvent event) { } private boolean isChannelOnCooldown(long userId) { - return Optional.ofNullable(authorToLastModMailInvocation.getIfPresent(userId)) + return Optional.ofNullable(authorToLastReportInvocation.getIfPresent(userId)) .map(sinceCommandInvoked -> sinceCommandInvoked.plus(COOLDOWN_DURATION_VALUE, COOLDOWN_DURATION_UNIT)) .filter(Instant.now()::isBefore) .isPresent(); } - private Optional getModMailChannel(JDA jda, long guildId) { - return jda.getGuildById(guildId) + private Optional getModMailChannel(JDA jda, long guildID) { + return jda.getGuildById(guildID) .getTextChannelCache() .stream() .filter(channel -> modMailChannelNamePredicate.test(channel.getName())) @@ -160,14 +160,14 @@ private void sendMessage(ModalInteractionEvent event, MessageCreateAction messag }).flatMap(hook::editOriginal).queue(); } - private MessageEmbed createReportMessage(String modalMessage, long userId) { + private MessageEmbed createReportMessage(String modalMessage, long userID) { return new EmbedBuilder().setTitle("Report") .setDescription((""" Reported Message: **%s** [Reported Message URL](%s) Modal Message: **%s**""").formatted(reportedMessage, reportedMessageUrl, modalMessage)) - .setAuthor("Author ID: %s".formatted(userId)) + .setAuthor("Author ID: %s".formatted(userID)) .setColor(AMBIENT_COLOR) .setTimestamp(Instant.now()) .build(); From 4b136b70b6ee3e2767ccf61fb64a3e78c2707ce9 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Thu, 27 Oct 2022 10:10:55 +0200 Subject: [PATCH 07/26] Making improvements, requested --- .../togetherjava/tjbot/commands/Features.java | 2 +- .../{report => }/ReportCommand.java | 87 +++++++++++-------- .../moderation/report/package-info.java | 11 --- 3 files changed, 50 insertions(+), 50 deletions(-) rename application/src/main/java/org/togetherjava/tjbot/commands/moderation/{report => }/ReportCommand.java (70%) delete mode 100644 application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/package-info.java 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 9263ab1088..91585101ea 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/Features.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/Features.java @@ -13,9 +13,9 @@ import org.togetherjava.tjbot.commands.mathcommands.wolframalpha.WolframAlphaCommand; import org.togetherjava.tjbot.commands.mediaonly.MediaOnlyChannelListener; import org.togetherjava.tjbot.commands.moderation.*; +import org.togetherjava.tjbot.commands.moderation.ReportCommand; import org.togetherjava.tjbot.commands.moderation.attachment.BlacklistedAttachmentListener; import org.togetherjava.tjbot.commands.moderation.modmail.ModMailCommand; -import org.togetherjava.tjbot.commands.moderation.report.ReportCommand; import org.togetherjava.tjbot.commands.moderation.scam.ScamBlocker; import org.togetherjava.tjbot.commands.moderation.scam.ScamHistoryPurgeRoutine; import org.togetherjava.tjbot.commands.moderation.scam.ScamHistoryStore; diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java similarity index 70% rename from application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java rename to application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index 2d7c9e3538..541533ba71 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -1,4 +1,4 @@ -package org.togetherjava.tjbot.commands.moderation.report; +package org.togetherjava.tjbot.commands.moderation; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; @@ -36,27 +36,27 @@ /** * Implements the /report command, which allows users to contact a moderator within the server which * forwards messages to moderators in a dedicated channel given by - * {@link Config#getModMailChannelPattern()} ()}. + * {@link Config#getModMailChannelPattern()}. + * + * The /report command would give us necessary information about the offending user, and specific + * message that was offensive. */ - public final class ReportCommand extends BotCommandAdapter implements MessageContextCommand { private static final Logger logger = LoggerFactory.getLogger(ReportCommand.class); private static final String COMMAND_NAME = "report"; - private static final String MESSAGE_INPUT = "message"; + private static final String REPORT_REASON = "reportReason"; private static final int COOLDOWN_DURATION_VALUE = 3; private static final ChronoUnit COOLDOWN_DURATION_UNIT = ChronoUnit.MINUTES; private static final Color AMBIENT_COLOR = Color.BLACK; private final Cache authorToLastReportInvocation = createCooldownCache(); private final Predicate modMailChannelNamePredicate; private final String configModMailChannelPattern; - private String reportedMessage; - private String reportedMessageUrl; /** * Creates a new instance. * - * @param config to get the channel to forward reports to. + * @param config to get the channel to forward reports to */ public ReportCommand(Config config) { super(Commands.message(COMMAND_NAME), CommandVisibility.GUILD); @@ -76,21 +76,30 @@ private Cache createCooldownCache() { @Override public void onMessageContext(MessageContextInteractionEvent event) { - reportedMessage = event.getTarget().getContentRaw(); - reportedMessageUrl = event.getTarget().getJumpUrl(); - - TextInput body = TextInput.create(MESSAGE_INPUT, "Message", TextInputStyle.PARAGRAPH) - .setPlaceholder("Reason for reporting") - .setRequiredRange(10, 200) + String reportedMessage = event.getTarget().getContentRaw(); + String reportedMessageUrl = event.getTarget().getJumpUrl(); + + TextInput body = TextInput + .create(REPORT_REASON, + "Report this to a moderator, the report is completely " + "anonymous", + TextInputStyle.PARAGRAPH) + .setPlaceholder("What is wrong with the message, why do you want to report it?") + .setRequiredRange(3, 200) .build(); - Modal modal = Modal.create(generateComponentId(), "Report").addActionRow(body).build(); + Modal modal = + Modal.create(generateComponentId(reportedMessage, reportedMessageUrl), "Report") + .addActionRow(body) + .build(); event.replyModal(modal).queue(); } @Override public void onModalSubmitted(ModalInteractionEvent event, List args) { + String reportedMessage = args.get(0); + String reportedMessageUrl = args.get(1); + long userID = event.getUser().getIdLong(); if (handleIsOnCooldown(userID, event)) { @@ -108,18 +117,21 @@ public void onModalSubmitted(ModalInteractionEvent event, List args) { guildID, configModMailChannelPattern); return; } - String modalMessage = event.getValue(MESSAGE_INPUT).getAsString(); - MessageCreateAction message = - createModMessage(modalMessage, userID, modMailAuditLog.orElseThrow()); + String modalMessage = event.getValue(REPORT_REASON).getAsString(); + MessageCreateAction modMessage = createModMessage(modalMessage, userID, reportedMessage, + reportedMessageUrl, modMailAuditLog.orElseThrow()); - sendMessage(event, message); + sendModMessage(event, modMessage); - event.getHook().editOriginal("Thank you for your feedback!").queue(); + event.getHook() + .editOriginal( + "Thank you for reporting this message. A moderator will take care of the matter as soon as possible.") + .queue(); } private boolean handleIsOnCooldown(long userID, ModalInteractionEvent event) { - if (!isChannelOnCooldown(userID)) { + if (!isAuthorOnCooldown(userID)) { return false; } event.reply("Can only be used once per %s minutes.".formatted(COOLDOWN_DURATION_VALUE)) @@ -128,7 +140,7 @@ private boolean handleIsOnCooldown(long userID, ModalInteractionEvent event) { return true; } - private boolean isChannelOnCooldown(long userId) { + private boolean isAuthorOnCooldown(long userId) { return Optional.ofNullable(authorToLastReportInvocation.getIfPresent(userId)) .map(sinceCommandInvoked -> sinceCommandInvoked.plus(COOLDOWN_DURATION_VALUE, COOLDOWN_DURATION_UNIT)) @@ -145,23 +157,8 @@ private Optional getModMailChannel(JDA jda, long guildID) { } private MessageCreateAction createModMessage(String modalMessage, long userID, - TextChannel modMailAuditLog) { - return modMailAuditLog.sendMessageEmbeds(createReportMessage(modalMessage, userID)); - } - - private void sendMessage(ModalInteractionEvent event, MessageCreateAction message) { - InteractionHook hook = event.getHook(); - message.mapToResult().map(result -> { - if (result.isSuccess()) { - return "Your message has been forwarded, thanks."; - } - logger.warn("There was an issue with forwarding users message."); - return "There was an issue forwarding your message, sorry. We are investigating."; - }).flatMap(hook::editOriginal).queue(); - } - - private MessageEmbed createReportMessage(String modalMessage, long userID) { - return new EmbedBuilder().setTitle("Report") + String reportedMessage, String reportedMessageUrl, TextChannel modMailAuditLog) { + MessageEmbed embed = new EmbedBuilder().setTitle("Report") .setDescription((""" Reported Message: **%s** [Reported Message URL](%s) @@ -171,5 +168,19 @@ private MessageEmbed createReportMessage(String modalMessage, long userID) { .setColor(AMBIENT_COLOR) .setTimestamp(Instant.now()) .build(); + + return modMailAuditLog.sendMessageEmbeds(embed); } + + private void sendModMessage(ModalInteractionEvent event, MessageCreateAction message) { + InteractionHook hook = event.getHook(); + message.mapToResult().map(result -> { + if (result.isSuccess()) { + return "Thank you for reporting this message. A moderator will take care of the matter as soon as possible."; + } + logger.warn("Unable to forward a message report to modmail channel."); + return "Sorry, there was an issue sending your report to the moderators. We are investigating."; + }).flatMap(hook::editOriginal).queue(); + } + } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/package-info.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/package-info.java deleted file mode 100644 index dc98de6cbb..0000000000 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/report/package-info.java +++ /dev/null @@ -1,11 +0,0 @@ -/** - * This packages offers all the functionality for messaging moderators trough report see - * {@link org.togetherjava.tjbot.commands.moderation.report.ReportCommand} as main entry point. - */ -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -package org.togetherjava.tjbot.commands.moderation.report; - -import org.togetherjava.tjbot.annotations.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; From f68175edb751c55bb48d6da933e97ed3486037bc Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Thu, 27 Oct 2022 12:13:36 +0200 Subject: [PATCH 08/26] pushing before it breaks Part 2 --- .../commands/moderation/ReportCommand.java | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index 541533ba71..e3c18deee8 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -76,13 +76,18 @@ private Cache createCooldownCache() { @Override public void onMessageContext(MessageContextInteractionEvent event) { + long userID = event.getUser().getIdLong(); + + if (handleIsOnCooldown(userID, event)) { + return; + } + authorToLastReportInvocation.put(userID, Instant.now()); + String reportedMessage = event.getTarget().getContentRaw(); String reportedMessageUrl = event.getTarget().getJumpUrl(); TextInput body = TextInput - .create(REPORT_REASON, - "Report this to a moderator, the report is completely " + "anonymous", - TextInputStyle.PARAGRAPH) + .create(REPORT_REASON, "Anonymous report to the moderators", TextInputStyle.PARAGRAPH) .setPlaceholder("What is wrong with the message, why do you want to report it?") .setRequiredRange(3, 200) .build(); @@ -100,14 +105,6 @@ public void onModalSubmitted(ModalInteractionEvent event, List args) { String reportedMessage = args.get(0); String reportedMessageUrl = args.get(1); - long userID = event.getUser().getIdLong(); - - if (handleIsOnCooldown(userID, event)) { - return; - } - authorToLastReportInvocation.put(userID, Instant.now()); - event.deferReply().setEphemeral(true).queue(); - long guildID = Objects.requireNonNull(event.getGuild(), "Could not retrieve the guildId.") .getIdLong(); Optional modMailAuditLog = getModMailChannel(event.getJDA(), guildID); @@ -117,20 +114,17 @@ public void onModalSubmitted(ModalInteractionEvent event, List args) { guildID, configModMailChannelPattern); return; } + InteractionHook hook = event.getHook(); + event.deferReply().setEphemeral(true).queue(); String modalMessage = event.getValue(REPORT_REASON).getAsString(); + long userID = event.getUser().getIdLong(); MessageCreateAction modMessage = createModMessage(modalMessage, userID, reportedMessage, reportedMessageUrl, modMailAuditLog.orElseThrow()); - sendModMessage(event, modMessage); - - event.getHook() - .editOriginal( - "Thank you for reporting this message. A moderator will take care of the matter as soon as possible.") - .queue(); - + sendModMessage(hook, modMessage); } - private boolean handleIsOnCooldown(long userID, ModalInteractionEvent event) { + private boolean handleIsOnCooldown(long userID, MessageContextInteractionEvent event) { if (!isAuthorOnCooldown(userID)) { return false; } @@ -172,8 +166,7 @@ private MessageCreateAction createModMessage(String modalMessage, long userID, return modMailAuditLog.sendMessageEmbeds(embed); } - private void sendModMessage(ModalInteractionEvent event, MessageCreateAction message) { - InteractionHook hook = event.getHook(); + private void sendModMessage(InteractionHook hook, MessageCreateAction message) { message.mapToResult().map(result -> { if (result.isSuccess()) { return "Thank you for reporting this message. A moderator will take care of the matter as soon as possible."; From 9f1773e7470d7caeb8c5d255328a4bffa40dd7ea Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Thu, 27 Oct 2022 12:45:20 +0200 Subject: [PATCH 09/26] Pretty sure the last one Part 3 --- .../commands/moderation/ReportCommand.java | 66 +++++++++++++------ 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index e3c18deee8..aacea6dde7 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -4,6 +4,7 @@ import com.github.benmanes.caffeine.cache.Caffeine; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; @@ -14,6 +15,8 @@ import net.dv8tion.jda.api.interactions.components.text.TextInput; import net.dv8tion.jda.api.interactions.components.text.TextInputStyle; import net.dv8tion.jda.api.requests.restaction.MessageCreateAction; +import net.dv8tion.jda.api.utils.Result; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -102,26 +105,31 @@ public void onMessageContext(MessageContextInteractionEvent event) { @Override public void onModalSubmitted(ModalInteractionEvent event, List args) { - String reportedMessage = args.get(0); - String reportedMessageUrl = args.get(1); - long guildID = Objects.requireNonNull(event.getGuild(), "Could not retrieve the guildId.") .getIdLong(); - Optional modMailAuditLog = getModMailChannel(event.getJDA(), guildID); + Optional modMailAuditLog = + handleRequireModMailChannel(event.getJDA(), guildID); + + if (modMailAuditLog.isEmpty()) { + return; + } + + + sendModMessage(event, args, modMailAuditLog.orElseThrow()); + } + + private Optional handleRequireModMailChannel(JDA jda, long guildID) { + Optional modMailAuditLog = jda.getGuildById(guildID) + .getTextChannelCache() + .stream() + .filter(channel -> modMailChannelNamePredicate.test(channel.getName())) + .findAny(); if (modMailAuditLog.isEmpty()) { logger.warn( "Cannot find the designated modmail channel in server by id {} with the pattern {}", guildID, configModMailChannelPattern); - return; } - InteractionHook hook = event.getHook(); - event.deferReply().setEphemeral(true).queue(); - String modalMessage = event.getValue(REPORT_REASON).getAsString(); - long userID = event.getUser().getIdLong(); - MessageCreateAction modMessage = createModMessage(modalMessage, userID, reportedMessage, - reportedMessageUrl, modMailAuditLog.orElseThrow()); - - sendModMessage(hook, modMessage); + return modMailAuditLog; } private boolean handleIsOnCooldown(long userID, MessageContextInteractionEvent event) { @@ -166,14 +174,30 @@ private MessageCreateAction createModMessage(String modalMessage, long userID, return modMailAuditLog.sendMessageEmbeds(embed); } - private void sendModMessage(InteractionHook hook, MessageCreateAction message) { - message.mapToResult().map(result -> { - if (result.isSuccess()) { - return "Thank you for reporting this message. A moderator will take care of the matter as soon as possible."; - } - logger.warn("Unable to forward a message report to modmail channel."); - return "Sorry, there was an issue sending your report to the moderators. We are investigating."; - }).flatMap(hook::editOriginal).queue(); + private void sendModMessage(ModalInteractionEvent event, List args, + TextChannel modMailAuditLog) { + InteractionHook hook = event.getHook(); + + String reportedMessage = args.get(0); + String reportedMessageUrl = args.get(1); + + event.deferReply().setEphemeral(true).queue(); + String modalMessage = event.getValue(REPORT_REASON).getAsString(); + long userID = event.getUser().getIdLong(); + createModMessage(modalMessage, userID, reportedMessage, reportedMessageUrl, modMailAuditLog) + .mapToResult() + .map(this::createUserReply) + .flatMap(hook::editOriginal) + .queue(); + } + + @NotNull + private String createUserReply(Result result) { + if (result.isSuccess()) { + return "Thank you for reporting this message. A moderator will take care of the matter as soon as possible."; + } + logger.warn("Unable to forward a message report to modmail channel."); + return "Sorry, there was an issue sending your report to the moderators. We are investigating."; } } From 0a0427006c8ac505e977b74ffcc95faa15da8bc5 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Thu, 27 Oct 2022 19:13:42 +0200 Subject: [PATCH 10/26] Little small improvements part 3 --- .../tjbot/commands/moderation/ReportCommand.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index aacea6dde7..d5d5c5b605 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -114,7 +114,6 @@ public void onModalSubmitted(ModalInteractionEvent event, List args) { return; } - sendModMessage(event, args, modMailAuditLog.orElseThrow()); } @@ -150,14 +149,6 @@ private boolean isAuthorOnCooldown(long userId) { .isPresent(); } - private Optional getModMailChannel(JDA jda, long guildID) { - return jda.getGuildById(guildID) - .getTextChannelCache() - .stream() - .filter(channel -> modMailChannelNamePredicate.test(channel.getName())) - .findAny(); - } - private MessageCreateAction createModMessage(String modalMessage, long userID, String reportedMessage, String reportedMessageUrl, TextChannel modMailAuditLog) { MessageEmbed embed = new EmbedBuilder().setTitle("Report") @@ -166,7 +157,7 @@ private MessageCreateAction createModMessage(String modalMessage, long userID, [Reported Message URL](%s) Modal Message: **%s**""").formatted(reportedMessage, reportedMessageUrl, modalMessage)) - .setAuthor("Author ID: %s".formatted(userID)) + .setAuthor("Author ID: %d".formatted(userID)) .setColor(AMBIENT_COLOR) .setTimestamp(Instant.now()) .build(); From 09e285a4c7047e996936c857a3e760d11592f3f3 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Sun, 30 Oct 2022 07:19:43 +0100 Subject: [PATCH 11/26] Making some improvements part 4 --- .../tjbot/commands/moderation/ReportCommand.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index d5d5c5b605..78c279be70 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -48,7 +48,7 @@ public final class ReportCommand extends BotCommandAdapter implements MessageCon private static final Logger logger = LoggerFactory.getLogger(ReportCommand.class); private static final String COMMAND_NAME = "report"; - private static final String REPORT_REASON = "reportReason"; + private static final String REPORT_REASON_INPUT_ID = "reportReason"; private static final int COOLDOWN_DURATION_VALUE = 3; private static final ChronoUnit COOLDOWN_DURATION_UNIT = ChronoUnit.MINUTES; private static final Color AMBIENT_COLOR = Color.BLACK; @@ -90,7 +90,8 @@ public void onMessageContext(MessageContextInteractionEvent event) { String reportedMessageUrl = event.getTarget().getJumpUrl(); TextInput body = TextInput - .create(REPORT_REASON, "Anonymous report to the moderators", TextInputStyle.PARAGRAPH) + .create(REPORT_REASON_INPUT_ID, "Anonymous report to the moderators", + TextInputStyle.PARAGRAPH) .setPlaceholder("What is wrong with the message, why do you want to report it?") .setRequiredRange(3, 200) .build(); @@ -108,7 +109,7 @@ public void onModalSubmitted(ModalInteractionEvent event, List args) { long guildID = Objects.requireNonNull(event.getGuild(), "Could not retrieve the guildId.") .getIdLong(); Optional modMailAuditLog = - handleRequireModMailChannel(event.getJDA(), guildID); + handleRequireModMailChannel(event, event.getJDA(), guildID); if (modMailAuditLog.isEmpty()) { return; @@ -117,13 +118,18 @@ public void onModalSubmitted(ModalInteractionEvent event, List args) { sendModMessage(event, args, modMailAuditLog.orElseThrow()); } - private Optional handleRequireModMailChannel(JDA jda, long guildID) { + private Optional handleRequireModMailChannel(ModalInteractionEvent event, JDA jda, + long guildID) { Optional modMailAuditLog = jda.getGuildById(guildID) .getTextChannelCache() .stream() .filter(channel -> modMailChannelNamePredicate.test(channel.getName())) .findAny(); if (modMailAuditLog.isEmpty()) { + event + .reply("Sorry, there was an issue sending your report to the moderators. We are " + + "investigating.") + .queue(); logger.warn( "Cannot find the designated modmail channel in server by id {} with the pattern {}", guildID, configModMailChannelPattern); @@ -173,7 +179,7 @@ private void sendModMessage(ModalInteractionEvent event, List args, String reportedMessageUrl = args.get(1); event.deferReply().setEphemeral(true).queue(); - String modalMessage = event.getValue(REPORT_REASON).getAsString(); + String modalMessage = event.getValue(REPORT_REASON_INPUT_ID).getAsString(); long userID = event.getUser().getIdLong(); createModMessage(modalMessage, userID, reportedMessage, reportedMessageUrl, modMailAuditLog) .mapToResult() From b448b06cd4a32d054277b96befc6ce1eb7e1ac33 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Sun, 30 Oct 2022 07:27:55 +0100 Subject: [PATCH 12/26] missed you --- .../togetherjava/tjbot/commands/moderation/ReportCommand.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index 78c279be70..1d32536ba9 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -16,7 +16,6 @@ import net.dv8tion.jda.api.interactions.components.text.TextInputStyle; import net.dv8tion.jda.api.requests.restaction.MessageCreateAction; import net.dv8tion.jda.api.utils.Result; -import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -188,7 +187,6 @@ private void sendModMessage(ModalInteractionEvent event, List args, .queue(); } - @NotNull private String createUserReply(Result result) { if (result.isSuccess()) { return "Thank you for reporting this message. A moderator will take care of the matter as soon as possible."; From e97ffa821c137f239a131841efee4e01ab2bfcc4 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Sun, 30 Oct 2022 12:53:18 +0100 Subject: [PATCH 13/26] Part 6 --- .../togetherjava/tjbot/commands/moderation/ReportCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index 1d32536ba9..d84aa03bb0 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -158,7 +158,7 @@ private MessageCreateAction createModMessage(String modalMessage, long userID, String reportedMessage, String reportedMessageUrl, TextChannel modMailAuditLog) { MessageEmbed embed = new EmbedBuilder().setTitle("Report") .setDescription((""" - Reported Message: **%s** + Reason: **%s** [Reported Message URL](%s) Modal Message: **%s**""").formatted(reportedMessage, reportedMessageUrl, modalMessage)) From 88f54844ec28ad69d67ea2515742b75559296d97 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Mon, 31 Oct 2022 06:59:59 +0100 Subject: [PATCH 14/26] Part 7 --- .../tjbot/commands/moderation/ReportCommand.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index d84aa03bb0..d7797c20e4 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -158,10 +158,9 @@ private MessageCreateAction createModMessage(String modalMessage, long userID, String reportedMessage, String reportedMessageUrl, TextChannel modMailAuditLog) { MessageEmbed embed = new EmbedBuilder().setTitle("Report") .setDescription((""" - Reason: **%s** + Reported Message: **%s** [Reported Message URL](%s) - Modal Message: **%s**""").formatted(reportedMessage, reportedMessageUrl, - modalMessage)) + Reason: **%s**""").formatted(reportedMessage, reportedMessageUrl, modalMessage)) .setAuthor("Author ID: %d".formatted(userID)) .setColor(AMBIENT_COLOR) .setTimestamp(Instant.now()) From 91384744e3fa963b84f061b01f11a98d0e0968df Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Wed, 2 Nov 2022 10:49:25 +0100 Subject: [PATCH 15/26] cmon finish thissss --- .../togetherjava/tjbot/commands/moderation/ReportCommand.java | 1 - 1 file changed, 1 deletion(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index d7797c20e4..31f54c0f94 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -163,7 +163,6 @@ private MessageCreateAction createModMessage(String modalMessage, long userID, Reason: **%s**""").formatted(reportedMessage, reportedMessageUrl, modalMessage)) .setAuthor("Author ID: %d".formatted(userID)) .setColor(AMBIENT_COLOR) - .setTimestamp(Instant.now()) .build(); return modMailAuditLog.sendMessageEmbeds(embed); From ac38e553559dcf515d9d6b6bb30d543185d9546b Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Fri, 4 Nov 2022 07:54:56 +0100 Subject: [PATCH 16/26] Spooky month might be over, but you still have to review my code --- .../commands/moderation/ReportCommand.java | 77 ++++++++++--------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index 31f54c0f94..0e36c135a9 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -3,9 +3,9 @@ import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; +import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.MessageContextInteractionEvent; @@ -26,6 +26,7 @@ import java.awt.*; import java.time.Instant; +import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Objects; @@ -36,12 +37,9 @@ /** - * Implements the /report command, which allows users to contact a moderator within the server which - * forwards messages to moderators in a dedicated channel given by + * Implements the /report command, which allows users to report a selected offensive message from + * another user. The message is then forwarded to moderators in a dedicated channel given by * {@link Config#getModMailChannelPattern()}. - * - * The /report command would give us necessary information about the offending user, and specific - * message that was offensive. */ public final class ReportCommand extends BotCommandAdapter implements MessageContextCommand { @@ -79,6 +77,7 @@ private Cache createCooldownCache() { @Override public void onMessageContext(MessageContextInteractionEvent event) { long userID = event.getUser().getIdLong(); + String time = event.getTarget().getTimeCreated().format(DateTimeFormatter.ISO_DATE_TIME); if (handleIsOnCooldown(userID, event)) { return; @@ -95,10 +94,9 @@ public void onMessageContext(MessageContextInteractionEvent event) { .setRequiredRange(3, 200) .build(); + String componentID = generateComponentId(reportedMessage, reportedMessageUrl, time); Modal modal = - Modal.create(generateComponentId(reportedMessage, reportedMessageUrl), "Report") - .addActionRow(body) - .build(); + Modal.create(componentID, "Report this to a moderator").addActionRow(body).build(); event.replyModal(modal).queue(); } @@ -107,8 +105,7 @@ public void onMessageContext(MessageContextInteractionEvent event) { public void onModalSubmitted(ModalInteractionEvent event, List args) { long guildID = Objects.requireNonNull(event.getGuild(), "Could not retrieve the guildId.") .getIdLong(); - Optional modMailAuditLog = - handleRequireModMailChannel(event, event.getJDA(), guildID); + Optional modMailAuditLog = handleRequireModMailChannel(event, guildID); if (modMailAuditLog.isEmpty()) { return; @@ -117,9 +114,9 @@ public void onModalSubmitted(ModalInteractionEvent event, List args) { sendModMessage(event, args, modMailAuditLog.orElseThrow()); } - private Optional handleRequireModMailChannel(ModalInteractionEvent event, JDA jda, + private Optional handleRequireModMailChannel(ModalInteractionEvent event, long guildID) { - Optional modMailAuditLog = jda.getGuildById(guildID) + Optional modMailAuditLog = event.getJDA() .getTextChannelCache() .stream() .filter(channel -> modMailChannelNamePredicate.test(channel.getName())) @@ -140,7 +137,9 @@ private boolean handleIsOnCooldown(long userID, MessageContextInteractionEvent e if (!isAuthorOnCooldown(userID)) { return false; } - event.reply("Can only be used once per %s minutes.".formatted(COOLDOWN_DURATION_VALUE)) + event + .reply("You can only report a message once per %s minutes." + .formatted(COOLDOWN_DURATION_VALUE)) .setEphemeral(true) .queue(); return true; @@ -154,43 +153,51 @@ private boolean isAuthorOnCooldown(long userId) { .isPresent(); } - private MessageCreateAction createModMessage(String modalMessage, long userID, - String reportedMessage, String reportedMessageUrl, TextChannel modMailAuditLog) { - MessageEmbed embed = new EmbedBuilder().setTitle("Report") - .setDescription((""" + private MessageCreateAction createModMessage(String reportReason, User author, + String reportedMessage, String reportedMessageUrl, String reportedMessageTimestamp, + TextChannel modMailAuditLog) { + MessageEmbed reportedMessageEmbed = new EmbedBuilder().setTitle("Report") + .setDescription(""" Reported Message: **%s** - [Reported Message URL](%s) - Reason: **%s**""").formatted(reportedMessage, reportedMessageUrl, modalMessage)) - .setAuthor("Author ID: %d".formatted(userID)) + [Reported Message URL](%s)""".formatted(reportedMessage, reportedMessageUrl)) + .setAuthor(author.getName(), null, author.getAvatarUrl()) + .setTimestamp(Instant.parse(reportedMessageTimestamp)) .setColor(AMBIENT_COLOR) .build(); - return modMailAuditLog.sendMessageEmbeds(embed); + MessageEmbed reportReasonEmbed = new EmbedBuilder().setTitle("Reason") + .setDescription(reportReason) + .setColor(AMBIENT_COLOR) + .build(); + return modMailAuditLog.sendMessageEmbeds(reportedMessageEmbed, reportReasonEmbed); } private void sendModMessage(ModalInteractionEvent event, List args, TextChannel modMailAuditLog) { - InteractionHook hook = event.getHook(); - String reportedMessage = args.get(0); String reportedMessageUrl = args.get(1); + String reportedMessageTimestamp = args.get(2); event.deferReply().setEphemeral(true).queue(); - String modalMessage = event.getValue(REPORT_REASON_INPUT_ID).getAsString(); - long userID = event.getUser().getIdLong(); - createModMessage(modalMessage, userID, reportedMessage, reportedMessageUrl, modMailAuditLog) - .mapToResult() - .map(this::createUserReply) - .flatMap(hook::editOriginal) - .queue(); + + InteractionHook hook = event.getHook(); + String reportReason = event.getValue(REPORT_REASON_INPUT_ID).getAsString(); + User user = event.getUser(); + + createModMessage(reportReason, user, reportedMessage, reportedMessageUrl, + reportedMessageTimestamp, modMailAuditLog).mapToResult() + .map(this::createUserReply) + .flatMap(hook::editOriginal) + .queue(); } private String createUserReply(Result result) { - if (result.isSuccess()) { - return "Thank you for reporting this message. A moderator will take care of the matter as soon as possible."; + if (result.isFailure()) { + logger.warn("Unable to forward a message report to modmail channel.", + result.getFailure()); + return "Sorry, there was an issue sending your report to the moderators. We are investigating."; } - logger.warn("Unable to forward a message report to modmail channel."); - return "Sorry, there was an issue sending your report to the moderators. We are investigating."; + return "Thank you for reporting this message. A moderator will take care of the matter as soon as possible."; } } From 680fd4709261890767c123b4bfe1aff6385986c0 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Fri, 4 Nov 2022 08:00:14 +0100 Subject: [PATCH 17/26] boo --- .../tjbot/commands/moderation/ReportCommand.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index 0e36c135a9..ee7a7ed085 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -77,7 +77,8 @@ private Cache createCooldownCache() { @Override public void onMessageContext(MessageContextInteractionEvent event) { long userID = event.getUser().getIdLong(); - String time = event.getTarget().getTimeCreated().format(DateTimeFormatter.ISO_DATE_TIME); + String reportedMessageTimestamp = + event.getTarget().getTimeCreated().format(DateTimeFormatter.ISO_DATE_TIME); if (handleIsOnCooldown(userID, event)) { return; @@ -94,7 +95,8 @@ public void onMessageContext(MessageContextInteractionEvent event) { .setRequiredRange(3, 200) .build(); - String componentID = generateComponentId(reportedMessage, reportedMessageUrl, time); + String componentID = + generateComponentId(reportedMessage, reportedMessageUrl, reportedMessageTimestamp); Modal modal = Modal.create(componentID, "Report this to a moderator").addActionRow(body).build(); From bcf4ad4b50048339f41736135dc3f62988c950bc Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Sun, 6 Nov 2022 13:37:26 +0100 Subject: [PATCH 18/26] I am ready --- .../commands/moderation/ReportCommand.java | 66 ++++++++++--------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index ee7a7ed085..c87fcddcd1 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -5,7 +5,6 @@ import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; -import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.MessageContextInteractionEvent; @@ -22,11 +21,12 @@ import org.togetherjava.tjbot.commands.BotCommandAdapter; import org.togetherjava.tjbot.commands.CommandVisibility; import org.togetherjava.tjbot.commands.MessageContextCommand; +import org.togetherjava.tjbot.commands.utils.DiscordClientAction; +import org.togetherjava.tjbot.commands.utils.MessageUtils; import org.togetherjava.tjbot.config.Config; import java.awt.*; import java.time.Instant; -import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Objects; @@ -77,16 +77,17 @@ private Cache createCooldownCache() { @Override public void onMessageContext(MessageContextInteractionEvent event) { long userID = event.getUser().getIdLong(); - String reportedMessageTimestamp = - event.getTarget().getTimeCreated().format(DateTimeFormatter.ISO_DATE_TIME); + String reportedMessageTimestamp = event.getTarget().getTimeCreated().toInstant().toString(); - if (handleIsOnCooldown(userID, event)) { + if (handleIsOnCooldown(event)) { return; } authorToLastReportInvocation.put(userID, Instant.now()); String reportedMessage = event.getTarget().getContentRaw(); - String reportedMessageUrl = event.getTarget().getJumpUrl(); + String authorName = event.getTarget().getAuthor().getName(); + String authorAvatarURL = event.getTarget().getAuthor().getAvatarUrl(); + String authorID = event.getTarget().getAuthor().getId(); TextInput body = TextInput .create(REPORT_REASON_INPUT_ID, "Anonymous report to the moderators", @@ -95,19 +96,18 @@ public void onMessageContext(MessageContextInteractionEvent event) { .setRequiredRange(3, 200) .build(); - String componentID = - generateComponentId(reportedMessage, reportedMessageUrl, reportedMessageTimestamp); - Modal modal = - Modal.create(componentID, "Report this to a moderator").addActionRow(body).build(); + String reportModalComponentID = generateComponentId(reportedMessage, + reportedMessageTimestamp, authorName, authorAvatarURL, authorID); + Modal reportModal = Modal.create(reportModalComponentID, "Report this to a moderator") + .addActionRow(body) + .build(); - event.replyModal(modal).queue(); + event.replyModal(reportModal).queue(); } @Override public void onModalSubmitted(ModalInteractionEvent event, List args) { - long guildID = Objects.requireNonNull(event.getGuild(), "Could not retrieve the guildId.") - .getIdLong(); - Optional modMailAuditLog = handleRequireModMailChannel(event, guildID); + Optional modMailAuditLog = handleRequireModMailChannel(event); if (modMailAuditLog.isEmpty()) { return; @@ -116,8 +116,9 @@ public void onModalSubmitted(ModalInteractionEvent event, List args) { sendModMessage(event, args, modMailAuditLog.orElseThrow()); } - private Optional handleRequireModMailChannel(ModalInteractionEvent event, - long guildID) { + private Optional handleRequireModMailChannel(ModalInteractionEvent event) { + long guildID = Objects.requireNonNull(event.getGuild(), "Could not retrieve the guildId.") + .getIdLong(); Optional modMailAuditLog = event.getJDA() .getTextChannelCache() .stream() @@ -127,6 +128,7 @@ private Optional handleRequireModMailChannel(ModalInteractionEvent event .reply("Sorry, there was an issue sending your report to the moderators. We are " + "investigating.") + .setEphemeral(true) .queue(); logger.warn( "Cannot find the designated modmail channel in server by id {} with the pattern {}", @@ -135,8 +137,8 @@ private Optional handleRequireModMailChannel(ModalInteractionEvent return modMailAuditLog; } - private boolean handleIsOnCooldown(long userID, MessageContextInteractionEvent event) { - if (!isAuthorOnCooldown(userID)) { + private boolean handleIsOnCooldown(MessageContextInteractionEvent event) { + if (!isAuthorOnCooldown(event.getUser().getIdLong())) { return false; } event @@ -155,15 +157,14 @@ private boolean isAuthorOnCooldown(long userId) { .isPresent(); } - private MessageCreateAction createModMessage(String reportReason, User author, - String reportedMessage, String reportedMessageUrl, String reportedMessageTimestamp, - TextChannel modMailAuditLog) { + private MessageCreateAction createModMessage(String reportReason, String authorName, + String authorAvatarURL, String authorID, String reportedMessage, + Instant reportedMessageTimestamp, TextChannel modMailAuditLog) { MessageEmbed reportedMessageEmbed = new EmbedBuilder().setTitle("Report") - .setDescription(""" - Reported Message: **%s** - [Reported Message URL](%s)""".formatted(reportedMessage, reportedMessageUrl)) - .setAuthor(author.getName(), null, author.getAvatarUrl()) - .setTimestamp(Instant.parse(reportedMessageTimestamp)) + .setDescription("Reported Message: **%s**".formatted( + MessageUtils.abbreviate(reportedMessage, MessageEmbed.DESCRIPTION_MAX_LENGTH))) + .setAuthor(authorName, null, authorAvatarURL) + .setTimestamp(reportedMessageTimestamp) .setColor(AMBIENT_COLOR) .build(); @@ -171,22 +172,25 @@ private MessageCreateAction createModMessage(String reportReason, User author, .setDescription(reportReason) .setColor(AMBIENT_COLOR) .build(); - return modMailAuditLog.sendMessageEmbeds(reportedMessageEmbed, reportReasonEmbed); + return modMailAuditLog.sendMessageEmbeds(reportedMessageEmbed, reportReasonEmbed) + .addActionRow( + DiscordClientAction.General.USER.asLinkButton("Author Profile", authorID)); } private void sendModMessage(ModalInteractionEvent event, List args, TextChannel modMailAuditLog) { String reportedMessage = args.get(0); - String reportedMessageUrl = args.get(1); - String reportedMessageTimestamp = args.get(2); + Instant reportedMessageTimestamp = Instant.parse(args.get(1)); + String authorName = args.get(2); + String authorAvatarURL = args.get(3); + String authorID = args.get(4); event.deferReply().setEphemeral(true).queue(); InteractionHook hook = event.getHook(); String reportReason = event.getValue(REPORT_REASON_INPUT_ID).getAsString(); - User user = event.getUser(); - createModMessage(reportReason, user, reportedMessage, reportedMessageUrl, + createModMessage(reportReason, authorName, authorAvatarURL, authorID, reportedMessage, reportedMessageTimestamp, modMailAuditLog).mapToResult() .map(this::createUserReply) .flatMap(hook::editOriginal) From 28bb2b6348c72250b84f5d355fc4fbd63a86d716 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Tue, 8 Nov 2022 11:52:03 +0100 Subject: [PATCH 19/26] improved the positioning of methods and naming of variables --- .../commands/moderation/ReportCommand.java | 95 +++++++++++-------- 1 file changed, 56 insertions(+), 39 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index c87fcddcd1..04c88078ed 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -3,6 +3,7 @@ import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; @@ -85,6 +86,8 @@ public void onMessageContext(MessageContextInteractionEvent event) { authorToLastReportInvocation.put(userID, Instant.now()); String reportedMessage = event.getTarget().getContentRaw(); + String reportedMessageID = event.getTarget().getId(); + String reportedMessageChannel = event.getTarget().getChannel().getId(); String authorName = event.getTarget().getAuthor().getName(); String authorAvatarURL = event.getTarget().getAuthor().getAvatarUrl(); String authorID = event.getTarget().getAuthor().getId(); @@ -96,8 +99,9 @@ public void onMessageContext(MessageContextInteractionEvent event) { .setRequiredRange(3, 200) .build(); - String reportModalComponentID = generateComponentId(reportedMessage, - reportedMessageTimestamp, authorName, authorAvatarURL, authorID); + String reportModalComponentID = + generateComponentId(reportedMessage, reportedMessageID, reportedMessageChannel, + reportedMessageTimestamp, authorName, authorAvatarURL, authorID); Modal reportModal = Modal.create(reportModalComponentID, "Report this to a moderator") .addActionRow(body) .build(); @@ -105,6 +109,26 @@ public void onMessageContext(MessageContextInteractionEvent event) { event.replyModal(reportModal).queue(); } + private boolean handleIsOnCooldown(MessageContextInteractionEvent event) { + if (!isAuthorOnCooldown(event.getUser().getIdLong())) { + return false; + } + event + .reply("You can only report a message once per %s minutes." + .formatted(COOLDOWN_DURATION_VALUE)) + .setEphemeral(true) + .queue(); + return true; + } + + private boolean isAuthorOnCooldown(long userId) { + return Optional.ofNullable(authorToLastReportInvocation.getIfPresent(userId)) + .map(sinceCommandInvoked -> sinceCommandInvoked.plus(COOLDOWN_DURATION_VALUE, + COOLDOWN_DURATION_UNIT)) + .filter(Instant.now()::isBefore) + .isPresent(); + } + @Override public void onModalSubmitted(ModalInteractionEvent event, List args) { Optional modMailAuditLog = handleRequireModMailChannel(event); @@ -137,34 +161,15 @@ private Optional handleRequireModMailChannel(ModalInteractionEvent return modMailAuditLog; } - private boolean handleIsOnCooldown(MessageContextInteractionEvent event) { - if (!isAuthorOnCooldown(event.getUser().getIdLong())) { - return false; - } - event - .reply("You can only report a message once per %s minutes." - .formatted(COOLDOWN_DURATION_VALUE)) - .setEphemeral(true) - .queue(); - return true; - } - - private boolean isAuthorOnCooldown(long userId) { - return Optional.ofNullable(authorToLastReportInvocation.getIfPresent(userId)) - .map(sinceCommandInvoked -> sinceCommandInvoked.plus(COOLDOWN_DURATION_VALUE, - COOLDOWN_DURATION_UNIT)) - .filter(Instant.now()::isBefore) - .isPresent(); - } + private MessageCreateAction createModMessage(String reportReason, ReportMessage reportMessage, + Guild guild, TextChannel modMailAuditLog) { - private MessageCreateAction createModMessage(String reportReason, String authorName, - String authorAvatarURL, String authorID, String reportedMessage, - Instant reportedMessageTimestamp, TextChannel modMailAuditLog) { MessageEmbed reportedMessageEmbed = new EmbedBuilder().setTitle("Report") - .setDescription("Reported Message: **%s**".formatted( - MessageUtils.abbreviate(reportedMessage, MessageEmbed.DESCRIPTION_MAX_LENGTH))) - .setAuthor(authorName, null, authorAvatarURL) - .setTimestamp(reportedMessageTimestamp) + .setDescription(MessageUtils.abbreviate(reportMessage.reportedMessage, + MessageEmbed.DESCRIPTION_MAX_LENGTH)) + .setAuthor(reportMessage.reportedMessageAuthorName, null, + reportMessage.reportedMessageAuthorAvatarUrl) + .setTimestamp(reportMessage.reportedMessageTimestamp) .setColor(AMBIENT_COLOR) .build(); @@ -173,30 +178,42 @@ private MessageCreateAction createModMessage(String reportReason, String authorN .setColor(AMBIENT_COLOR) .build(); return modMailAuditLog.sendMessageEmbeds(reportedMessageEmbed, reportReasonEmbed) - .addActionRow( - DiscordClientAction.General.USER.asLinkButton("Author Profile", authorID)); + .addActionRow(DiscordClientAction.Channels.GUILD_CHANNEL_MESSAGE.asLinkButton( + "Reported Message", guild.getId(), reportMessage.reportedMessageChannelID, + reportMessage.reportedMessageID)); } private void sendModMessage(ModalInteractionEvent event, List args, TextChannel modMailAuditLog) { String reportedMessage = args.get(0); - Instant reportedMessageTimestamp = Instant.parse(args.get(1)); - String authorName = args.get(2); - String authorAvatarURL = args.get(3); - String authorID = args.get(4); + String reportedMessageID = args.get(1); + String reportedMessageChannelID = args.get(2); + Instant reportedMessageTimestamp = Instant.parse(args.get(3)); + String reportedMessageAuthorName = args.get(4); + String reportedMessageAuthorAvatarUrl = args.get(5); + ReportMessage reportMessage = new ReportMessage(reportedMessage, reportedMessageID, + reportedMessageChannelID, reportedMessageTimestamp, reportedMessageAuthorName, + reportedMessageAuthorAvatarUrl); + + Guild guild = event.getGuild(); event.deferReply().setEphemeral(true).queue(); InteractionHook hook = event.getHook(); String reportReason = event.getValue(REPORT_REASON_INPUT_ID).getAsString(); - createModMessage(reportReason, authorName, authorAvatarURL, authorID, reportedMessage, - reportedMessageTimestamp, modMailAuditLog).mapToResult() - .map(this::createUserReply) - .flatMap(hook::editOriginal) - .queue(); + createModMessage(reportReason, reportMessage, guild, modMailAuditLog).mapToResult() + .map(this::createUserReply) + .flatMap(hook::editOriginal) + .queue(); } + record ReportMessage(String reportedMessage, String reportedMessageID, + String reportedMessageChannelID, Instant reportedMessageTimestamp, + String reportedMessageAuthorName, String reportedMessageAuthorAvatarUrl) { + } + + private String createUserReply(Result result) { if (result.isFailure()) { logger.warn("Unable to forward a message report to modmail channel.", From dfeb435e23c76e8a03be737677ff8ce3a3463e44 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Tue, 8 Nov 2022 13:17:01 +0100 Subject: [PATCH 20/26] The deed is done. --- .../commands/moderation/ReportCommand.java | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index 04c88078ed..b7357dd1e5 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -161,15 +161,14 @@ private Optional handleRequireModMailChannel(ModalInteractionEvent return modMailAuditLog; } - private MessageCreateAction createModMessage(String reportReason, ReportMessage reportMessage, - Guild guild, TextChannel modMailAuditLog) { + private MessageCreateAction createModMessage(String reportReason, + ReportedMessage reportedMessage, Guild guild, TextChannel modMailAuditLog) { MessageEmbed reportedMessageEmbed = new EmbedBuilder().setTitle("Report") - .setDescription(MessageUtils.abbreviate(reportMessage.reportedMessage, + .setDescription(MessageUtils.abbreviate(reportedMessage.content, MessageEmbed.DESCRIPTION_MAX_LENGTH)) - .setAuthor(reportMessage.reportedMessageAuthorName, null, - reportMessage.reportedMessageAuthorAvatarUrl) - .setTimestamp(reportMessage.reportedMessageTimestamp) + .setAuthor(reportedMessage.authorName, null, reportedMessage.authorAvatarUrl) + .setTimestamp(reportedMessage.timestamp) .setColor(AMBIENT_COLOR) .build(); @@ -179,22 +178,12 @@ private MessageCreateAction createModMessage(String reportReason, ReportMessage .build(); return modMailAuditLog.sendMessageEmbeds(reportedMessageEmbed, reportReasonEmbed) .addActionRow(DiscordClientAction.Channels.GUILD_CHANNEL_MESSAGE.asLinkButton( - "Reported Message", guild.getId(), reportMessage.reportedMessageChannelID, - reportMessage.reportedMessageID)); + "Go to Message", guild.getId(), reportedMessage.channelID, reportedMessage.ID)); } private void sendModMessage(ModalInteractionEvent event, List args, TextChannel modMailAuditLog) { - String reportedMessage = args.get(0); - String reportedMessageID = args.get(1); - String reportedMessageChannelID = args.get(2); - Instant reportedMessageTimestamp = Instant.parse(args.get(3)); - String reportedMessageAuthorName = args.get(4); - String reportedMessageAuthorAvatarUrl = args.get(5); - ReportMessage reportMessage = new ReportMessage(reportedMessage, reportedMessageID, - reportedMessageChannelID, reportedMessageTimestamp, reportedMessageAuthorName, - reportedMessageAuthorAvatarUrl); Guild guild = event.getGuild(); event.deferReply().setEphemeral(true).queue(); @@ -202,15 +191,25 @@ private void sendModMessage(ModalInteractionEvent event, List args, InteractionHook hook = event.getHook(); String reportReason = event.getValue(REPORT_REASON_INPUT_ID).getAsString(); - createModMessage(reportReason, reportMessage, guild, modMailAuditLog).mapToResult() + createModMessage(reportReason, ReportedMessage.ofArgs(args), guild, modMailAuditLog) + .mapToResult() .map(this::createUserReply) .flatMap(hook::editOriginal) .queue(); } - record ReportMessage(String reportedMessage, String reportedMessageID, - String reportedMessageChannelID, Instant reportedMessageTimestamp, - String reportedMessageAuthorName, String reportedMessageAuthorAvatarUrl) { + private record ReportedMessage(String content, String ID, String channelID, Instant timestamp, + String authorName, String authorAvatarUrl) { + static ReportedMessage ofArgs(List args) { + String content = args.get(0); + String ID = args.get(1); + String channelID = args.get(2); + Instant timestamp = Instant.parse(args.get(3)); + String authorName = args.get(4); + String authorAvatarUrl = args.get(5); + return new ReportedMessage(content, ID, channelID, timestamp, authorName, + authorAvatarUrl); + } } From 8ec64f86d6cb25cee4d1b3545cc77e27f06066e8 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Tue, 8 Nov 2022 13:20:28 +0100 Subject: [PATCH 21/26] Empty lines are erased. --- .../togetherjava/tjbot/commands/moderation/ReportCommand.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index b7357dd1e5..a9478fbc79 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -183,8 +183,6 @@ private MessageCreateAction createModMessage(String reportReason, private void sendModMessage(ModalInteractionEvent event, List args, TextChannel modMailAuditLog) { - - Guild guild = event.getGuild(); event.deferReply().setEphemeral(true).queue(); From cc583ee69a98a70331e7428874489e409be4101e Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Tue, 8 Nov 2022 13:21:55 +0100 Subject: [PATCH 22/26] Additional adjustments. --- .../tjbot/commands/moderation/ReportCommand.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index a9478fbc79..6766ccacc9 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -88,9 +88,9 @@ public void onMessageContext(MessageContextInteractionEvent event) { String reportedMessage = event.getTarget().getContentRaw(); String reportedMessageID = event.getTarget().getId(); String reportedMessageChannel = event.getTarget().getChannel().getId(); - String authorName = event.getTarget().getAuthor().getName(); - String authorAvatarURL = event.getTarget().getAuthor().getAvatarUrl(); - String authorID = event.getTarget().getAuthor().getId(); + String reportedAuthorName = event.getTarget().getAuthor().getName(); + String reportedAuthorAvatarURL = event.getTarget().getAuthor().getAvatarUrl(); + String reportedAuthorID = event.getTarget().getAuthor().getId(); TextInput body = TextInput .create(REPORT_REASON_INPUT_ID, "Anonymous report to the moderators", @@ -99,9 +99,9 @@ public void onMessageContext(MessageContextInteractionEvent event) { .setRequiredRange(3, 200) .build(); - String reportModalComponentID = - generateComponentId(reportedMessage, reportedMessageID, reportedMessageChannel, - reportedMessageTimestamp, authorName, authorAvatarURL, authorID); + String reportModalComponentID = generateComponentId(reportedMessage, reportedMessageID, + reportedMessageChannel, reportedMessageTimestamp, reportedAuthorName, + reportedAuthorAvatarURL, reportedAuthorID); Modal reportModal = Modal.create(reportModalComponentID, "Report this to a moderator") .addActionRow(body) .build(); From 4368fc0ea9b8ee268c1769dfa8734ee398f123be Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Tue, 8 Nov 2022 13:25:28 +0100 Subject: [PATCH 23/26] Slight changes --- .../tjbot/commands/moderation/ReportCommand.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index 6766ccacc9..ae9281e4a7 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -189,8 +189,9 @@ private void sendModMessage(ModalInteractionEvent event, List args, InteractionHook hook = event.getHook(); String reportReason = event.getValue(REPORT_REASON_INPUT_ID).getAsString(); - createModMessage(reportReason, ReportedMessage.ofArgs(args), guild, modMailAuditLog) - .mapToResult() + ReportedMessage reportedMessage = ReportedMessage.ofArgs(args); + + createModMessage(reportReason, reportedMessage, guild, modMailAuditLog).mapToResult() .map(this::createUserReply) .flatMap(hook::editOriginal) .queue(); From 286e5441dbd6a7695288c9a10644a6f04e82a952 Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Tue, 8 Nov 2022 13:29:58 +0100 Subject: [PATCH 24/26] the id capitalization --- .../tjbot/commands/moderation/ReportCommand.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index ae9281e4a7..33582efcf1 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -178,7 +178,7 @@ private MessageCreateAction createModMessage(String reportReason, .build(); return modMailAuditLog.sendMessageEmbeds(reportedMessageEmbed, reportReasonEmbed) .addActionRow(DiscordClientAction.Channels.GUILD_CHANNEL_MESSAGE.asLinkButton( - "Go to Message", guild.getId(), reportedMessage.channelID, reportedMessage.ID)); + "Go to Message", guild.getId(), reportedMessage.channelID, reportedMessage.id)); } private void sendModMessage(ModalInteractionEvent event, List args, @@ -197,16 +197,16 @@ private void sendModMessage(ModalInteractionEvent event, List args, .queue(); } - private record ReportedMessage(String content, String ID, String channelID, Instant timestamp, + private record ReportedMessage(String content, String id, String channelID, Instant timestamp, String authorName, String authorAvatarUrl) { static ReportedMessage ofArgs(List args) { String content = args.get(0); - String ID = args.get(1); + String id = args.get(1); String channelID = args.get(2); Instant timestamp = Instant.parse(args.get(3)); String authorName = args.get(4); String authorAvatarUrl = args.get(5); - return new ReportedMessage(content, ID, channelID, timestamp, authorName, + return new ReportedMessage(content, id, channelID, timestamp, authorName, authorAvatarUrl); } } From 8cf465a0d7e66a1f253a2e424a6f407adeb7d28a Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Wed, 9 Nov 2022 15:39:01 +0100 Subject: [PATCH 25/26] Done for good --- .../commands/moderation/ReportCommand.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index 33582efcf1..168f21fc62 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -92,10 +92,10 @@ public void onMessageContext(MessageContextInteractionEvent event) { String reportedAuthorAvatarURL = event.getTarget().getAuthor().getAvatarUrl(); String reportedAuthorID = event.getTarget().getAuthor().getId(); - TextInput body = TextInput + TextInput modalBody = TextInput .create(REPORT_REASON_INPUT_ID, "Anonymous report to the moderators", TextInputStyle.PARAGRAPH) - .setPlaceholder("What is wrong with the message, why do you want to report it?") + .setPlaceholder("Why do you want to report this message?") .setRequiredRange(3, 200) .build(); @@ -103,7 +103,7 @@ public void onMessageContext(MessageContextInteractionEvent event) { reportedMessageChannel, reportedMessageTimestamp, reportedAuthorName, reportedAuthorAvatarURL, reportedAuthorID); Modal reportModal = Modal.create(reportModalComponentID, "Report this to a moderator") - .addActionRow(body) + .addActionRow(modalBody) .build(); event.replyModal(reportModal).queue(); @@ -141,7 +141,9 @@ public void onModalSubmitted(ModalInteractionEvent event, List args) { } private Optional handleRequireModMailChannel(ModalInteractionEvent event) { - long guildID = Objects.requireNonNull(event.getGuild(), "Could not retrieve the guildId.") + long guildID = Objects + .requireNonNull(event.getGuild(), + "Guild is null for ModalInteractionEvent in ReportCommand.") .getIdLong(); Optional modMailAuditLog = event.getJDA() .getTextChannelCache() @@ -149,9 +151,8 @@ private Optional handleRequireModMailChannel(ModalInteractionEvent .filter(channel -> modMailChannelNamePredicate.test(channel.getName())) .findAny(); if (modMailAuditLog.isEmpty()) { - event - .reply("Sorry, there was an issue sending your report to the moderators. We are " - + "investigating.") + event.reply( + "Sorry, there was an issue sending your report to the moderators. We are investigating.") .setEphemeral(true) .queue(); logger.warn( @@ -197,6 +198,15 @@ private void sendModMessage(ModalInteractionEvent event, List args, .queue(); } + private String createUserReply(Result result) { + if (result.isFailure()) { + logger.warn("Unable to forward a message report to modmail channel.", + result.getFailure()); + return "Sorry, there was an issue sending your report to the moderators. We are investigating."; + } + return "Thank you for reporting this message. A moderator will take care of the matter as soon as possible."; + } + private record ReportedMessage(String content, String id, String channelID, Instant timestamp, String authorName, String authorAvatarUrl) { static ReportedMessage ofArgs(List args) { @@ -209,16 +219,7 @@ static ReportedMessage ofArgs(List args) { return new ReportedMessage(content, id, channelID, timestamp, authorName, authorAvatarUrl); } - } - - private String createUserReply(Result result) { - if (result.isFailure()) { - logger.warn("Unable to forward a message report to modmail channel.", - result.getFailure()); - return "Sorry, there was an issue sending your report to the moderators. We are investigating."; - } - return "Thank you for reporting this message. A moderator will take care of the matter as soon as possible."; } } From 269ccb22ee46626153358e52fabdb7dafa34e6cc Mon Sep 17 00:00:00 2001 From: DevSerendipity Date: Wed, 9 Nov 2022 16:10:42 +0100 Subject: [PATCH 26/26] yes --- .../togetherjava/tjbot/commands/moderation/ReportCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java index 168f21fc62..005e779587 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ReportCommand.java @@ -92,7 +92,7 @@ public void onMessageContext(MessageContextInteractionEvent event) { String reportedAuthorAvatarURL = event.getTarget().getAuthor().getAvatarUrl(); String reportedAuthorID = event.getTarget().getAuthor().getId(); - TextInput modalBody = TextInput + TextInput modalTextInput = TextInput .create(REPORT_REASON_INPUT_ID, "Anonymous report to the moderators", TextInputStyle.PARAGRAPH) .setPlaceholder("Why do you want to report this message?") @@ -103,7 +103,7 @@ public void onMessageContext(MessageContextInteractionEvent event) { reportedMessageChannel, reportedMessageTimestamp, reportedAuthorName, reportedAuthorAvatarURL, reportedAuthorID); Modal reportModal = Modal.create(reportModalComponentID, "Report this to a moderator") - .addActionRow(modalBody) + .addActionRow(modalTextInput) .build(); event.replyModal(reportModal).queue();