diff --git a/application/src/main/java/org/togetherjava/tjbot/features/Features.java b/application/src/main/java/org/togetherjava/tjbot/features/Features.java index 65a9996842..1af25522e9 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/Features.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/Features.java @@ -10,7 +10,6 @@ import org.togetherjava.tjbot.features.basic.PingCommand; import org.togetherjava.tjbot.features.basic.QuoteBoardForwarder; import org.togetherjava.tjbot.features.basic.RoleSelectCommand; -import org.togetherjava.tjbot.features.basic.SlashCommandEducator; import org.togetherjava.tjbot.features.basic.SuggestionsUpDownVoter; import org.togetherjava.tjbot.features.bookmarks.BookmarksCommand; import org.togetherjava.tjbot.features.bookmarks.BookmarksSystem; @@ -164,7 +163,6 @@ public static Collection createFeatures(JDA jda, Database database, Con features.add(codeMessageHandler); features.add(new CodeMessageAutoDetection(config, codeMessageHandler)); features.add(new CodeMessageManualDetection(codeMessageHandler)); - features.add(new SlashCommandEducator()); features.add(new PinnedNotificationRemover(config)); features.add(new QuoteBoardForwarder(config)); diff --git a/application/src/main/java/org/togetherjava/tjbot/features/basic/SlashCommandEducator.java b/application/src/main/java/org/togetherjava/tjbot/features/basic/SlashCommandEducator.java deleted file mode 100644 index f2c0d7e24b..0000000000 --- a/application/src/main/java/org/togetherjava/tjbot/features/basic/SlashCommandEducator.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.togetherjava.tjbot.features.basic; - -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.events.message.MessageReceivedEvent; -import net.dv8tion.jda.api.requests.restaction.MessageCreateAction; -import net.dv8tion.jda.api.utils.FileUpload; - -import org.togetherjava.tjbot.features.MessageReceiverAdapter; -import org.togetherjava.tjbot.features.help.HelpSystemHelper; - -import java.io.InputStream; -import java.util.function.Predicate; -import java.util.regex.Pattern; - -/** - * Listens to messages that are likely supposed to be message commands, such as {@code !foo} and - * then educates the user about using slash commands, such as {@code /foo} instead. - */ -public final class SlashCommandEducator extends MessageReceiverAdapter { - private static final int MAX_COMMAND_LENGTH = 30; - private static final String SLASH_COMMAND_POPUP_ADVICE_PATH = "slashCommandPopupAdvice.png"; - private static final Predicate IS_MESSAGE_COMMAND = Pattern.compile(""" - [.!?] #Start of message command - [a-zA-Z]{2,15} #Name of message command, e.g. 'close' - .*[^);] #Rest of the message (don't end with code stuff) - """, Pattern.COMMENTS).asMatchPredicate(); - - @Override - public void onMessageReceived(MessageReceivedEvent event) { - if (event.getAuthor().isBot() || event.isWebhookMessage()) { - return; - } - - String content = event.getMessage().getContentRaw(); - - if (IS_MESSAGE_COMMAND.test(content) && content.length() < MAX_COMMAND_LENGTH) { - sendAdvice(event.getMessage()); - } - } - - private void sendAdvice(Message message) { - String content = - """ - Looks like you attempted to use a command? Please note that we only use **slash-commands** on this server 🙂 - - Try starting your message with a forward-slash `/` and Discord should open a popup showing you all available commands. - A command might then look like `/foo` 👍"""; - - createReply(message, content).queue(); - } - - private static MessageCreateAction createReply(Message messageToReplyTo, String content) { - boolean useImage = true; - InputStream imageData = - HelpSystemHelper.class.getResourceAsStream("/" + SLASH_COMMAND_POPUP_ADVICE_PATH); - if (imageData == null) { - useImage = false; - } - - MessageEmbed embed = new EmbedBuilder().setDescription(content) - .setImage(useImage ? "attachment://" + SLASH_COMMAND_POPUP_ADVICE_PATH : null) - .build(); - - MessageCreateAction action = messageToReplyTo.replyEmbeds(embed); - if (useImage) { - action = action - .addFiles(FileUpload.fromData(imageData, SLASH_COMMAND_POPUP_ADVICE_PATH)); - } - - return action; - } -} diff --git a/application/src/main/resources/slashCommandPopupAdvice.png b/application/src/main/resources/slashCommandPopupAdvice.png deleted file mode 100644 index 6284b8566e..0000000000 Binary files a/application/src/main/resources/slashCommandPopupAdvice.png and /dev/null differ diff --git a/application/src/test/java/org/togetherjava/tjbot/features/basic/SlashCommandEducatorTest.java b/application/src/test/java/org/togetherjava/tjbot/features/basic/SlashCommandEducatorTest.java deleted file mode 100644 index 03d07c1a2c..0000000000 --- a/application/src/test/java/org/togetherjava/tjbot/features/basic/SlashCommandEducatorTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.togetherjava.tjbot.features.basic; - -import net.dv8tion.jda.api.entities.MessageEmbed; -import net.dv8tion.jda.api.entities.channel.ChannelType; -import net.dv8tion.jda.api.events.message.MessageReceivedEvent; -import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder; -import net.dv8tion.jda.api.utils.messages.MessageCreateData; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import org.togetherjava.tjbot.features.MessageReceiver; -import org.togetherjava.tjbot.jda.JdaTester; - -import java.util.List; -import java.util.stream.Stream; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -final class SlashCommandEducatorTest { - private JdaTester jdaTester; - private MessageReceiver messageReceiver; - - @BeforeEach - void setUp() { - jdaTester = new JdaTester(); - messageReceiver = new SlashCommandEducator(); - } - - private MessageReceivedEvent sendMessage(String content) { - MessageCreateData message = new MessageCreateBuilder().setContent(content).build(); - MessageReceivedEvent event = - jdaTester.createMessageReceiveEvent(message, List.of(), ChannelType.TEXT); - - messageReceiver.onMessageReceived(event); - - return event; - } - - @ParameterizedTest - @MethodSource("provideMessageCommands") - void sendsAdviceOnMessageCommand(String message) { - // GIVEN a message containing a message command - // WHEN the message is sent - MessageReceivedEvent event = sendMessage(message); - - // THEN the system replies to it with an advice - verify(event.getMessage(), times(1)).replyEmbeds(any(MessageEmbed.class)); - } - - @ParameterizedTest - @MethodSource("provideOtherMessages") - void ignoresOtherMessages(String message) { - // GIVEN a message that is not a message command - // WHEN the message is sent - MessageReceivedEvent event = sendMessage(message); - - // THEN the system ignores the message and does not reply to it - verify(event.getMessage(), never()).replyEmbeds(any(MessageEmbed.class)); - } - - private static Stream provideMessageCommands() { - return Stream.of("!foo", ".foo", "?foo", ".test", "!whatever", "!this is a test"); - } - - private static Stream provideOtherMessages() { - return Stream.of(" a ", "foo", "#foo", "/foo", "!!!", "?!?!?", "?", ".,-", "!f", "! foo", - "thisIsAWordWhichLengthIsMoreThanThirtyLetterSoItShouldNotReply", - ".isLetter and .isNumber are available", ".toString()", ".toString();", - "this is a test;"); - } -}