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 @@
+
+
+
+
+
+
-
+
-
-
-
@@ -37,11 +40,61 @@
-
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -139,8 +192,14 @@
+
-
@@ -226,7 +291,6 @@
-
@@ -237,39 +301,41 @@
-
+
+
+
-
-
-
- @//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
+
+
+
+
@@ -288,8 +354,11 @@
true
true
+ false
false
false
+ false
+ false
@@ -305,14 +374,22 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -548,6 +625,9 @@
+
+
+
@@ -575,6 +655,7 @@
-
+
+
\ 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);