From fcb7dc420fdaf48f6408fc43f5ea9ee92d0509b5 Mon Sep 17 00:00:00 2001 From: cattyn Date: Mon, 20 Apr 2026 00:51:45 +0300 Subject: [PATCH] feat: add `GreedyArgumentType` in command api --- .../commands/argument/ColorArgumentType.java | 2 +- .../argument/CommandArgumentType.java | 2 +- .../commands/argument/EnumArgumentType.java | 2 +- .../commands/argument/GreedyArgumentType.java | 40 +++++++++++++++++++ .../argument/KeybindArgumentType.java | 2 +- 5 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 src/main/java/me/alpha432/oyvey/features/commands/argument/GreedyArgumentType.java diff --git a/src/main/java/me/alpha432/oyvey/features/commands/argument/ColorArgumentType.java b/src/main/java/me/alpha432/oyvey/features/commands/argument/ColorArgumentType.java index 69b4a2f..e4ebe92 100644 --- a/src/main/java/me/alpha432/oyvey/features/commands/argument/ColorArgumentType.java +++ b/src/main/java/me/alpha432/oyvey/features/commands/argument/ColorArgumentType.java @@ -17,7 +17,7 @@ import java.util.concurrent.CompletableFuture; import static me.alpha432.oyvey.features.commands.ArgumentSuggestions.suggest; -public class ColorArgumentType implements ArgumentType { +public final class ColorArgumentType implements ArgumentType { private static final List EXAMPLES = List.of("hsb:55,100,100", "255,0,255", "0,255,255,80"); private static final String[] RGBA_VALUES = {"Red", "Green", "Blue", "Alpha"}; diff --git a/src/main/java/me/alpha432/oyvey/features/commands/argument/CommandArgumentType.java b/src/main/java/me/alpha432/oyvey/features/commands/argument/CommandArgumentType.java index 2a6a10c..bb358e8 100644 --- a/src/main/java/me/alpha432/oyvey/features/commands/argument/CommandArgumentType.java +++ b/src/main/java/me/alpha432/oyvey/features/commands/argument/CommandArgumentType.java @@ -15,7 +15,7 @@ import java.util.concurrent.CompletableFuture; import static me.alpha432.oyvey.features.commands.ArgumentSuggestions.suggest; -public class CommandArgumentType implements ArgumentType, CommandExceptionType { +public final class CommandArgumentType implements ArgumentType, CommandExceptionType { @Override public Command parse(StringReader reader) throws CommandSyntaxException { String value = reader.readString().toLowerCase(); diff --git a/src/main/java/me/alpha432/oyvey/features/commands/argument/EnumArgumentType.java b/src/main/java/me/alpha432/oyvey/features/commands/argument/EnumArgumentType.java index f873297..663a167 100644 --- a/src/main/java/me/alpha432/oyvey/features/commands/argument/EnumArgumentType.java +++ b/src/main/java/me/alpha432/oyvey/features/commands/argument/EnumArgumentType.java @@ -14,7 +14,7 @@ import java.util.concurrent.CompletableFuture; import static me.alpha432.oyvey.features.commands.ArgumentSuggestions.suggest; -public class EnumArgumentType> implements ArgumentType { +public final class EnumArgumentType> implements ArgumentType { private final Map enumNameMap = new HashMap<>(); private final T defaultValue; diff --git a/src/main/java/me/alpha432/oyvey/features/commands/argument/GreedyArgumentType.java b/src/main/java/me/alpha432/oyvey/features/commands/argument/GreedyArgumentType.java new file mode 100644 index 0000000..b0a4366 --- /dev/null +++ b/src/main/java/me/alpha432/oyvey/features/commands/argument/GreedyArgumentType.java @@ -0,0 +1,40 @@ +package me.alpha432.oyvey.features.commands.argument; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; + +import java.lang.reflect.Array; +import java.util.concurrent.CompletableFuture; + +public record GreedyArgumentType(ArgumentType parent, Class type) implements ArgumentType { + @Override + @SuppressWarnings("unchecked") + public T[] parse(StringReader reader) throws CommandSyntaxException { + String input = reader.getRemaining(); + reader.setCursor(reader.getTotalLength()); + String[] split = input.split(" "); + T[] values = (T[]) Array.newInstance(type, split.length); + for (int i = 0; i < split.length; i++) { + values[i] = parent.parse(new StringReader(split[i])); + } + return values; + } + + @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + String[] s = builder.getRemaining().split(" ", -1); + if (s.length == 0) { + return parent.listSuggestions(context, builder); + } + + int st = builder.getStart() + builder.getRemaining().length() - s[s.length - 1].length(); + return parent.listSuggestions(context, new SuggestionsBuilder(builder.getInput(), st)); + } + + public static GreedyArgumentType greedy(ArgumentType parent, Class type) { + return new GreedyArgumentType<>(parent, type); + } +} diff --git a/src/main/java/me/alpha432/oyvey/features/commands/argument/KeybindArgumentType.java b/src/main/java/me/alpha432/oyvey/features/commands/argument/KeybindArgumentType.java index 980cfa3..96f41e4 100644 --- a/src/main/java/me/alpha432/oyvey/features/commands/argument/KeybindArgumentType.java +++ b/src/main/java/me/alpha432/oyvey/features/commands/argument/KeybindArgumentType.java @@ -16,7 +16,7 @@ import java.util.concurrent.CompletableFuture; import static me.alpha432.oyvey.features.commands.ArgumentSuggestions.suggest; -public class KeybindArgumentType implements ArgumentType { +public final class KeybindArgumentType implements ArgumentType { private static final List EXAMPLES = List.of("A", "RIGHT_SHIFT", "MOUSE0"); @Override