From 1268cf16c06e62e9fd4f734ea5de7ff1d1c652e4 Mon Sep 17 00:00:00 2001 From: mworzala Date: Sat, 25 Mar 2023 09:29:20 -0400 Subject: [PATCH] hollow-cube/sender-in-command-arg-parsing Signed-off-by: mworzala fix default argument issue (cherry picked from commit a7440639c8541faeb91155c53ce3a1f4d60df127) Add sender to command parse chain (cherry picked from commit 853307891d178abdc7036f8c809c52909cdca327) --- CHANGELOG.md | 4 ++ .../server/command/CommandManager.java | 6 +-- .../server/command/CommandParser.java | 2 +- .../server/command/CommandParserImpl.java | 25 +++++------ .../server/command/GraphConverter.java | 4 +- .../server/command/builder/Command.java | 9 ++-- .../command/builder/CommandDispatcher.java | 4 +- .../server/command/builder/CommandSyntax.java | 8 ++-- .../command/builder/arguments/Argument.java | 43 ++++++++++++------- .../builder/arguments/ArgumentBoolean.java | 3 +- .../builder/arguments/ArgumentCommand.java | 5 ++- .../builder/arguments/ArgumentEnum.java | 3 +- .../builder/arguments/ArgumentGroup.java | 6 ++- .../builder/arguments/ArgumentLiteral.java | 3 +- .../builder/arguments/ArgumentLoop.java | 5 ++- .../builder/arguments/ArgumentString.java | 5 ++- .../arguments/ArgumentStringArray.java | 3 +- .../builder/arguments/ArgumentWord.java | 3 +- .../minecraft/ArgumentBlockState.java | 5 ++- .../arguments/minecraft/ArgumentColor.java | 3 +- .../minecraft/ArgumentComponent.java | 3 +- .../arguments/minecraft/ArgumentEntity.java | 23 +++++----- .../minecraft/ArgumentItemStack.java | 5 ++- .../minecraft/ArgumentNbtCompoundTag.java | 3 +- .../arguments/minecraft/ArgumentNbtTag.java | 3 +- .../arguments/minecraft/ArgumentRange.java | 3 +- .../minecraft/ArgumentResourceLocation.java | 3 +- .../arguments/minecraft/ArgumentTime.java | 3 +- .../arguments/minecraft/ArgumentUUID.java | 3 +- .../minecraft/registry/ArgumentRegistry.java | 3 +- .../arguments/number/ArgumentNumber.java | 3 +- .../relative/ArgumentRelativeVec.java | 3 +- .../builder/parser/ArgumentParser.java | 8 ++-- .../command/builder/parser/CommandParser.java | 11 +++-- .../server/listener/TabCompleteListener.java | 2 +- .../minestom/server/command/ArgumentTest.java | 6 +-- .../server/command/ArgumentTypeTest.java | 25 ++++++++--- .../server/command/CommandParseTest.java | 2 +- 38 files changed, 160 insertions(+), 101 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9f0efc9f..c91a94d5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,3 +11,7 @@ Some of these are pending, some deserve PRs, others are just minor tweaks * **breaking** Remove tinylog and MinestomTerminal implementation * Add `Tag.Transient` * Optionally allow multiple parents in event nodes +* **breaking** Add sender to argument parsing chain + * This allows for argument parsing based on the sender, such as in argument map. This was already present for suggestions, but not for parsing. + * This is a breaking change because it changes the signature of `Argument#parse`, but most use cases should not be affected. + Support has been maintained for the old argument map signature, so only completely custom arguments will be affected. \ No newline at end of file diff --git a/src/main/java/net/minestom/server/command/CommandManager.java b/src/main/java/net/minestom/server/command/CommandManager.java index 749194a08..b31a4d54e 100644 --- a/src/main/java/net/minestom/server/command/CommandManager.java +++ b/src/main/java/net/minestom/server/command/CommandManager.java @@ -108,7 +108,7 @@ public final class CommandManager { command = playerCommandEvent.getCommand(); } // Process the command - final CommandParser.Result parsedCommand = parseCommand(command); + final CommandParser.Result parsedCommand = parseCommand(sender, command); final ExecutableCommand executable = parsedCommand.executable(); final ExecutableCommand.Result executeResult = executable.execute(sender); final CommandResult result = resultConverter(executable, executeResult, command); @@ -184,8 +184,8 @@ public final class CommandManager { * @param input commands string without prefix * @return the parsing result */ - public CommandParser.Result parseCommand(String input) { - return parser.parse(getGraph(), input); + public CommandParser.Result parseCommand(@NotNull CommandSender sender, String input) { + return parser.parse(sender, getGraph(), input); } private Graph getGraph() { diff --git a/src/main/java/net/minestom/server/command/CommandParser.java b/src/main/java/net/minestom/server/command/CommandParser.java index 78f8e5ac6..e77145dbf 100644 --- a/src/main/java/net/minestom/server/command/CommandParser.java +++ b/src/main/java/net/minestom/server/command/CommandParser.java @@ -24,7 +24,7 @@ public interface CommandParser { * @return the parsed command which can be executed and cached */ @Contract("_, _ -> new") - @NotNull Result parse(@NotNull Graph graph, @NotNull String input); + @NotNull Result parse(@NotNull CommandSender sender, @NotNull Graph graph, @NotNull String input); sealed interface Result { @NotNull ExecutableCommand executable(); diff --git a/src/main/java/net/minestom/server/command/CommandParserImpl.java b/src/main/java/net/minestom/server/command/CommandParserImpl.java index 007ebd65d..f99c20ef7 100644 --- a/src/main/java/net/minestom/server/command/CommandParserImpl.java +++ b/src/main/java/net/minestom/server/command/CommandParserImpl.java @@ -1,10 +1,7 @@ package net.minestom.server.command; import net.minestom.server.command.Graph.Node; -import net.minestom.server.command.builder.ArgumentCallback; -import net.minestom.server.command.builder.CommandContext; -import net.minestom.server.command.builder.CommandData; -import net.minestom.server.command.builder.CommandExecutor; +import net.minestom.server.command.builder.*; import net.minestom.server.command.builder.arguments.Argument; import net.minestom.server.command.builder.condition.CommandCondition; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; @@ -79,13 +76,13 @@ final class CommandParserImpl implements CommandParser { } @Override - public @NotNull CommandParser.Result parse(@NotNull Graph graph, @NotNull String input) { + public @NotNull CommandParser.Result parse(@NotNull CommandSender sender, @NotNull Graph graph, @NotNull String input) { final CommandStringReader reader = new CommandStringReader(input); final Chain chain = new Chain(); // Read from input NodeResult result; Node parent = graph.root(); - while ((result = parseChild(parent, reader)) != null) { + while ((result = parseChild(sender, parent, reader)) != null) { chain.append(result); if (result.argumentResult instanceof ArgumentResult.SyntaxError e) { // Syntax error stop at this arg @@ -106,9 +103,9 @@ final class CommandParserImpl implements CommandParser { parent = null; for (Node child : tmp.next()) { final Argument argument = child.argument(); - final Supplier defaultSupplier = argument.getDefaultValue(); + final Function defaultSupplier = argument.getDefaultValue(); if (defaultSupplier != null) { - final Object value = defaultSupplier.get(); + final Object value = defaultSupplier.apply(sender); final ArgumentResult argumentResult = new ArgumentResult.Success<>(value, ""); chain.append(new NodeResult(child, argumentResult, argument.getSuggestionCallback())); parent = child; @@ -145,12 +142,12 @@ final class CommandParserImpl implements CommandParser { return obj == null ? null : getter.apply(obj); } - private static NodeResult parseChild(Node parent, CommandStringReader reader) { + private static NodeResult parseChild(@NotNull CommandSender sender, Node parent, CommandStringReader reader) { if (!reader.hasRemaining()) return null; for (Node child : parent.next()) { final Argument argument = child.argument(); final int start = reader.cursor(); - final ArgumentResult parse = parse(argument, reader); + final ArgumentResult parse = parse(sender, argument, reader); if (parse instanceof ArgumentResult.Success success) { return new NodeResult(child, (ArgumentResult) success, argument.getSuggestionCallback()); @@ -375,18 +372,18 @@ final class CommandParserImpl implements CommandParser { // ARGUMENT - private static ArgumentResult parse(Argument argument, CommandStringReader reader) { + private static ArgumentResult parse(@NotNull CommandSender sender, Argument argument, CommandStringReader reader) { // Handle specific type without loop try { // Single word argument if (!argument.allowSpace()) { final String word = reader.readWord(); - return new ArgumentResult.Success<>(argument.parse(word), word); + return new ArgumentResult.Success<>(argument.parse(sender, word), word); } // Complete input argument if (argument.useRemaining()) { final String remaining = reader.readRemaining(); - return new ArgumentResult.Success<>(argument.parse(remaining), remaining); + return new ArgumentResult.Success<>(argument.parse(sender, remaining), remaining); } } catch (ArgumentSyntaxException ignored) { return new ArgumentResult.IncompatibleType<>(); @@ -397,7 +394,7 @@ final class CommandParserImpl implements CommandParser { while (true) { try { final String input = current.toString(); - return new ArgumentResult.Success<>(argument.parse(input), input); + return new ArgumentResult.Success<>(argument.parse(sender, input), input); } catch (ArgumentSyntaxException ignored) { if (!reader.hasRemaining()) break; current.append(" "); diff --git a/src/main/java/net/minestom/server/command/GraphConverter.java b/src/main/java/net/minestom/server/command/GraphConverter.java index 2578c62ee..46d75c402 100644 --- a/src/main/java/net/minestom/server/command/GraphConverter.java +++ b/src/main/java/net/minestom/server/command/GraphConverter.java @@ -1,5 +1,6 @@ package net.minestom.server.command; +import net.minestom.server.MinecraftServer; import net.minestom.server.command.builder.arguments.*; import net.minestom.server.entity.Player; import net.minestom.server.network.packet.server.play.DeclareCommandsPacket; @@ -77,7 +78,8 @@ final class GraphConverter { redirects.add((graph, root) -> node.redirectedNode = root); } else { redirects.add((graph, root) -> { - final List> args = CommandParser.parser().parse(graph, shortcut).args(); + var sender = player == null ? MinecraftServer.getCommandManager().getConsoleSender() : player; + final List> args = CommandParser.parser().parse(sender, graph, shortcut).args(); final Argument last = args.get(args.size() - 1); if (last.allowSpace()) { node.redirectedNode = argToPacketId.get(args.get(args.size()-2)); diff --git a/src/main/java/net/minestom/server/command/builder/Command.java b/src/main/java/net/minestom/server/command/builder/Command.java index 2f840b87f..dc4117542 100644 --- a/src/main/java/net/minestom/server/command/builder/Command.java +++ b/src/main/java/net/minestom/server/command/builder/Command.java @@ -16,10 +16,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Supplier; +import java.util.function.*; import java.util.stream.Stream; /** @@ -167,14 +164,14 @@ public class Command { // the 'args' array starts by all the required arguments, followed by the optional ones List> requiredArguments = new ArrayList<>(); - Map> defaultValuesMap = new HashMap<>(); + Map> defaultValuesMap = new HashMap<>(); boolean optionalBranch = false; int i = 0; for (Argument argument : args) { final boolean isLast = ++i == args.length; if (argument.isOptional()) { // Set default value - defaultValuesMap.put(argument.getId(), (Supplier) argument.getDefaultValue()); + defaultValuesMap.put(argument.getId(), (Function) argument.getDefaultValue()); if (!optionalBranch && !requiredArguments.isEmpty()) { // First optional argument, create a syntax with current cached arguments diff --git a/src/main/java/net/minestom/server/command/builder/CommandDispatcher.java b/src/main/java/net/minestom/server/command/builder/CommandDispatcher.java index ce5805907..637dca8ad 100644 --- a/src/main/java/net/minestom/server/command/builder/CommandDispatcher.java +++ b/src/main/java/net/minestom/server/command/builder/CommandDispatcher.java @@ -74,8 +74,8 @@ public class CommandDispatcher { * @param commandString the command (containing the command name and the args if any) * @return the parsing result */ - public @NotNull CommandResult parse(@NotNull String commandString) { - final net.minestom.server.command.CommandParser.Result test = manager.parseCommand(commandString); + public @NotNull CommandResult parse(@NotNull CommandSender sender, @NotNull String commandString) { + final net.minestom.server.command.CommandParser.Result test = manager.parseCommand(sender, commandString); return resultConverter(test, commandString); } diff --git a/src/main/java/net/minestom/server/command/builder/CommandSyntax.java b/src/main/java/net/minestom/server/command/builder/CommandSyntax.java index a076ce956..5171e1919 100644 --- a/src/main/java/net/minestom/server/command/builder/CommandSyntax.java +++ b/src/main/java/net/minestom/server/command/builder/CommandSyntax.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder; +import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.arguments.Argument; import net.minestom.server.command.builder.condition.CommandCondition; import net.minestom.server.entity.Player; @@ -9,6 +10,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.Map; +import java.util.function.Function; import java.util.function.Supplier; /** @@ -20,14 +22,14 @@ public class CommandSyntax { private CommandCondition commandCondition; private CommandExecutor executor; - private final Map> defaultValuesMap; + private final Map> defaultValuesMap; private final Argument[] args; private final boolean suggestion; protected CommandSyntax(@Nullable CommandCondition commandCondition, @NotNull CommandExecutor commandExecutor, - @Nullable Map> defaultValuesMap, + @Nullable Map> defaultValuesMap, @NotNull Argument... args) { this.commandCondition = commandCondition; this.executor = commandExecutor; @@ -87,7 +89,7 @@ public class CommandSyntax { } @Nullable - protected Map> getDefaultValuesMap() { + protected Map> getDefaultValuesMap() { return defaultValuesMap; } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/Argument.java b/src/main/java/net/minestom/server/command/builder/arguments/Argument.java index d30cfc9a5..fe4e34b12 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/Argument.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/Argument.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.ArgumentCallback; import net.minestom.server.command.builder.Command; import net.minestom.server.command.builder.CommandExecutor; @@ -13,6 +14,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; @@ -22,7 +24,7 @@ import java.util.function.Supplier; *

