From eff32f84375de0766f4d15007992e096fa8ee34e Mon Sep 17 00:00:00 2001 From: ChomeNS <95471003+ChomeNS@users.noreply.github.com> Date: Sat, 3 May 2025 16:12:27 +0700 Subject: [PATCH] refactor: improve flags system and support `--flag` instead of only `-flag` had to remove flags in TestCommand sadly --- build-number.txt | 2 +- .../chomens_bot/command/CommandContext.java | 30 ++++++++++++------- .../chomens_bot/command/CommonFlags.java | 6 ++++ .../chomens_bot/commands/FilterCommand.java | 11 +++---- .../chomens_bot/commands/FindAltsCommand.java | 12 +++++--- .../chomens_bot/commands/GrepLogCommand.java | 11 +++---- .../chomens_bot/commands/TestCommand.java | 3 +- 7 files changed, 43 insertions(+), 32 deletions(-) create mode 100644 src/main/java/me/chayapak1/chomens_bot/command/CommonFlags.java diff --git a/build-number.txt b/build-number.txt index 485e1224..bf3b63f2 100644 --- a/build-number.txt +++ b/build-number.txt @@ -1 +1 @@ -3066 \ No newline at end of file +3069 \ No newline at end of file diff --git a/src/main/java/me/chayapak1/chomens_bot/command/CommandContext.java b/src/main/java/me/chayapak1/chomens_bot/command/CommandContext.java index 41369999..8fa07c64 100644 --- a/src/main/java/me/chayapak1/chomens_bot/command/CommandContext.java +++ b/src/main/java/me/chayapak1/chomens_bot/command/CommandContext.java @@ -15,8 +15,11 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class CommandContext { - public static final Component UNKNOWN_ARGUMENT_COMPONENT = Component.text("???").style(Style.style(TextDecoration.UNDERLINED)); - private static final Pattern FLAGS_PATTERN = Pattern.compile("^\\s*-([^\\s0-9]\\S*)"); // stolen from HBot + public static final Component UNKNOWN_ARGUMENT_COMPONENT = Component + .text("???") + .style(Style.style(TextDecoration.UNDERLINED)); + private static final Pattern FLAGS_PATTERN = Pattern + .compile("^\\s*(?:--|-)([^\\s0-9]\\S*)"); // modified from HBot public final Bot bot; @@ -179,22 +182,24 @@ public class CommandContext { return getString(false, true, true, "action"); } - public List getFlags () throws CommandException { return getFlags(false); } + public List getFlags (final String... allowedFlags) throws CommandException { return getFlags(false, allowedFlags); } - public List getFlags (final boolean returnLowerCase) throws CommandException { + public List getFlags (final boolean returnLowerCase, final String... allowedFlags) throws CommandException { final List flags = new ArrayList<>(); - String flag = getFlag(returnLowerCase); + String flag = getFlag(returnLowerCase, allowedFlags); while (flag != null) { flags.add(flag); - flag = getFlag(returnLowerCase); + flag = getFlag(returnLowerCase, allowedFlags); } return flags; } - private String getFlag (final boolean returnLowerCase) throws CommandException { + private String getFlag (final boolean returnLowerCase, final String[] allowedFlagsArray) throws CommandException { + final List allowedFlags = Arrays.asList(allowedFlagsArray); + final String string = getString(false, false, returnLowerCase); if (string.isBlank()) return null; @@ -202,11 +207,14 @@ public class CommandContext { final Matcher matcher = FLAGS_PATTERN.matcher(string); if (matcher.find()) { - return matcher.group(1); - } else { - argsPosition--; // getString incremented argsPosition - return null; + final String match = matcher.group(1); + + if (allowedFlags.contains(match)) return match; } + + argsPosition--; // getString incremented argsPosition + + return null; } public Integer getInteger (final boolean required) throws CommandException { diff --git a/src/main/java/me/chayapak1/chomens_bot/command/CommonFlags.java b/src/main/java/me/chayapak1/chomens_bot/command/CommonFlags.java new file mode 100644 index 00000000..ed3adc1e --- /dev/null +++ b/src/main/java/me/chayapak1/chomens_bot/command/CommonFlags.java @@ -0,0 +1,6 @@ +package me.chayapak1.chomens_bot.command; + +public final class CommonFlags { + public static final String IGNORE_CASE = "ignorecase"; + public static final String REGEX = "regex"; +} diff --git a/src/main/java/me/chayapak1/chomens_bot/commands/FilterCommand.java b/src/main/java/me/chayapak1/chomens_bot/commands/FilterCommand.java index 4c0b2929..ad3afa79 100644 --- a/src/main/java/me/chayapak1/chomens_bot/commands/FilterCommand.java +++ b/src/main/java/me/chayapak1/chomens_bot/commands/FilterCommand.java @@ -1,10 +1,7 @@ package me.chayapak1.chomens_bot.commands; import me.chayapak1.chomens_bot.Bot; -import me.chayapak1.chomens_bot.command.Command; -import me.chayapak1.chomens_bot.command.CommandContext; -import me.chayapak1.chomens_bot.command.CommandException; -import me.chayapak1.chomens_bot.command.TrustLevel; +import me.chayapak1.chomens_bot.command.*; import me.chayapak1.chomens_bot.data.filter.FilteredPlayer; import me.chayapak1.chomens_bot.plugins.DatabasePlugin; import me.chayapak1.chomens_bot.plugins.PlayerFilterPlugin; @@ -40,10 +37,10 @@ public class FilterCommand extends Command { public Component execute (final CommandContext context) throws CommandException { final Bot bot = context.bot; - final List flags = context.getFlags(true); + final List flags = context.getFlags(true, CommonFlags.IGNORE_CASE, CommonFlags.REGEX); - final boolean ignoreCase = flags.contains("ignorecase"); - final boolean regex = flags.contains("regex"); + final boolean ignoreCase = flags.contains(CommonFlags.IGNORE_CASE); + final boolean regex = flags.contains(CommonFlags.REGEX); final String action = context.getString(false, true, true); diff --git a/src/main/java/me/chayapak1/chomens_bot/commands/FindAltsCommand.java b/src/main/java/me/chayapak1/chomens_bot/commands/FindAltsCommand.java index 0aab5063..b8ee8190 100644 --- a/src/main/java/me/chayapak1/chomens_bot/commands/FindAltsCommand.java +++ b/src/main/java/me/chayapak1/chomens_bot/commands/FindAltsCommand.java @@ -18,15 +18,19 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; public class FindAltsCommand extends Command { + // we allow both, since the flag used to be `allserver` + private static final String ALL_SERVER_FLAG = "allserver"; + private static final String ALL_SERVERS_FLAG = "allservers"; + public FindAltsCommand () { super( "findalts", "Finds players with the same IP address", - new String[] { "-allserver ", "" }, + new String[] { "-allservers ", "" }, new String[] { "alts", "sameip" }, TrustLevel.PUBLIC, false, - new ChatPacketType[]{ ChatPacketType.DISGUISED } + new ChatPacketType[] { ChatPacketType.DISGUISED } ); } @@ -39,9 +43,9 @@ public class FindAltsCommand extends Command { Main.database.checkOverloaded(); - final List flags = context.getFlags(true); + final List flags = context.getFlags(true, ALL_SERVER_FLAG, ALL_SERVERS_FLAG); - final boolean allServer = flags.contains("allserver"); + final boolean allServer = flags.contains(ALL_SERVER_FLAG) || flags.contains(ALL_SERVERS_FLAG); final String player = context.getString(true, true); diff --git a/src/main/java/me/chayapak1/chomens_bot/commands/GrepLogCommand.java b/src/main/java/me/chayapak1/chomens_bot/commands/GrepLogCommand.java index 7789a3ec..2f8642c5 100644 --- a/src/main/java/me/chayapak1/chomens_bot/commands/GrepLogCommand.java +++ b/src/main/java/me/chayapak1/chomens_bot/commands/GrepLogCommand.java @@ -2,10 +2,7 @@ package me.chayapak1.chomens_bot.commands; import me.chayapak1.chomens_bot.Bot; import me.chayapak1.chomens_bot.Main; -import me.chayapak1.chomens_bot.command.Command; -import me.chayapak1.chomens_bot.command.CommandContext; -import me.chayapak1.chomens_bot.command.CommandException; -import me.chayapak1.chomens_bot.command.TrustLevel; +import me.chayapak1.chomens_bot.command.*; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -32,10 +29,10 @@ public class GrepLogCommand extends Command { throw new CommandException(Component.text("The bot's Discord integration has to be enabled to use this command.")); } - final List flags = context.getFlags(true); + final List flags = context.getFlags(true, CommonFlags.IGNORE_CASE, CommonFlags.REGEX); - final boolean ignoreCase = flags.contains("ignorecase"); - final boolean regex = flags.contains("regex"); + final boolean ignoreCase = flags.contains(CommonFlags.IGNORE_CASE); + final boolean regex = flags.contains(CommonFlags.REGEX); final String input = context.getString(true, true); diff --git a/src/main/java/me/chayapak1/chomens_bot/commands/TestCommand.java b/src/main/java/me/chayapak1/chomens_bot/commands/TestCommand.java index 2891ecb1..7c7327e7 100644 --- a/src/main/java/me/chayapak1/chomens_bot/commands/TestCommand.java +++ b/src/main/java/me/chayapak1/chomens_bot/commands/TestCommand.java @@ -21,11 +21,10 @@ public class TestCommand extends Command { @Override public Component execute (final CommandContext context) throws CommandException { return Component.translatable( - "Hello, World! Username: %s, Sender UUID: %s, Prefix: %s, Flags: %s, Args: %s", + "Hello, World! Username: %s, Sender UUID: %s, Prefix: %s, Args: %s", Component.text(context.sender.profile.getName()), Component.text(context.sender.profile.getIdAsString()), Component.text(context.prefix), - Component.text(String.join(" ", context.getFlags())), Component.text(context.getString(true, false)) ).color(NamedTextColor.GREEN); }