From 0196733de0b375a6c62fc3a1e72e2c176af7c36d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Tue, 15 Apr 2025 14:01:22 +0100 Subject: [PATCH 1/2] Added support for Spigot 1.16+ --- pom.xml | 10 +++++----- .../arguments/CommandArgument.java | 17 +++++++++++++---- .../commands/handler/CommandHandler.java | 4 +++- .../validation/AutoValidationData.java | 19 ++++++++++++++----- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 0a2ede1..c9f017a 100644 --- a/pom.xml +++ b/pom.xml @@ -9,8 +9,8 @@ 0.0.6 - 21 - 21 + 11 + 11 UTF-8 @@ -26,7 +26,7 @@ org.spigotmc spigot-api - 1.20.6-R0.1-SNAPSHOT + 1.16.1-R0.1-SNAPSHOT provided @@ -107,8 +107,8 @@ maven-compiler-plugin 3.11.0 - 21 - 21 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/src/main/java/dev/hugog/minecraft/dev_command/arguments/CommandArgument.java b/src/main/java/dev/hugog/minecraft/dev_command/arguments/CommandArgument.java index 022e675..55a6309 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/arguments/CommandArgument.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/arguments/CommandArgument.java @@ -1,8 +1,17 @@ package dev.hugog.minecraft.dev_command.arguments; import dev.hugog.minecraft.dev_command.arguments.parsers.CommandArgumentParser; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.experimental.Accessors; -public record CommandArgument(String name, String description, int position, - Class> validator, - boolean optional -) { } +@Getter +@RequiredArgsConstructor +@Accessors(fluent = true) +public class CommandArgument { + private final String name; + private final String description; + private final int position; + private final Class> validator; + private final boolean optional; +} diff --git a/src/main/java/dev/hugog/minecraft/dev_command/commands/handler/CommandHandler.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/handler/CommandHandler.java index 15c8075..a959596 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/commands/handler/CommandHandler.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/handler/CommandHandler.java @@ -18,6 +18,7 @@ import org.bukkit.command.CommandSender; import java.util.*; +import java.util.stream.Collectors; @Log4j2 public class CommandHandler { @@ -74,7 +75,8 @@ public List executeTabComplete(Integration integration, CommandSender co IDevCommand command = commandFactory.generate((AbstractCommandData) lastArgumentNode.getExtraData()); return command.onTabComplete(commandArguments); } else { // The tab completion should be handled by the DevCommand using info. about the command tree - return lastArgumentNode.getChildren().stream().map(Tree.Node::getData).toList(); + return lastArgumentNode.getChildren().stream().map(Tree.Node::getData) + .collect(Collectors.toUnmodifiableList()); } } diff --git a/src/main/java/dev/hugog/minecraft/dev_command/validation/AutoValidationData.java b/src/main/java/dev/hugog/minecraft/dev_command/validation/AutoValidationData.java index 5bc6c7b..aaac52b 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/validation/AutoValidationData.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/validation/AutoValidationData.java @@ -1,7 +1,16 @@ package dev.hugog.minecraft.dev_command.validation; -public record AutoValidationData( - boolean validatePermission, - boolean validateArguments, - boolean validateSender -) { } +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.experimental.Accessors; + +@Getter +@RequiredArgsConstructor +@Accessors(fluent = true) +public class AutoValidationData { + private final boolean validatePermission; + private final boolean validateArguments; + private final boolean validateSender; +} + + From db3aedb527109d0d49373c2b2bfd91e988676a7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Tue, 22 Apr 2025 21:16:50 +0100 Subject: [PATCH 2/2] Added support to argument parsers for optional arguments. --- pom.xml | 2 +- .../arguments/CommandArgument.java | 14 +++++++++++++ .../commands/BukkitDevCommand.java | 16 +++++++++++++- .../dev_command/commands/IDevCommand.java | 21 +++++++++++++++++++ 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c9f017a..08ef802 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ dev.hugog.minecraft dev-command - 0.0.6 + 0.0.7 11 diff --git a/src/main/java/dev/hugog/minecraft/dev_command/arguments/CommandArgument.java b/src/main/java/dev/hugog/minecraft/dev_command/arguments/CommandArgument.java index 55a6309..17588f8 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/arguments/CommandArgument.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/arguments/CommandArgument.java @@ -5,6 +5,8 @@ import lombok.RequiredArgsConstructor; import lombok.experimental.Accessors; +import java.util.Objects; + @Getter @RequiredArgsConstructor @Accessors(fluent = true) @@ -14,4 +16,16 @@ public class CommandArgument { private final int position; private final Class> validator; private final boolean optional; + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + CommandArgument that = (CommandArgument) o; + return position == that.position && optional == that.optional && Objects.equals(name, that.name) && Objects.equals(description, that.description) && Objects.equals(validator, that.validator); + } + + @Override + public int hashCode() { + return Objects.hash(name, description, position, validator, optional); + } } diff --git a/src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java index d2744c8..8726eef 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java @@ -17,6 +17,7 @@ import org.bukkit.entity.Player; import java.util.Arrays; +import java.util.Optional; @Generated @Getter @@ -26,7 +27,7 @@ public abstract class BukkitDevCommand implements IDevCommand { private final CommandSender commandSender; private final String[] args; - public BukkitDevCommand(BukkitCommandData commandData, CommandSender commandSender, String[] args) { + protected BukkitDevCommand(BukkitCommandData commandData, CommandSender commandSender, String[] args) { this.commandData = commandData; this.commandSender = commandSender; this.args = args; @@ -101,6 +102,19 @@ public ICommandArgumentParser getArgumentParser(int argumentPosition) { .orElseThrow(); } + @Override + public Optional> getOptionalArgumentParser(int argumentPosition) { + if (args.length <= argumentPosition) { + return Optional.empty(); + } + + return Optional.of(Arrays.stream(commandData.getArguments()) + .filter(commandArgument -> commandArgument.position() == argumentPosition) + .findFirst() + .map(commandArgument -> new ArgumentParserFactory(args[argumentPosition]).generate(commandArgument.validator())) + .orElseThrow()); + } + @Override public boolean performAutoValidation(IAutoValidationConfiguration configuration) { if (commandData.getAutoValidationData() == null) { diff --git a/src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java index 34a74ac..fa2bc3e 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java @@ -4,6 +4,7 @@ import dev.hugog.minecraft.dev_command.validation.IAutoValidationConfiguration; import java.util.List; +import java.util.Optional; public interface IDevCommand { @@ -11,11 +12,31 @@ public interface IDevCommand { List onTabComplete(String[] args); + /** + * Get Argument Parser for a mandatory argument at the given position. + * + * @param argumentPosition the position of the argument + * @return the argument parser + * @throws IllegalArgumentException if the argument is not present + */ ICommandArgumentParser getArgumentParser(int argumentPosition); + + /** + * Get Argument Parser for an optional argument at the given position. + * + * @param argumentPosition the position of the argument + * @return an Optional containing the argument parser if the argument exists, or an empty Optional if not exists + */ + Optional> getOptionalArgumentParser(int argumentPosition); + boolean hasPermissionToExecuteCommand(); + boolean hasValidArgs(); + boolean canSenderExecuteCommand(); + boolean performAutoValidation(IAutoValidationConfiguration configuration); + T getDependency(Class dependencyClass); }