* You can create your own with your own special conditions. *

- * Arguments are parsed using {@link #parse(String)}. + * Arguments are parsed using {@link #parse(CommandSender, String)}. * * @param the type of this parsed argument */ @@ -44,7 +46,7 @@ public abstract class Argument { private ArgumentCallback callback; - private Supplier defaultValue; + private Function defaultValue; private SuggestionCallback suggestionCallback; protected SuggestionType suggestionType; @@ -90,8 +92,8 @@ public abstract class Argument { * @throws ArgumentSyntaxException if the argument cannot be parsed due to a fault input (argument id) */ @ApiStatus.Experimental - public static @NotNull T parse(@NotNull Argument argument) throws ArgumentSyntaxException { - return argument.parse(argument.getId()); + public static @NotNull T parse(@NotNull CommandSender sender, @NotNull Argument argument) throws ArgumentSyntaxException { + return argument.parse(sender, argument.getId()); } /** @@ -102,7 +104,7 @@ public abstract class Argument { * @return the parsed argument * @throws ArgumentSyntaxException if {@code value} is not valid */ - public abstract @NotNull T parse(@NotNull String input) throws ArgumentSyntaxException; + public abstract @NotNull T parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException; public abstract String parser(); @@ -187,7 +189,7 @@ public abstract class Argument { } @Nullable - public Supplier getDefaultValue() { + public Function getDefaultValue() { return defaultValue; } @@ -202,6 +204,12 @@ public abstract class Argument { */ @NotNull public Argument setDefaultValue(@Nullable Supplier defaultValue) { + this.defaultValue = unused -> defaultValue.get(); + return this; + } + + @NotNull + public Argument setDefaultValue(@Nullable Function defaultValue) { this.defaultValue = defaultValue; return this; } @@ -214,7 +222,7 @@ public abstract class Argument { */ @NotNull public Argument setDefaultValue(@NotNull T defaultValue) { - this.defaultValue = () -> defaultValue; + this.defaultValue = unused -> defaultValue; return this; } @@ -261,6 +269,11 @@ public abstract class Argument { */ @ApiStatus.Experimental public @NotNull Argument map(@NotNull Function mapper) { + return new ArgumentMap<>(this, (p, i) -> mapper.apply(i)); + } + + @ApiStatus.Experimental + public @NotNull Argument map(@NotNull BiFunction mapper) { return new ArgumentMap<>(this, mapper); } @@ -293,22 +306,22 @@ public abstract class Argument { private static final class ArgumentMap extends Argument { public static final int INVALID_MAP = 555; final Argument argument; - final Function mapper; + final BiFunction<@NotNull CommandSender, I, O> mapper; - private ArgumentMap(@NotNull Argument argument, @NotNull Function mapper) { + private ArgumentMap(@NotNull Argument argument, @NotNull BiFunction<@NotNull CommandSender, I, O> mapper) { super(argument.getId(), argument.allowSpace(), argument.useRemaining()); if (argument.getSuggestionCallback() != null) this.setSuggestionCallback(argument.getSuggestionCallback()); if (argument.getDefaultValue() != null) - this.setDefaultValue(() -> mapper.apply(argument.getDefaultValue().get())); + this.setDefaultValue(sender -> mapper.apply(sender, argument.getDefaultValue().apply(sender))); this.argument = argument; this.mapper = mapper; } @Override - public @NotNull O parse(@NotNull String input) throws ArgumentSyntaxException { - final I value = argument.parse(input); - final O mappedValue = mapper.apply(value); + public @NotNull O parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException { + final I value = argument.parse(sender, input); + final O mappedValue = mapper.apply(sender, value); if (mappedValue == null) throw new ArgumentSyntaxException("Couldn't be converted to map type", input, INVALID_MAP); return mappedValue; @@ -341,8 +354,8 @@ public abstract class Argument { } @Override - public @NotNull T parse(@NotNull String input) throws ArgumentSyntaxException { - final T result = argument.parse(input); + public @NotNull T parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException { + final T result = argument.parse(sender, input); if (!predicate.test(result)) throw new ArgumentSyntaxException("Predicate failed", input, INVALID_FILTER); return result; diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentBoolean.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentBoolean.java index cffac0579..92f1d9f06 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentBoolean.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentBoolean.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import org.jetbrains.annotations.NotNull; @@ -18,7 +19,7 @@ public class ArgumentBoolean extends Argument { @NotNull @Override - public Boolean parse(@NotNull String input) throws ArgumentSyntaxException { + public Boolean parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException { if (input.equalsIgnoreCase("true")) return true; if (input.equalsIgnoreCase("false")) diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentCommand.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentCommand.java index dec261091..5ffe90d35 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentCommand.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentCommand.java @@ -1,6 +1,7 @@ package net.minestom.server.command.builder.arguments; import net.minestom.server.MinecraftServer; +import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.CommandDispatcher; import net.minestom.server.command.builder.CommandResult; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; @@ -21,12 +22,12 @@ public class ArgumentCommand extends Argument { @NotNull @Override - public CommandResult parse(@NotNull String input) throws ArgumentSyntaxException { + public CommandResult parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException { final String commandString = !shortcut.isEmpty() ? shortcut + StringUtils.SPACE + input : input; CommandDispatcher dispatcher = MinecraftServer.getCommandManager().getDispatcher(); - CommandResult result = dispatcher.parse(commandString); + CommandResult result = dispatcher.parse(sender, commandString); if (onlyCorrect && result.getType() != CommandResult.Type.SUCCESS) throw new ArgumentSyntaxException("Invalid command", input, INVALID_COMMAND_ERROR); diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentEnum.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentEnum.java index 3ac12d8d6..da100c8c5 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentEnum.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentEnum.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import org.jetbrains.annotations.NotNull; @@ -30,7 +31,7 @@ public class ArgumentEnum extends Argument { @NotNull @Override - public E parse(@NotNull String input) throws ArgumentSyntaxException { + public E parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException { for (E value : this.values) { if (this.format.formatter.apply(value.name()).equals(input)) { return value; diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentGroup.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentGroup.java index d598faa5e..f65b28e5c 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentGroup.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentGroup.java @@ -1,11 +1,13 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.CommandContext; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import net.minestom.server.command.builder.parser.CommandParser; import net.minestom.server.command.builder.parser.ValidSyntaxHolder; import net.minestom.server.utils.StringUtils; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -23,9 +25,9 @@ public class ArgumentGroup extends Argument { @NotNull @Override - public CommandContext parse(@NotNull String input) throws ArgumentSyntaxException { + public CommandContext parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException { List validSyntaxes = new ArrayList<>(); - CommandParser.parse(null, group, input.split(StringUtils.SPACE), input, validSyntaxes, null); + CommandParser.parse(sender, null, group, input.split(StringUtils.SPACE), input, validSyntaxes, null); CommandContext context = new CommandContext(input); CommandParser.findMostCorrectSyntax(validSyntaxes, context); diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLiteral.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLiteral.java index ffaccf0f0..7f45dadae 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLiteral.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLiteral.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import org.jetbrains.annotations.NotNull; @@ -13,7 +14,7 @@ public class ArgumentLiteral extends Argument { @NotNull @Override - public String parse(@NotNull String input) throws ArgumentSyntaxException { + public String parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException { if (!input.equals(getId())) throw new ArgumentSyntaxException("Invalid literal value", input, INVALID_VALUE_ERROR); diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLoop.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLoop.java index f16e8c907..aa5065da1 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLoop.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLoop.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import net.minestom.server.utils.StringUtils; import org.jetbrains.annotations.NotNull; @@ -22,7 +23,7 @@ public class ArgumentLoop extends Argument> { @NotNull @Override - public List parse(@NotNull String input) throws ArgumentSyntaxException { + public List parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException { List result = new ArrayList<>(); final String[] split = input.split(StringUtils.SPACE); @@ -34,7 +35,7 @@ public class ArgumentLoop extends Argument> { for (Argument argument : arguments) { try { final String inputString = builder.toString(); - final T value = argument.parse(inputString); + final T value = argument.parse(sender, inputString); success = true; result.add(value); break; diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentString.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentString.java index cb781abb0..6c6f78039 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentString.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentString.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import net.minestom.server.utils.StringUtils; import net.minestom.server.utils.binary.BinaryWriter; @@ -25,7 +26,7 @@ public class ArgumentString extends Argument { @NotNull @Override - public String parse(@NotNull String input) throws ArgumentSyntaxException { + public String parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException { return staticParse(input); } @@ -42,7 +43,7 @@ public class ArgumentString extends Argument { } /** - * @deprecated use {@link Argument#parse(Argument)} + * @deprecated use {@link Argument#parse(CommandSender, Argument)} */ @Deprecated public static String staticParse(@NotNull String input) throws ArgumentSyntaxException { diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentStringArray.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentStringArray.java index 3df213102..3e41f18d7 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentStringArray.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentStringArray.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.CommandSender; import net.minestom.server.utils.StringUtils; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; @@ -20,7 +21,7 @@ public class ArgumentStringArray extends Argument { @NotNull @Override - public String[] parse(@NotNull String input) { + public String[] parse(@NotNull CommandSender sender, @NotNull String input) { return input.split(Pattern.quote(StringUtils.SPACE)); } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentWord.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentWord.java index 5f7915369..8dcbc8933 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentWord.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentWord.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import net.minestom.server.utils.StringUtils; import net.minestom.server.utils.binary.BinaryWriter; @@ -51,7 +52,7 @@ public class ArgumentWord extends Argument { @NotNull @Override - public String parse(@NotNull String input) throws ArgumentSyntaxException { + public String parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException { if (input.contains(StringUtils.SPACE)) throw new ArgumentSyntaxException("Word cannot contain space character", input, SPACE_ERROR); diff --git a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentBlockState.java b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentBlockState.java index a4a8cc7aa..94637ec97 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentBlockState.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentBlockState.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments.minecraft; +import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.arguments.Argument; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import net.minestom.server.instance.block.Block; @@ -18,7 +19,7 @@ public class ArgumentBlockState extends Argument { } @Override - public @NotNull Block parse(@NotNull String input) throws ArgumentSyntaxException { + public @NotNull Block parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException { return staticParse(input); } @@ -28,7 +29,7 @@ public class ArgumentBlockState extends Argument { } /** - * @deprecated use {@link Argument#parse(Argument)} + * @deprecated use {@link Argument#parse(CommandSender, Argument)} */ @Deprecated public static Block staticParse(@NotNull String input) throws ArgumentSyntaxException { diff --git a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentColor.java b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentColor.java index 7b5d6fa1c..1163dc3fe 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentColor.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentColor.java @@ -2,6 +2,7 @@ package net.minestom.server.command.builder.arguments.minecraft; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.Style; +import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.arguments.Argument; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import org.jetbrains.annotations.NotNull; @@ -22,7 +23,7 @@ public class ArgumentColor extends Argument