From 336ac4cad53db76dc532729fabfdffd1e40db04f Mon Sep 17 00:00:00 2001 From: kento2 Date: Tue, 4 Aug 2026 02:30:41 +0200 Subject: [PATCH] refactor ig --- .idea/bazelVersionCache.xml | 2 +- .idea/workspace.xml | 147 ++++++++++++++---- README.md | 39 +++-- {kencommandapi-bukkit => bukkit}/BUILD | 8 +- .../kencommandapi/BukkitKenCommand.java | 40 +++++ .../de/kentoj/kencommandapi/CommandAPI.java | 22 +-- .../kencommandapi/TabCompleteListener.java | 24 ++- .../PlayerSuggestionProvider.java | 3 +- .../type/OfflinePlayerArgumentType.java | 19 +-- .../type/PlayerArgumentType.java | 2 - {kencommandapi-core => core}/BUILD | 2 - .../kencommandapi/api/CommandHandler.java | 22 ++- .../api/argument/ArgumentRequirement.java | 10 +- .../api/argument/ArgumentType.java | 6 +- .../api/argument/CommandArgument.java | 4 +- .../api/argument/CommandArgumentImpl.java | 7 + .../api/argument/CommandArgumentSpec.java | 8 +- .../argument/CommandArgumentSpecBuilder.java | 10 +- .../api/argument/CommandArgumentSpecImpl.java | 38 +++++ .../argument/types/IntegerArgumentType.java | 0 .../argument/types/StringArgumentType.java | 15 +- .../api/invocation/CommandContext.java | 10 +- .../api/invocation/CommandExecutor.java | 0 .../api/invocation/SyncCommandExecutor.java | 0 .../kencommandapi/api/literal/Literal.java | 17 +- .../api/literal/LiteralBuilder.java | 25 +-- .../api/literal/LiteralImpl.java | 32 ++++ .../api/literal/RootLiteral.java | 8 + .../api/literal/RootLiteralImpl.java | 29 ++++ .../api/platform/HasPermissionMethod.java | 0 .../api/platform/MessageStyle.java | 0 .../api/platform/PlainMessageStyle.java | 3 - .../api/platform/SendMessageMethod.java | 0 .../api/suggestion/NoSuggestionProvider.java | 6 - .../api/suggestion/SuggestionProvider.java | 0 .../internal/CommandContextImpl.java | 12 +- .../internal/parser/CommandParseHelper.java | 10 +- .../parser/InvocationCommandParser.java | 54 ++++--- .../parser/SuggestionCommandParser.java | 20 +-- .../kentoj/kencommandapi/api/parser/ENV.java | 0 .../parser/SuggestionCommandParserTest.java | 0 .../kencommandapi/BukkitKenCommand.java | 34 ---- .../api/argument/CommandArgumentImpl.java | 9 -- .../api/argument/CommandArgumentSpecImpl.java | 42 ----- .../api/literal/LiteralImpl.java | 38 ----- .../de/kentoj/kencommandapi/CommandAPI.java | 25 --- .../kentoj/kencommandapi/VelocityCommand.java | 36 ----- third_party/BUILD | 7 - third_party/libs.versions.toml | 24 --- {kencommandapi-velocity => velocity}/BUILD | 7 +- .../de/kentoj/kencommandapi/CommandAPI.java | 28 ++++ .../kentoj/kencommandapi/VelocityCommand.java | 53 +++++++ .../PlayerSuggestionProvider.java | 9 +- .../type/PlayerArgumentType.java | 6 +- 54 files changed, 528 insertions(+), 444 deletions(-) rename {kencommandapi-bukkit => bukkit}/BUILD (57%) create mode 100644 bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java rename {kencommandapi-bukkit => bukkit}/src/main/java/de/kentoj/kencommandapi/CommandAPI.java (63%) rename {kencommandapi-bukkit => bukkit}/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java (56%) rename {kencommandapi-bukkit => bukkit}/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java (76%) rename {kencommandapi-bukkit => bukkit}/src/main/java/de/kentoj/kencommandapi/type/OfflinePlayerArgumentType.java (61%) rename {kencommandapi-bukkit => bukkit}/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java (93%) rename {kencommandapi-core => core}/BUILD (85%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java (65%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/argument/ArgumentRequirement.java (55%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/argument/ArgumentType.java (85%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgument.java (59%) create mode 100644 core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentImpl.java rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpec.java (82%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecBuilder.java (92%) create mode 100644 core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecImpl.java rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/argument/types/IntegerArgumentType.java (100%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/argument/types/StringArgumentType.java (56%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/invocation/CommandContext.java (80%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/invocation/CommandExecutor.java (100%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/invocation/SyncCommandExecutor.java (100%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/literal/Literal.java (55%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralBuilder.java (82%) create mode 100644 core/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralImpl.java create mode 100644 core/src/main/java/de/kentoj/kencommandapi/api/literal/RootLiteral.java create mode 100644 core/src/main/java/de/kentoj/kencommandapi/api/literal/RootLiteralImpl.java rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/platform/HasPermissionMethod.java (100%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/platform/MessageStyle.java (100%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/platform/PlainMessageStyle.java (79%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/platform/SendMessageMethod.java (100%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/suggestion/NoSuggestionProvider.java (63%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/api/suggestion/SuggestionProvider.java (100%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/internal/CommandContextImpl.java (66%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/internal/parser/CommandParseHelper.java (74%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/internal/parser/InvocationCommandParser.java (69%) rename {kencommandapi-core => core}/src/main/java/de/kentoj/kencommandapi/internal/parser/SuggestionCommandParser.java (83%) rename {kencommandapi-core => core}/src/test/java/de/kentoj/kencommandapi/api/parser/ENV.java (100%) rename {kencommandapi-core => core}/src/test/java/de/kentoj/kencommandapi/api/parser/SuggestionCommandParserTest.java (100%) delete mode 100644 kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java delete mode 100644 kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentImpl.java delete mode 100644 kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecImpl.java delete mode 100644 kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralImpl.java delete mode 100644 kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/CommandAPI.java delete mode 100644 kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/VelocityCommand.java delete mode 100644 third_party/BUILD delete mode 100644 third_party/libs.versions.toml rename {kencommandapi-velocity => velocity}/BUILD (68%) create mode 100644 velocity/src/main/java/de/kentoj/kencommandapi/CommandAPI.java create mode 100644 velocity/src/main/java/de/kentoj/kencommandapi/VelocityCommand.java rename {kencommandapi-velocity => velocity}/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java (72%) rename {kencommandapi-velocity => velocity}/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java (91%) diff --git a/.idea/bazelVersionCache.xml b/.idea/bazelVersionCache.xml index dc93e11..8501e9b 100644 --- a/.idea/bazelVersionCache.xml +++ b/.idea/bazelVersionCache.xml @@ -6,7 +6,7 @@ diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 0b1db7c..f841075 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -7,15 +7,18 @@ - - - - @//kencommandapi-bukkit:bukkit.publish + + + + @//bukkit:bukkit.publish - - - @//kencommandapi-core:core.publish + + + @//core:core.publish - - - @//kencommandapi-core:export.publish - - - - - - + + @//kencommandapi-velocity:velocity.publish + + + @//velocity:velocity.publish + + + + true true + false false false + false + false @@ -305,14 +374,22 @@ - - - - - + + + + + + + + + + + @@ -548,6 +625,9 @@ + + \ No newline at end of file diff --git a/README.md b/README.md index 5228ab0..df507d8 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,16 @@ +## TODO + +CI/CD to publish automatically + ## Build after installing bazel: ```shell -bazel build //kencommandapi-bukkit:bukkit -bazel build //kencommandapi-core:core +bazel build //bukkit +bazel build //core +bazel build //velocity ``` -can't compile -velocity module yet. - ## Limitations & Bugs - argument's can't require specific permissions. @@ -29,12 +32,12 @@ arguments can have suggestions. To allow the use of `/feed` without giving a user's name, i.e. to make the argument optional, we need to assign the user-argument a default value. -## An example command +### An example command Let's say we want to make a command that allows seeing how many coins another User has. If we don't specify a user, it should instead show the coins the sender has. -## As a tree +### As a tree Visualized as a tree, we have a Node/Literal `coins` with an alias `balance` with an optional argument called `user`. To make an argument optional, it must have a default value. @@ -45,38 +48,42 @@ literal:coins/balance - has executor:getCoins ``` -## As code +### As code + ```java +import de.kentoj.kencommandapi.api.literal.RootLiteral; + /** * Show the amount coins a user has. * If no user is given, it should show the amount the sender of the command has. */ -@NoArgsConstructor(access = AccessLevel.NONE) public class CoinsCommand { - @Getter - private final Literal rootLiteral; + private final RootLiteral rootLiteral; private final CommandArgumentSpec userArg; public CoinsCommand() { userArg = CommandArgumentSpec.builder("user", new UserArgumentType()) .withRequirement(p -> !p.hasPermission("economy.immune.getcoins"), "you can't see that player's balance") - .withDefaultValue(CommandContext::getSender) + .withDefaultValue(CommandContext::sender) .build(); rootLiteral = Literal.builder("coins", "balance") - .withStyle(MessageStyle.PLAIN) .withPermission("economy.command.coins") .withArgument(userArg) .withSyncExecutor(this::getCoins) - .build(); + .asRootLiteral(MessageStyle.PLAIN); } private Result getCoins(CommandContext ctx) { - var player = ctx.getArg(userArg); - ctx.getSender().sendMessage(player.getName() + " has " + player.getCoins() + " coins"); + var user = ctx.getArg(userArg); + ctx.getSender().sendMessage(user.name() + " has " + user.coins() + " coins"); return Results.success(new Object()); } + + public RootLiteral rootLiteral() { + return rootLiteral; + } } ``` @@ -87,5 +94,5 @@ Additionally, we can also a Requirement in the CommandArgumentSpec. The registration of the command is platform-dependant. Typically, a class called CommandAPI can be used. ```java CommandAPI api = new CommandAPI(); -register(new CoinsCommand().getRootLiteral()); +register(new CoinsCommand().rootLiteral()); ``` \ No newline at end of file diff --git a/kencommandapi-bukkit/BUILD b/bukkit/BUILD similarity index 57% rename from kencommandapi-bukkit/BUILD rename to bukkit/BUILD index 1b635ad..47dc8a8 100644 --- a/kencommandapi-bukkit/BUILD +++ b/bukkit/BUILD @@ -5,13 +5,11 @@ java_export( maven_coordinates = "de.kentoj.scrow:kencommandapi-bukkit:0.34-SNAPSHOT", srcs = glob(["src/main/**/*.java"]), deps = [ - "//kencommandapi-core:core", - artifact("org.projectlombok:lombok"), + "//core", artifact("org.jetbrains:annotations"), - artifact("io.papermc.paper:paper-api:[26.2.build,)"), + artifact("io.papermc.paper:paper-api"), ], exports = [ - "//kencommandapi-core:core", + "//core", ], - plugins = [ "//third_party:lombok_plugin" ], ) \ No newline at end of file diff --git a/bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java b/bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java new file mode 100644 index 0000000..410b141 --- /dev/null +++ b/bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java @@ -0,0 +1,40 @@ +package de.kentoj.kencommandapi; + +import de.kentoj.kencommandapi.api.CommandHandler; +import de.kentoj.kencommandapi.api.literal.RootLiteral; +import de.kentoj.kencommandapi.api.platform.MessageStyle; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.stream.Stream; + +public class BukkitKenCommand extends Command { + + private final RootLiteral rootLiteral; + private final CommandHandler commandHandler; + private final Class senderType; + + protected BukkitKenCommand(CommandHandler commandHandler, RootLiteral rootLiteral, Class senderType) { + super(rootLiteral.names()[0]); + this.commandHandler = commandHandler; + this.rootLiteral = rootLiteral; + this.senderType = senderType; + + this.setAliases(Arrays.asList(rootLiteral.names())); + this.setPermission(rootLiteral.permission()); + } + + @Override + public boolean execute(@NotNull CommandSender commandSender, @NotNull String commandLabel, @NotNull String[] args) { + if (!senderType.isInstance(commandSender)) { + commandSender.sendMessage(MessageStyle.PLAIN.err("You can't use that command")); + return true; + } + T sender = senderType.cast(commandSender); + + commandHandler.invoke(rootLiteral, sender, Stream.of(args).filter(str -> !str.isEmpty())); + return true; + } +} diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/CommandAPI.java b/bukkit/src/main/java/de/kentoj/kencommandapi/CommandAPI.java similarity index 63% rename from kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/CommandAPI.java rename to bukkit/src/main/java/de/kentoj/kencommandapi/CommandAPI.java index 7fc80a2..8ea24c5 100644 --- a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/CommandAPI.java +++ b/bukkit/src/main/java/de/kentoj/kencommandapi/CommandAPI.java @@ -1,7 +1,7 @@ package de.kentoj.kencommandapi; import de.kentoj.kencommandapi.api.CommandHandler; -import de.kentoj.kencommandapi.api.literal.Literal; +import de.kentoj.kencommandapi.api.literal.RootLiteral; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.command.SimpleCommandMap; @@ -13,15 +13,17 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; -public class CommandAPI { +public class CommandAPI { - private final CommandHandler commandHandler; - private final List> registeredNodes = new ArrayList<>(); + private final CommandHandler commandHandler; + private final List> registeredNodes = new ArrayList<>(); private final SimpleCommandMap commandMap; + private final Class senderType; - public CommandAPI(Plugin plugin) { + public CommandAPI(Plugin plugin, Class senderType) { + this.senderType = senderType; this.commandHandler = new CommandHandler<>(CommandSender::sendMessage, Permissible::hasPermission); - Bukkit.getPluginManager().registerEvents(new TabCompleteListener(this, commandHandler), plugin); + Bukkit.getPluginManager().registerEvents(new TabCompleteListener<>(this, commandHandler, senderType), plugin); try { Field field = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap"); @@ -32,17 +34,17 @@ public class CommandAPI { } } - @Nullable Literal getRegistered(String name) { + @Nullable RootLiteral getRegistered(String name) { for (var node : registeredNodes) { - for (String nodeName : node.getNames()) { + for (String nodeName : node.names()) { if (nodeName.equals(name)) return node; } } return null; } - public void register(Literal rootNode) { + public void register(RootLiteral rootNode) { registeredNodes.add(rootNode); - commandMap.register(rootNode.getNames()[0], new BukkitKenCommand(commandHandler, rootNode)); + commandMap.register(rootNode.names()[0], new BukkitKenCommand<>(commandHandler, rootNode, senderType)); } } diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java b/bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java similarity index 56% rename from kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java rename to bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java index 977bc23..6d6e080 100644 --- a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java +++ b/bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java @@ -2,18 +2,23 @@ package de.kentoj.kencommandapi; import com.destroystokyo.paper.event.server.AsyncTabCompleteEvent; import de.kentoj.kencommandapi.api.CommandHandler; -import lombok.RequiredArgsConstructor; import org.bukkit.command.CommandSender; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import java.util.Arrays; -@RequiredArgsConstructor -public class TabCompleteListener implements Listener { +public class TabCompleteListener implements Listener { - private final CommandAPI commandAPI; - private final CommandHandler commandHandler; + private final CommandAPI commandAPI; + private final CommandHandler commandHandler; + private final Class senderType; + + public TabCompleteListener(CommandAPI commandAPI, CommandHandler commandHandler, Class senderType) { + this.commandAPI = commandAPI; + this.commandHandler = commandHandler; + this.senderType = senderType; + } @EventHandler(ignoreCancelled = true) public void onAsyncTabComplete(AsyncTabCompleteEvent ev) { @@ -26,11 +31,16 @@ public class TabCompleteListener implements Listener { // commands can be called with a ':' prefix. strip it. int l = label.indexOf(':'); if (l >= 0) - label = label.substring(l+1); + label = label.substring(l + 1); } var literal = commandAPI.getRegistered(label); if (literal == null) return; + + if (!senderType.isInstance(ev.getSender())) + return; + + T sender = senderType.cast(ev.getSender()); ev.setHandled(true); - ev.setCompletions(commandHandler.getSuggestions(literal, ev.getSender(), Arrays.copyOfRange(args, 1, args.length), ev.getBuffer().endsWith(" "))); + ev.setCompletions(commandHandler.getSuggestions(literal, sender, Arrays.copyOfRange(args, 1, args.length), ev.getBuffer().endsWith(" "))); } } diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java b/bukkit/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java similarity index 76% rename from kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java rename to bukkit/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java index f3010b2..c6880c6 100644 --- a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java +++ b/bukkit/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java @@ -2,12 +2,11 @@ package de.kentoj.kencommandapi.suggestionprovider; import de.kentoj.kencommandapi.api.suggestion.SuggestionProvider; import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.List; -public class PlayerSuggestionProvider implements SuggestionProvider { +public final class PlayerSuggestionProvider implements SuggestionProvider { @Override public List suggest(T __) { return Bukkit.getOnlinePlayers().stream() diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/type/OfflinePlayerArgumentType.java b/bukkit/src/main/java/de/kentoj/kencommandapi/type/OfflinePlayerArgumentType.java similarity index 61% rename from kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/type/OfflinePlayerArgumentType.java rename to bukkit/src/main/java/de/kentoj/kencommandapi/type/OfflinePlayerArgumentType.java index 17a8d94..5b17dd0 100644 --- a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/type/OfflinePlayerArgumentType.java +++ b/bukkit/src/main/java/de/kentoj/kencommandapi/type/OfflinePlayerArgumentType.java @@ -3,30 +3,27 @@ package de.kentoj.kencommandapi.type; import de.kentoj.kencommandapi.api.argument.ArgumentType; import de.kentoj.kencommandapi.api.suggestion.SuggestionProvider; import de.kentoj.kencommandapi.suggestionprovider.PlayerSuggestionProvider; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; import java.util.UUID; -@NoArgsConstructor public class OfflinePlayerArgumentType implements ArgumentType { - // TODO make work with player names on offline players @Override public OfflinePlayer parseInputUnchecked(String string) { - OfflinePlayer player = Bukkit.getPlayerExact(string); - if (player == null) { + // UUIDs are always 36 chars + if (string.length() == 36) { try { - player = Bukkit.getOfflinePlayer(UUID.fromString(string)); + return Bukkit.getOfflinePlayer(UUID.fromString(string)); } catch (IllegalArgumentException ex) { - throw new IllegalArgumentException("not an UUID or online player"); + throw new IllegalArgumentException("Invalid UUID"); } } - if (!player.hasPlayedBefore() && !player.isOnline()) throw new IllegalArgumentException("Player not found"); + + OfflinePlayer player = Bukkit.getPlayerExact(string); + if (player == null || (!player.hasPlayedBefore() && !player.isOnline())) + throw new IllegalArgumentException("Player not found"); return player; } diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java b/bukkit/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java similarity index 93% rename from kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java rename to bukkit/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java index 37a230a..2b4065e 100644 --- a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java +++ b/bukkit/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java @@ -3,11 +3,9 @@ package de.kentoj.kencommandapi.type; import de.kentoj.kencommandapi.api.argument.ArgumentType; import de.kentoj.kencommandapi.api.suggestion.SuggestionProvider; import de.kentoj.kencommandapi.suggestionprovider.PlayerSuggestionProvider; -import lombok.NoArgsConstructor; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -@NoArgsConstructor public class PlayerArgumentType implements ArgumentType { @Override diff --git a/kencommandapi-core/BUILD b/core/BUILD similarity index 85% rename from kencommandapi-core/BUILD rename to core/BUILD index 816bb49..03f0de0 100644 --- a/kencommandapi-core/BUILD +++ b/core/BUILD @@ -6,7 +6,6 @@ java_export( srcs = glob(["src/main/**/*.java"]), visibility = ["//visibility:public"], deps = [ - artifact("org.projectlombok:lombok"), artifact("com.leakyabstractions:result-api"), artifact("com.leakyabstractions:result"), artifact("org.jetbrains:annotations"), @@ -14,5 +13,4 @@ java_export( artifact("org.slf4j:slf4j-api"), artifact("net.kyori:adventure-api"), ], - plugins = [ "//third_party:lombok_plugin" ], ) \ No newline at end of file diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java b/core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java similarity index 65% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java rename to core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java index 02f8cc5..f728250 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java +++ b/core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java @@ -1,22 +1,19 @@ package de.kentoj.kencommandapi.api; -import de.kentoj.kencommandapi.api.literal.Literal; +import de.kentoj.kencommandapi.api.literal.RootLiteral; import de.kentoj.kencommandapi.api.platform.HasPermissionMethod; import de.kentoj.kencommandapi.api.platform.SendMessageMethod; import de.kentoj.kencommandapi.internal.parser.CommandParseHelper; import de.kentoj.kencommandapi.internal.parser.InvocationCommandParser; import de.kentoj.kencommandapi.internal.parser.SuggestionCommandParser; -import lombok.RequiredArgsConstructor; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; -@RequiredArgsConstructor public class CommandHandler { private final SendMessageMethod sendMessageMethod; - private final InvocationCommandParser invocationParser; private final SuggestionCommandParser suggestionParser; @@ -27,25 +24,24 @@ public class CommandHandler { suggestionParser = new SuggestionCommandParser<>(parseHelper); } - public void invoke(Literal rootLiteral, T sender, Stream args) { - // FIXME uses rootLiteral's message style + public void invoke(RootLiteral rootLiteral, T sender, Stream args) { invocationParser.parse(rootLiteral, sender, args.toList().iterator()) .ifSuccessOrElse(data -> exec(rootLiteral, data), - err -> sendMessageMethod.send(sender, rootLiteral.getMessageStyle().err(err))); + err -> sendMessageMethod.send(sender, rootLiteral.messageStyle().err(err))); } - private void exec(Literal rootLiteral, InvocationCommandParser.ExecutionData data) { - var sender = data.getContext().getSender(); - data.getExecutor().execute(data.getContext()) + private void exec(RootLiteral rootLiteral, InvocationCommandParser.ExecutionData data) { + var ctx = data.context(); + data.executor().execute(ctx) .whenComplete((result, ex) -> { if (ex != null) - sendMessageMethod.send(sender, rootLiteral.getMessageStyle().exception(ex)); + sendMessageMethod.send(ctx.sender(), rootLiteral.messageStyle().exception(ex)); result.ifFailure(err -> - sendMessageMethod.send(sender, rootLiteral.getMessageStyle().err(err))); + sendMessageMethod.send(ctx.sender(), rootLiteral.messageStyle().err(err))); }); } - public List getSuggestions(Literal rootNode, T sender, String[] args, boolean trailingSpace) { + public List getSuggestions(RootLiteral rootNode, T sender, String[] args, boolean trailingSpace) { return suggestionParser.suggest(rootNode, sender, Arrays.stream(args).iterator(), trailingSpace); } } \ No newline at end of file diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/ArgumentRequirement.java b/core/src/main/java/de/kentoj/kencommandapi/api/argument/ArgumentRequirement.java similarity index 55% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/ArgumentRequirement.java rename to core/src/main/java/de/kentoj/kencommandapi/api/argument/ArgumentRequirement.java index d43588e..47a8976 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/ArgumentRequirement.java +++ b/core/src/main/java/de/kentoj/kencommandapi/api/argument/ArgumentRequirement.java @@ -1,14 +1,12 @@ package de.kentoj.kencommandapi.api.argument; -import lombok.Value; - import java.util.function.Predicate; /** * @param type of the parsed argument value */ -@Value -public class ArgumentRequirement { - Predicate predicate; - String message; +public record ArgumentRequirement( + Predicate predicate, + String message +) { } diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/ArgumentType.java b/core/src/main/java/de/kentoj/kencommandapi/api/argument/ArgumentType.java similarity index 85% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/ArgumentType.java rename to core/src/main/java/de/kentoj/kencommandapi/api/argument/ArgumentType.java index 73cb67b..360a3fc 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/ArgumentType.java +++ b/core/src/main/java/de/kentoj/kencommandapi/api/argument/ArgumentType.java @@ -12,12 +12,12 @@ public interface ArgumentType { * * @throws IllegalArgumentException if string invalid * @see CommandArgumentSpec#parseInput(String) - * @see CommandArgumentSpecBuilder#addRequirement(Predicate, String) + * @see CommandArgumentSpecBuilder#withRequirement(Predicate, String) */ V parseInputUnchecked(String input) throws IllegalArgumentException; /** - * @see CommandArgumentSpec#getSuggestionProvider() + * @see CommandArgumentSpec#suggestionProvider() */ SuggestionProvider getDefaultSuggestionProvider(); @@ -26,7 +26,7 @@ public interface ArgumentType { * For example, given the 2 words "hello" "world" as input, a greedy argument parses "hello world" as a single value. * Greedy arguments may not be followed by another argument or a literal */ - default boolean isGreedy() { + default boolean greedy() { return false; } } diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgument.java b/core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgument.java similarity index 59% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgument.java rename to core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgument.java index 5c73f35..8e79a06 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgument.java +++ b/core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgument.java @@ -2,7 +2,7 @@ package de.kentoj.kencommandapi.api.argument; public interface CommandArgument { - V getValue(); + V value(); - CommandArgumentSpec getArgument(); + CommandArgumentSpec argument(); } diff --git a/core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentImpl.java b/core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentImpl.java new file mode 100644 index 0000000..71bd78a --- /dev/null +++ b/core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentImpl.java @@ -0,0 +1,7 @@ +package de.kentoj.kencommandapi.api.argument; + +public record CommandArgumentImpl( + V value, + CommandArgumentSpec argument +) implements CommandArgument { +} diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpec.java b/core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpec.java similarity index 82% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpec.java rename to core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpec.java index 9fc3709..726ad14 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpec.java +++ b/core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpec.java @@ -13,20 +13,20 @@ public sealed interface CommandArgumentSpec permits CommandArgumentSpecImp return new CommandArgumentSpecBuilder<>(id, type); } - String getId(); + String id(); - ArgumentType getType(); + ArgumentType type(); /** * @throws IllegalArgumentException if string invalid or if a requirement is not met */ V parseInput(String rawInput); - @Nullable Function, V> getDefaultValueProvider(); + @Nullable Function, V> defaultValueProvider(); /** * @return the explicitly set SuggestionProvider or the default suggestions for the type if unset/null */ /* explicit @NotNull to avoid confusion */ - @NotNull SuggestionProvider getSuggestionProvider(); + @NotNull SuggestionProvider suggestionProvider(); } diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecBuilder.java b/core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecBuilder.java similarity index 92% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecBuilder.java rename to core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecBuilder.java index 64c7c6c..fa767e0 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecBuilder.java +++ b/core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecBuilder.java @@ -2,8 +2,6 @@ package de.kentoj.kencommandapi.api.argument; import de.kentoj.kencommandapi.api.invocation.CommandContext; import de.kentoj.kencommandapi.api.suggestion.SuggestionProvider; -import lombok.AccessLevel; -import lombok.RequiredArgsConstructor; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -15,17 +13,19 @@ import java.util.function.Predicate; * @param type of the command sender * @param type of the value */ -@RequiredArgsConstructor(access = AccessLevel.PACKAGE) public class CommandArgumentSpecBuilder { private final String id; private final ArgumentType type; - private @Nullable Function, V> defaultValueProvider; private @Nullable SuggestionProvider suggestionProvider; - private final List> requirements = new ArrayList<>(); + public CommandArgumentSpecBuilder(String id, ArgumentType type) { + this.id = id; + this.type = type; + } + public CommandArgumentSpecBuilder withRequirement(Predicate predicate, String message) { requirements.add(new ArgumentRequirement<>(predicate, message)); return this; diff --git a/core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecImpl.java b/core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecImpl.java new file mode 100644 index 0000000..2f80387 --- /dev/null +++ b/core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecImpl.java @@ -0,0 +1,38 @@ +package de.kentoj.kencommandapi.api.argument; + +import de.kentoj.kencommandapi.api.invocation.CommandContext; +import de.kentoj.kencommandapi.api.suggestion.SuggestionProvider; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.Function; + +public record CommandArgumentSpecImpl( + String id, + ArgumentType type, + List> requirements, + Function, V> defaultValueProvider, + @Nullable SuggestionProvider suggestionProvider +) implements CommandArgumentSpec { + + @Override + public V parseInput(String rawInput) { + var parsed = type.parseInputUnchecked(rawInput); + for (var requirement : requirements) { + if (!requirement.predicate().test(parsed)) + throw new IllegalArgumentException(requirement.message()); + } + return parsed; + } + + @Override + public @Nullable Function, V> defaultValueProvider() { + return defaultValueProvider; + } + + @Override + public @NotNull SuggestionProvider suggestionProvider() { + return suggestionProvider != null ? suggestionProvider : type.getDefaultSuggestionProvider(); + } +} diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/types/IntegerArgumentType.java b/core/src/main/java/de/kentoj/kencommandapi/api/argument/types/IntegerArgumentType.java similarity index 100% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/types/IntegerArgumentType.java rename to core/src/main/java/de/kentoj/kencommandapi/api/argument/types/IntegerArgumentType.java diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/types/StringArgumentType.java b/core/src/main/java/de/kentoj/kencommandapi/api/argument/types/StringArgumentType.java similarity index 56% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/types/StringArgumentType.java rename to core/src/main/java/de/kentoj/kencommandapi/api/argument/types/StringArgumentType.java index 39f8d95..6e0ee6a 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/types/StringArgumentType.java +++ b/core/src/main/java/de/kentoj/kencommandapi/api/argument/types/StringArgumentType.java @@ -2,16 +2,8 @@ package de.kentoj.kencommandapi.api.argument.types; import de.kentoj.kencommandapi.api.argument.ArgumentType; import de.kentoj.kencommandapi.api.suggestion.SuggestionProvider; -import lombok.RequiredArgsConstructor; -@RequiredArgsConstructor -public class StringArgumentType implements ArgumentType { - - private final boolean isGreedy; - - public StringArgumentType() { - this(false); - } +public record StringArgumentType(boolean greedy) implements ArgumentType { @Override public String parseInputUnchecked(String string) { @@ -22,9 +14,4 @@ public class StringArgumentType implements ArgumentType { public SuggestionProvider getDefaultSuggestionProvider() { return SuggestionProvider.none(); } - - @Override - public boolean isGreedy() { - return this.isGreedy; - } } diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/invocation/CommandContext.java b/core/src/main/java/de/kentoj/kencommandapi/api/invocation/CommandContext.java similarity index 80% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/invocation/CommandContext.java rename to core/src/main/java/de/kentoj/kencommandapi/api/invocation/CommandContext.java index 30d7331..471b14a 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/invocation/CommandContext.java +++ b/core/src/main/java/de/kentoj/kencommandapi/api/invocation/CommandContext.java @@ -7,7 +7,7 @@ import java.util.Map; public interface CommandContext { - T getSender(); + T sender(); CommandArgument getParsedArgument(String id); @@ -17,7 +17,7 @@ public interface CommandContext { */ @SuppressWarnings("unchecked") default V getArg(String id) { - return (V) getParsedArgument(id).getValue(); + return (V) getParsedArgument(id).value(); } /** @@ -26,12 +26,12 @@ public interface CommandContext { * @param the type of the value of the argument */ default V getArg(CommandArgumentSpec arg) { - return getArg(arg.getId()); + return getArg(arg.id()); } default CommandArgument getParsedArgument(CommandArgumentSpec arg) { - return getParsedArgument(arg.getId()); + return getParsedArgument(arg.id()); } - Map> getParsedArguments(); + Map> parsedArguments(); } diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/invocation/CommandExecutor.java b/core/src/main/java/de/kentoj/kencommandapi/api/invocation/CommandExecutor.java similarity index 100% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/invocation/CommandExecutor.java rename to core/src/main/java/de/kentoj/kencommandapi/api/invocation/CommandExecutor.java diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/invocation/SyncCommandExecutor.java b/core/src/main/java/de/kentoj/kencommandapi/api/invocation/SyncCommandExecutor.java similarity index 100% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/invocation/SyncCommandExecutor.java rename to core/src/main/java/de/kentoj/kencommandapi/api/invocation/SyncCommandExecutor.java diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/Literal.java b/core/src/main/java/de/kentoj/kencommandapi/api/literal/Literal.java similarity index 55% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/Literal.java rename to core/src/main/java/de/kentoj/kencommandapi/api/literal/Literal.java index 1540474..57d9d76 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/Literal.java +++ b/core/src/main/java/de/kentoj/kencommandapi/api/literal/Literal.java @@ -2,35 +2,30 @@ package de.kentoj.kencommandapi.api.literal; import de.kentoj.kencommandapi.api.argument.CommandArgumentSpec; import de.kentoj.kencommandapi.api.invocation.CommandExecutor; -import de.kentoj.kencommandapi.api.invocation.SyncCommandExecutor; -import de.kentoj.kencommandapi.api.platform.MessageStyle; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Set; public interface Literal { static LiteralBuilder builder(String... name) { return new LiteralBuilder<>(name); } - @NotNull String[] getNames(); + @NotNull String[] names(); /** * @return what the literal does */ - @Nullable String getDescription(); + @Nullable String description(); - List> getArguments(); + List> arguments(); - @Nullable CommandExecutor getExecutor(); + @Nullable CommandExecutor executor(); @Nullable Literal getLiteral(@NotNull String name); - @NotNull List> getLiterals(); + @NotNull List> literals(); - @Nullable String getPermission(); - - MessageStyle getMessageStyle(); + @Nullable String permission(); } diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralBuilder.java b/core/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralBuilder.java similarity index 82% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralBuilder.java rename to core/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralBuilder.java index 263bf32..ec18fbb 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralBuilder.java +++ b/core/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralBuilder.java @@ -17,7 +17,6 @@ public final class LiteralBuilder { private @Nullable String description; private @Nullable CommandExecutor executor; private @Nullable String permission; - private @Nullable MessageStyle messageStyle; private final List> arguments = new ArrayList<>(); private final List> literals = new ArrayList<>(); @@ -48,18 +47,13 @@ public final class LiteralBuilder { return this; } - public LiteralBuilder withStyle(MessageStyle messageStyle) { - this.messageStyle = messageStyle; - return this; - } - /** * @throws IllegalArgumentException if there is already an argument with the same id * @throws IllegalStateException if a greedy argument was added to the literal previously */ public LiteralBuilder withArgument(CommandArgumentSpec argument) { checkArgument(!hasGreedyArg(), "cannot add an argument after a greedy argument"); - if (arguments.stream().anyMatch(arg -> arg.getId().equals(argument.getId()))) + if (arguments.stream().anyMatch(arg -> arg.id().equals(argument.id()))) throw new IllegalArgumentException("cannot add multiple arguments with the same id"); this.arguments.add(argument); @@ -72,7 +66,7 @@ public final class LiteralBuilder { */ public LiteralBuilder withLiteral(Literal literal) { checkArgument(!hasGreedyArg(), "cannot add a literal after a greedy argument"); - for (String name : literal.getNames()) + for (String name : literal.names()) for (var l : literals) if (l.getLiteral(name) != null) throw new IllegalArgumentException("literal with same name already exists"); @@ -81,20 +75,17 @@ public final class LiteralBuilder { return this; } + public RootLiteral asRootLiteral(MessageStyle messageStyle) { + return new RootLiteralImpl<>(names, description, literals, arguments, executor, permission, messageStyle); + } + public Literal build() { - return new LiteralImpl<>( - names, - literals, - arguments, - executor, - permission, - messageStyle == null ? MessageStyle.PLAIN : messageStyle - ); + return new LiteralImpl<>(names, description, literals, arguments, executor, permission); } private boolean hasGreedyArg() { if (arguments.isEmpty()) return false; var arg = arguments.getLast(); - return arg != null && arg.getType().isGreedy(); + return arg != null && arg.type().greedy(); } } diff --git a/core/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralImpl.java b/core/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralImpl.java new file mode 100644 index 0000000..0a26c1c --- /dev/null +++ b/core/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralImpl.java @@ -0,0 +1,32 @@ +package de.kentoj.kencommandapi.api.literal; + +import de.kentoj.kencommandapi.api.argument.CommandArgumentSpec; +import de.kentoj.kencommandapi.api.invocation.CommandExecutor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * @param description what the literal does + */ +record LiteralImpl( + String[] names, + String description, + List> literals, + List> arguments, + CommandExecutor executor, + @Nullable String permission +) implements Literal { + + @Override + public @Nullable Literal getLiteral(@NotNull String name) { + for (Literal literal : literals) { + for (var literalName : literal.names()) { + if (literalName.equalsIgnoreCase(name)) + return literal; + } + } + return null; + } +} diff --git a/core/src/main/java/de/kentoj/kencommandapi/api/literal/RootLiteral.java b/core/src/main/java/de/kentoj/kencommandapi/api/literal/RootLiteral.java new file mode 100644 index 0000000..42321f6 --- /dev/null +++ b/core/src/main/java/de/kentoj/kencommandapi/api/literal/RootLiteral.java @@ -0,0 +1,8 @@ +package de.kentoj.kencommandapi.api.literal; + +import de.kentoj.kencommandapi.api.platform.MessageStyle; + +public sealed interface RootLiteral extends Literal permits RootLiteralImpl { + + MessageStyle messageStyle(); +} diff --git a/core/src/main/java/de/kentoj/kencommandapi/api/literal/RootLiteralImpl.java b/core/src/main/java/de/kentoj/kencommandapi/api/literal/RootLiteralImpl.java new file mode 100644 index 0000000..d49b511 --- /dev/null +++ b/core/src/main/java/de/kentoj/kencommandapi/api/literal/RootLiteralImpl.java @@ -0,0 +1,29 @@ +package de.kentoj.kencommandapi.api.literal; + +import de.kentoj.kencommandapi.api.argument.CommandArgumentSpec; +import de.kentoj.kencommandapi.api.invocation.CommandExecutor; +import de.kentoj.kencommandapi.api.platform.MessageStyle; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +record RootLiteralImpl( + String[] names, + String description, + List> literals, + List> arguments, + CommandExecutor executor, + @Nullable String permission, + MessageStyle messageStyle +) implements RootLiteral { + @Override + public @Nullable Literal getLiteral(@NotNull String name) { + for (var l : literals) { + for (var lName : l.names()) + if (lName.equalsIgnoreCase(name)) + return l; + } + return null; + } +} diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/HasPermissionMethod.java b/core/src/main/java/de/kentoj/kencommandapi/api/platform/HasPermissionMethod.java similarity index 100% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/HasPermissionMethod.java rename to core/src/main/java/de/kentoj/kencommandapi/api/platform/HasPermissionMethod.java diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/MessageStyle.java b/core/src/main/java/de/kentoj/kencommandapi/api/platform/MessageStyle.java similarity index 100% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/MessageStyle.java rename to core/src/main/java/de/kentoj/kencommandapi/api/platform/MessageStyle.java diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/PlainMessageStyle.java b/core/src/main/java/de/kentoj/kencommandapi/api/platform/PlainMessageStyle.java similarity index 79% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/PlainMessageStyle.java rename to core/src/main/java/de/kentoj/kencommandapi/api/platform/PlainMessageStyle.java index 88f24da..52a98bc 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/PlainMessageStyle.java +++ b/core/src/main/java/de/kentoj/kencommandapi/api/platform/PlainMessageStyle.java @@ -1,10 +1,7 @@ package de.kentoj.kencommandapi.api.platform; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; import net.kyori.adventure.text.Component; -@NoArgsConstructor(access = AccessLevel.PACKAGE) class PlainMessageStyle implements MessageStyle { @Override public Component ok(Component msg) { diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/SendMessageMethod.java b/core/src/main/java/de/kentoj/kencommandapi/api/platform/SendMessageMethod.java similarity index 100% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/SendMessageMethod.java rename to core/src/main/java/de/kentoj/kencommandapi/api/platform/SendMessageMethod.java diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/suggestion/NoSuggestionProvider.java b/core/src/main/java/de/kentoj/kencommandapi/api/suggestion/NoSuggestionProvider.java similarity index 63% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/suggestion/NoSuggestionProvider.java rename to core/src/main/java/de/kentoj/kencommandapi/api/suggestion/NoSuggestionProvider.java index 080ae12..44bb856 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/suggestion/NoSuggestionProvider.java +++ b/core/src/main/java/de/kentoj/kencommandapi/api/suggestion/NoSuggestionProvider.java @@ -1,15 +1,9 @@ package de.kentoj.kencommandapi.api.suggestion; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - import java.util.Collections; import java.util.List; -import java.util.concurrent.CompletableFuture; -@NoArgsConstructor(access = AccessLevel.PACKAGE) class NoSuggestionProvider implements SuggestionProvider { - @Override public List suggest(T __) { return Collections.emptyList(); diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/suggestion/SuggestionProvider.java b/core/src/main/java/de/kentoj/kencommandapi/api/suggestion/SuggestionProvider.java similarity index 100% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/suggestion/SuggestionProvider.java rename to core/src/main/java/de/kentoj/kencommandapi/api/suggestion/SuggestionProvider.java diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/CommandContextImpl.java b/core/src/main/java/de/kentoj/kencommandapi/internal/CommandContextImpl.java similarity index 66% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/CommandContextImpl.java rename to core/src/main/java/de/kentoj/kencommandapi/internal/CommandContextImpl.java index d8c0bc2..5b8db98 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/CommandContextImpl.java +++ b/core/src/main/java/de/kentoj/kencommandapi/internal/CommandContextImpl.java @@ -2,17 +2,13 @@ package de.kentoj.kencommandapi.internal; import de.kentoj.kencommandapi.api.argument.CommandArgument; import de.kentoj.kencommandapi.api.invocation.CommandContext; -import lombok.Getter; -import lombok.RequiredArgsConstructor; import java.util.Map; -@RequiredArgsConstructor -public class CommandContextImpl implements CommandContext { - @Getter - private final T sender; - @Getter - private final Map> parsedArguments; +public record CommandContextImpl( + T sender, + Map> parsedArguments +) implements CommandContext { @Override public CommandArgument getParsedArgument(String id) { diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/parser/CommandParseHelper.java b/core/src/main/java/de/kentoj/kencommandapi/internal/parser/CommandParseHelper.java similarity index 74% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/parser/CommandParseHelper.java rename to core/src/main/java/de/kentoj/kencommandapi/internal/parser/CommandParseHelper.java index 1c79386..17b7774 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/parser/CommandParseHelper.java +++ b/core/src/main/java/de/kentoj/kencommandapi/internal/parser/CommandParseHelper.java @@ -2,17 +2,19 @@ package de.kentoj.kencommandapi.internal.parser; import de.kentoj.kencommandapi.api.literal.Literal; import de.kentoj.kencommandapi.api.platform.HasPermissionMethod; -import lombok.RequiredArgsConstructor; import java.util.Iterator; -@RequiredArgsConstructor public final class CommandParseHelper { private final HasPermissionMethod hasPermission; + public CommandParseHelper(HasPermissionMethod hasPermission) { + this.hasPermission = hasPermission; + } + public boolean hasPermission(T sender, Literal literal) { - if (literal.getPermission() == null) return true; - return hasPermission.test(sender, literal.getPermission()); + if (literal.permission() == null) return true; + return hasPermission.test(sender, literal.permission()); } public String parseInput(Iterator tokenIter, boolean isGreedy) { diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/parser/InvocationCommandParser.java b/core/src/main/java/de/kentoj/kencommandapi/internal/parser/InvocationCommandParser.java similarity index 69% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/parser/InvocationCommandParser.java rename to core/src/main/java/de/kentoj/kencommandapi/internal/parser/InvocationCommandParser.java index 7fe1fa5..8809dea 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/parser/InvocationCommandParser.java +++ b/core/src/main/java/de/kentoj/kencommandapi/internal/parser/InvocationCommandParser.java @@ -2,24 +2,28 @@ package de.kentoj.kencommandapi.internal.parser; import com.leakyabstractions.result.api.Result; import com.leakyabstractions.result.core.Results; +import de.kentoj.kencommandapi.api.argument.CommandArgument; +import de.kentoj.kencommandapi.api.argument.CommandArgumentImpl; import de.kentoj.kencommandapi.api.argument.CommandArgumentSpec; import de.kentoj.kencommandapi.api.invocation.CommandContext; import de.kentoj.kencommandapi.api.invocation.CommandExecutor; -import de.kentoj.kencommandapi.api.argument.CommandArgument; import de.kentoj.kencommandapi.api.literal.Literal; -import de.kentoj.kencommandapi.api.argument.CommandArgumentImpl; import de.kentoj.kencommandapi.internal.CommandContextImpl; -import lombok.RequiredArgsConstructor; -import lombok.Value; import java.util.HashMap; import java.util.Iterator; import java.util.Map; -@RequiredArgsConstructor +import static java.util.Objects.requireNonNull; + public class InvocationCommandParser { + private final CommandParseHelper helper; + public InvocationCommandParser(CommandParseHelper helper) { + this.helper = helper; + } + public Result parse( Literal rootLiteral, T sender, @@ -31,13 +35,13 @@ public class InvocationCommandParser { while (true) { { var result = processArguments(currentLiteral, ctx, tokenIter) - .ifSuccess(ctx.getParsedArguments()::putAll); + .ifSuccess(ctx.parsedArguments()::putAll); if (result.hasFailure()) - return result.mapSuccess(__ -> null); + return result.mapSuccess(_ -> null); } if (!tokenIter.hasNext()) { - if (currentLiteral.getExecutor() == null) + if (currentLiteral.executor() == null) return Results.failure("Literal expected"); break; } @@ -50,7 +54,7 @@ public class InvocationCommandParser { currentLiteral = nextLiteral; } - return Results.success(new ExecutionData(currentLiteral.getExecutor(), ctx)); + return Results.success(new ExecutionData(currentLiteral.executor(), ctx)); } private Result>, String> processArguments( @@ -60,33 +64,45 @@ public class InvocationCommandParser { ) { Map> parsedArguments = new HashMap<>(); - for (var _argument : literal.getArguments()) { + for (var _argument : literal.arguments()) { @SuppressWarnings("unchecked") var argument = ((CommandArgumentSpec) _argument); Object value; if (!tokenIter.hasNext()) { - if (argument.getDefaultValueProvider() == null) - return Results.failure("Argument expected: " + argument.getId()); - value = argument.getDefaultValueProvider().apply(ctx); + if (argument.defaultValueProvider() == null) + return Results.failure("Argument expected: " + argument.id()); + value = requireNonNull(argument.defaultValueProvider()).apply(ctx); } else { - var input = helper.parseInput(tokenIter, argument.getType().isGreedy()); + var input = helper.parseInput(tokenIter, argument.type().greedy()); try { value = argument.parseInput(input); } catch (IllegalArgumentException ex) { - return Results.failure("Illegal argument '" + input + "' for " + argument.getId() + ": " + ex.getMessage()); + return Results.failure("Illegal argument '" + input + "' for " + argument.id() + ": " + ex.getMessage()); } } - parsedArguments.put(argument.getId(), new CommandArgumentImpl<>(value, argument)); + parsedArguments.put(argument.id(), new CommandArgumentImpl<>(value, argument)); } return Results.success(parsedArguments); } - @Value public class ExecutionData { - CommandExecutor executor; - CommandContext context; + private final CommandExecutor executor; + private final CommandContext context; + + public ExecutionData(CommandExecutor executor, CommandContext context) { + this.executor = executor; + this.context = context; + } + + public CommandExecutor executor() { + return executor; + } + + public CommandContext context() { + return context; + } } } diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/parser/SuggestionCommandParser.java b/core/src/main/java/de/kentoj/kencommandapi/internal/parser/SuggestionCommandParser.java similarity index 83% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/parser/SuggestionCommandParser.java rename to core/src/main/java/de/kentoj/kencommandapi/internal/parser/SuggestionCommandParser.java index a83b23f..088a740 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/parser/SuggestionCommandParser.java +++ b/core/src/main/java/de/kentoj/kencommandapi/internal/parser/SuggestionCommandParser.java @@ -1,7 +1,6 @@ package de.kentoj.kencommandapi.internal.parser; import de.kentoj.kencommandapi.api.literal.Literal; -import lombok.RequiredArgsConstructor; import org.jetbrains.annotations.Nullable; import java.util.Arrays; @@ -9,11 +8,14 @@ import java.util.Iterator; import java.util.List; import java.util.stream.Stream; -@RequiredArgsConstructor public class SuggestionCommandParser { private final CommandParseHelper helper; + public SuggestionCommandParser(CommandParseHelper helper) { + this.helper = helper; + } + public List suggest( Literal rootLiteral, T sender, @@ -55,7 +57,7 @@ public class SuggestionCommandParser { T sender, boolean suggestNext ) { - var argsIter = literal.getArguments().iterator(); + var argsIter = literal.arguments().iterator(); /* for each argument: @@ -72,16 +74,16 @@ public class SuggestionCommandParser { while (argsIter.hasNext()) { var argument = argsIter.next(); if (!tokenIter.hasNext()) - return argument.getSuggestionProvider().suggest(sender); - var input = helper.parseInput(tokenIter, argument.getType().isGreedy()).toLowerCase(); + return argument.suggestionProvider().suggest(sender); + var input = helper.parseInput(tokenIter, argument.type().greedy()).toLowerCase(); if (tokenIter.hasNext()) continue; if (suggestNext) { if (argsIter.hasNext()) - return argsIter.next().getSuggestionProvider().suggest(sender); + return argsIter.next().suggestionProvider().suggest(sender); return null; } - return argument.getSuggestionProvider().suggest(sender).stream() + return argument.suggestionProvider().suggest(sender).stream() .filter(suggestion -> suggestion.toLowerCase().startsWith(input)) .toList(); } @@ -89,9 +91,9 @@ public class SuggestionCommandParser { } private Stream suggestions(Literal literal, T sender) { - return literal.getLiterals().stream() + return literal.literals().stream() .filter(lit -> helper.hasPermission(sender, lit)) - .map(Literal::getNames) + .map(Literal::names) .flatMap(Arrays::stream); } } diff --git a/kencommandapi-core/src/test/java/de/kentoj/kencommandapi/api/parser/ENV.java b/core/src/test/java/de/kentoj/kencommandapi/api/parser/ENV.java similarity index 100% rename from kencommandapi-core/src/test/java/de/kentoj/kencommandapi/api/parser/ENV.java rename to core/src/test/java/de/kentoj/kencommandapi/api/parser/ENV.java diff --git a/kencommandapi-core/src/test/java/de/kentoj/kencommandapi/api/parser/SuggestionCommandParserTest.java b/core/src/test/java/de/kentoj/kencommandapi/api/parser/SuggestionCommandParserTest.java similarity index 100% rename from kencommandapi-core/src/test/java/de/kentoj/kencommandapi/api/parser/SuggestionCommandParserTest.java rename to core/src/test/java/de/kentoj/kencommandapi/api/parser/SuggestionCommandParserTest.java diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java deleted file mode 100644 index 5a1fba0..0000000 --- a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.kentoj.kencommandapi; - -import de.kentoj.kencommandapi.api.CommandHandler; -import de.kentoj.kencommandapi.api.literal.Literal; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; - -import java.util.Arrays; -import java.util.stream.Stream; - -public class BukkitKenCommand extends Command { - - private final Literal rootNode; - private final CommandHandler commandHandler; - - protected BukkitKenCommand( - CommandHandler commandHandler, - Literal rootLiteral - ) { - super(rootLiteral.getNames()[0]); - this.commandHandler = commandHandler; - this.rootNode = rootLiteral; - this.setAliases(Arrays.asList(rootLiteral.getNames())); - this.setPermission(rootLiteral.getPermission()); - } - - @Override - public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) { - commandHandler.invoke(rootNode, sender, Stream.of(args) - .filter(str -> !str.isEmpty())); - return true; - } -} diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentImpl.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentImpl.java deleted file mode 100644 index 52fac15..0000000 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentImpl.java +++ /dev/null @@ -1,9 +0,0 @@ -package de.kentoj.kencommandapi.api.argument; - -import lombok.Value; - -@Value -public class CommandArgumentImpl implements CommandArgument { - V value; - CommandArgumentSpec argument; -} diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecImpl.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecImpl.java deleted file mode 100644 index 83bd721..0000000 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgumentSpecImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.kentoj.kencommandapi.api.argument; - -import de.kentoj.kencommandapi.api.invocation.CommandContext; -import de.kentoj.kencommandapi.api.suggestion.SuggestionProvider; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.function.Function; - -@RequiredArgsConstructor -public final class CommandArgumentSpecImpl implements CommandArgumentSpec { - @Getter - private final String id; - @Getter - private final ArgumentType type; - private final List> requirements; - private final Function, V> defaultValueProvider; - private final @Nullable SuggestionProvider suggestionProvider; - - @Override - public V parseInput(String rawInput) { - var parsed = type.parseInputUnchecked(rawInput); - for (var requirement : requirements) { - if (!requirement.getPredicate().test(parsed)) - throw new IllegalArgumentException(requirement.getMessage()); - } - return parsed; - } - - @Override - public @Nullable Function, V> getDefaultValueProvider() { - return defaultValueProvider; - } - - @Override - public @NotNull SuggestionProvider getSuggestionProvider() { - return suggestionProvider != null ? suggestionProvider : type.getDefaultSuggestionProvider(); - } -} diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralImpl.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralImpl.java deleted file mode 100644 index 3dc31ea..0000000 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/LiteralImpl.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.kentoj.kencommandapi.api.literal; - -import de.kentoj.kencommandapi.api.argument.CommandArgumentSpec; -import de.kentoj.kencommandapi.api.invocation.CommandExecutor; -import de.kentoj.kencommandapi.api.platform.MessageStyle; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; - -@Getter -@RequiredArgsConstructor(access = AccessLevel.PACKAGE) -public class LiteralImpl implements Literal { - private final String[] names; - private final List> literals; - private final List> arguments; - private final CommandExecutor executor; - /** - * what the literal does - */ - private String description; - private final @Nullable String permission; - private final MessageStyle messageStyle; - - @Override - public @Nullable Literal getLiteral(@NotNull String name) { - for (Literal literal : literals) { - for (var literalName : literal.getNames()) { - if (literalName.equalsIgnoreCase(name)) - return literal; - } - } - return null; - } -} diff --git a/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/CommandAPI.java b/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/CommandAPI.java deleted file mode 100644 index cf0aacb..0000000 --- a/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/CommandAPI.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.kentoj.kencommandapi; - -import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.proxy.ProxyServer; -import de.kentoj.kencommandapi.api.CommandHandler; -import de.kentoj.kencommandapi.api.literal.Literal; -import lombok.RequiredArgsConstructor; - -import java.util.Arrays; - -@RequiredArgsConstructor -public class CommandAPI { - - private final ProxyServer server; - private final CommandHandler commandHandler = - new CommandHandler<>(CommandSource::sendMessage, CommandSource::hasPermission); - - public void register(Literal rootNode) { - var cm = server.getCommandManager(); - var meta = cm.metaBuilder(rootNode.getNames()[0]) - .aliases(Arrays.copyOfRange(rootNode.getNames(), 1, rootNode.getNames().length)) - .build(); - cm.register(meta, new VelocityCommand(commandHandler, rootNode)); - } -} diff --git a/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/VelocityCommand.java b/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/VelocityCommand.java deleted file mode 100644 index 6068f0c..0000000 --- a/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/VelocityCommand.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.kentoj.kencommandapi; - -import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.command.RawCommand; -import de.kentoj.kencommandapi.api.CommandHandler; -import de.kentoj.kencommandapi.api.literal.Literal; -import lombok.RequiredArgsConstructor; - -import java.util.Arrays; -import java.util.List; - -@RequiredArgsConstructor -public class VelocityCommand implements RawCommand { - - private final CommandHandler commandHandler; - private final Literal rootNode; - - @Override - public void execute(Invocation invocation) { - var args = Arrays.stream(invocation.arguments().split(" ")) - .filter(a -> !a.isEmpty()); - commandHandler.invoke(rootNode, invocation.source(), args); - } - - @Override - public boolean hasPermission(Invocation ctx) { - if (rootNode.getPermission() == null) return true; - return ctx.source().hasPermission(rootNode.getPermission()); - } - - @Override - public List suggest(Invocation invocation) { - var args = invocation.arguments().split(" "); - return commandHandler.getSuggestions(rootNode, invocation.source(), args, invocation.arguments().endsWith(" ")); - } -} \ No newline at end of file diff --git a/third_party/BUILD b/third_party/BUILD deleted file mode 100644 index bcfec20..0000000 --- a/third_party/BUILD +++ /dev/null @@ -1,7 +0,0 @@ -load("@rules_java//java:java_plugin.bzl", "java_plugin") -java_plugin( - name = "lombok_plugin", - visibility = ["//visibility:public"], - deps = ["@maven//:org_projectlombok_lombok"], - processor_class = "lombok.launch.AnnotationProcessorHider$AnnotationProcessor", -) diff --git a/third_party/libs.versions.toml b/third_party/libs.versions.toml deleted file mode 100644 index 432415a..0000000 --- a/third_party/libs.versions.toml +++ /dev/null @@ -1,24 +0,0 @@ -[versions] -shadow = "9.2.0" -run-paper = "2.3.1" -papermc = "1.21.11-rc3-R0.1-SNAPSHOT" -velocity = "3.5.0-SNAPSHOT" -adventure = "5.2.0" -scrow-commandapi = "0.33-SNAPSHOT" - -[plugins] -shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } -runpaper = { id = "xyz.jpenilla.run-paper", version.ref = "run-paper" } -scrow-basedependencies = { id = "scrow.base-dependencies" } -scrow-javalibrary = { id = "scrow.java-library" } - -[libraries] -# https://docs.papermc.io/paper/dev/project-setup/ -papermc-api = { module = "io.papermc.paper:paper-api", version.ref = "papermc" } -# https://docs.papermc.io/velocity/dev/creating-your-first-plugin/ -velocity-api = { module = "com.velocitypowered:velocity-api", version.ref = "velocity" } -adventure-api = { module = "net.kyori:adventure-api", version.ref = "adventure" } -adventure-minimessage = { module = "net.kyori:adventure-text-minimessage", version.ref = "adventure" } - -# http://forge.kentoj.de/scrow/-/packages/maven/de.kentoj.scrow:kencommandapi-core -scrow-commandapi-core = { module = "de.kentoj.scrow:kencommandapi-core", version.ref = "scrow-commandapi" } \ No newline at end of file diff --git a/kencommandapi-velocity/BUILD b/velocity/BUILD similarity index 68% rename from kencommandapi-velocity/BUILD rename to velocity/BUILD index 8dc0eee..ff2e56e 100644 --- a/kencommandapi-velocity/BUILD +++ b/velocity/BUILD @@ -5,14 +5,11 @@ java_export( maven_coordinates = "de.kentoj.scrow:kencommandapi-velocity:0.34-SNAPSHOT", srcs = glob(["src/main/**/*.java"]), deps = [ - "//kencommandapi-core:core", - artifact("org.projectlombok:lombok"), + "//core", artifact("org.jetbrains:annotations"), artifact("com.velocitypowered:velocity-api"), ], exports = [ - "//kencommandapi-core:core", + "//core", ], - plugins = [ "//third_party:lombok_plugin" ], - ) \ No newline at end of file diff --git a/velocity/src/main/java/de/kentoj/kencommandapi/CommandAPI.java b/velocity/src/main/java/de/kentoj/kencommandapi/CommandAPI.java new file mode 100644 index 0000000..fb27f9c --- /dev/null +++ b/velocity/src/main/java/de/kentoj/kencommandapi/CommandAPI.java @@ -0,0 +1,28 @@ +package de.kentoj.kencommandapi; + +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.proxy.ProxyServer; +import de.kentoj.kencommandapi.api.CommandHandler; +import de.kentoj.kencommandapi.api.literal.RootLiteral; + +import java.util.Arrays; + +public class CommandAPI { + + private final ProxyServer server; + private final Class senderType; + private final CommandHandler commandHandler = new CommandHandler<>(T::sendMessage, T::hasPermission); + + public CommandAPI(ProxyServer server, Class senderType) { + this.server = server; + this.senderType = senderType; + } + + public void register(RootLiteral rootNode) { + var cm = server.getCommandManager(); + var meta = cm.metaBuilder(rootNode.names()[0]) + .aliases(Arrays.copyOfRange(rootNode.names(), 1, rootNode.names().length)) + .build(); + cm.register(meta, new VelocityCommand<>(commandHandler, rootNode, senderType)); + } +} diff --git a/velocity/src/main/java/de/kentoj/kencommandapi/VelocityCommand.java b/velocity/src/main/java/de/kentoj/kencommandapi/VelocityCommand.java new file mode 100644 index 0000000..767e4ae --- /dev/null +++ b/velocity/src/main/java/de/kentoj/kencommandapi/VelocityCommand.java @@ -0,0 +1,53 @@ +package de.kentoj.kencommandapi; + +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.command.RawCommand; +import de.kentoj.kencommandapi.api.CommandHandler; +import de.kentoj.kencommandapi.api.literal.RootLiteral; +import de.kentoj.kencommandapi.api.platform.MessageStyle; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class VelocityCommand implements RawCommand { + + private final CommandHandler commandHandler; + private final RootLiteral rootNode; + private final Class senderType; + + public VelocityCommand(CommandHandler commandHandler, RootLiteral rootNode, Class senderType) { + this.commandHandler = commandHandler; + this.rootNode = rootNode; + this.senderType = senderType; + } + + @Override + public void execute(Invocation invocation) { + if (!senderType.isInstance(invocation.source())) { + invocation.source().sendMessage(MessageStyle.PLAIN.err("You can't use that command")); + return; + } + T sender = senderType.cast(invocation.source()); + + var args = Arrays.stream(invocation.arguments().split(" ")) + .filter(a -> !a.isEmpty()); + commandHandler.invoke(rootNode, sender, args); + } + + @Override + public boolean hasPermission(Invocation ctx) { + if (rootNode.permission() == null) return true; + return ctx.source().hasPermission(rootNode.permission()); + } + + @Override + public List suggest(Invocation invocation) { + if (!senderType.isInstance(invocation.source())) + return Collections.emptyList(); + T sender = senderType.cast(invocation.source()); + + var args = invocation.arguments().split(" "); + return commandHandler.getSuggestions(rootNode, sender, args, invocation.arguments().endsWith(" ")); + } +} \ No newline at end of file diff --git a/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java b/velocity/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java similarity index 72% rename from kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java rename to velocity/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java index d25f628..16b6473 100644 --- a/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java +++ b/velocity/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java @@ -4,16 +4,17 @@ import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; import de.kentoj.kencommandapi.api.suggestion.SuggestionProvider; -import lombok.RequiredArgsConstructor; import java.util.List; -import java.util.concurrent.CompletableFuture; -@RequiredArgsConstructor -public class PlayerSuggestionProvider implements SuggestionProvider { +public final class PlayerSuggestionProvider implements SuggestionProvider { private final ProxyServer proxyServer; + public PlayerSuggestionProvider(ProxyServer proxyServer) { + this.proxyServer = proxyServer; + } + @Override public List suggest(CommandSource __) { return proxyServer.getAllPlayers().stream() diff --git a/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java b/velocity/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java similarity index 91% rename from kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java rename to velocity/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java index f894873..a0913f1 100644 --- a/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java +++ b/velocity/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java @@ -6,13 +6,15 @@ import com.velocitypowered.api.proxy.ProxyServer; import de.kentoj.kencommandapi.api.argument.ArgumentType; import de.kentoj.kencommandapi.api.suggestion.SuggestionProvider; import de.kentoj.kencommandapi.suggestionprovider.PlayerSuggestionProvider; -import lombok.RequiredArgsConstructor; -@RequiredArgsConstructor public class PlayerArgumentType implements ArgumentType { private final ProxyServer server; + public PlayerArgumentType(ProxyServer server) { + this.server = server; + } + @Override public Player parseInputUnchecked(String input) { var player = server.getPlayer(input).orElse(null);