From 2723ec13f98a0ea4dd6e61b39ee8ff22d9b46cd2 Mon Sep 17 00:00:00 2001 From: p5nbTgip0r Date: Tue, 5 Jan 2021 02:28:03 -0800 Subject: [PATCH] JDA channel argument parsing improvements. - Ensure that the parsing modes list cannot be empty when constructing `MessageParser` - Don't proceed if the command context does not have the message event stored - Don't proceed if the message was not sent in a guild - Remove `|| modes.size() == 1` check in channel mention parsing --- .../jda/parsers/ChannelArgument.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/cloud-discord/cloud-jda/src/main/java/cloud/commandframework/jda/parsers/ChannelArgument.java b/cloud-discord/cloud-jda/src/main/java/cloud/commandframework/jda/parsers/ChannelArgument.java index 7e5a9bb2..a3f4f5d6 100644 --- a/cloud-discord/cloud-jda/src/main/java/cloud/commandframework/jda/parsers/ChannelArgument.java +++ b/cloud-discord/cloud-jda/src/main/java/cloud/commandframework/jda/parsers/ChannelArgument.java @@ -147,8 +147,13 @@ public final class ChannelArgument extends CommandArgument * Construct a new argument parser for {@link MessageChannel} * * @param modes List of parsing modes to use when parsing + * @throws java.lang.IllegalStateException If no parsing modes were provided */ public MessageParser(final @NonNull Set modes) { + if (modes.isEmpty()) { + throw new IllegalArgumentException("At least one parsing mode is required"); + } + this.modes = modes; } @@ -165,11 +170,21 @@ public final class ChannelArgument extends CommandArgument )); } + if (!commandContext.contains("MessageReceivedEvent")) { + return ArgumentParseResult.failure(new IllegalStateException( + "MessageReceivedEvent was not in the command context." + )); + } + final MessageReceivedEvent event = commandContext.get("MessageReceivedEvent"); Exception exception = null; + if (!event.isFromGuild()) { + return ArgumentParseResult.failure(new IllegalArgumentException("Channel arguments can only be parsed in guilds")); + } + if (modes.contains(ParserMode.MENTION)) { - if (input.startsWith("<#") || modes.size() == 1) { + if (input.startsWith("<#") && input.endsWith(">")) { final String id = input.substring(2, input.length() - 1); try { @@ -179,6 +194,10 @@ public final class ChannelArgument extends CommandArgument } catch (final ChannelNotFoundException | NumberFormatException e) { exception = e; } + } else { + exception = new IllegalArgumentException( + String.format("Input '%s' is not a channel mention.", input) + ); } }