From f18ce1c429aeb7e2f61d07d085718560481906fd Mon Sep 17 00:00:00 2001 From: kento2 Date: Sat, 29 Aug 2026 15:11:32 +0200 Subject: [PATCH] use LiteralMeta instead of permission-less literal-names for subLiterals --- .../scrow/commands/bukkit/BukkitPlatform.java | 5 +++- .../scrow/commands/CommandHandler.java | 15 ++++++++--- .../scrow/commands/PlatformAdapter.java | 3 ++- .../model/literal/DynamicLiteralBuilder.java | 26 +++++++++---------- .../scrow/commands/model/literal/Literal.java | 15 ++++++----- .../commands/model/literal/LiteralMeta.java | 9 +++++++ .../model/literal/RootLiteralWrapper.java | 4 +-- .../commands/model/literal/StaticLiteral.java | 6 ++--- .../scrow/commands/parser/NodeTreeWalker.java | 4 +-- defs.bzl | 2 +- .../commands/velocity/ScrowCommands.java | 6 +++-- .../commands/velocity/VelocityCommand.java | 8 +++--- .../commands/velocity/VelocityPlatform.java | 5 +++- 13 files changed, 68 insertions(+), 40 deletions(-) create mode 100644 common/site/lab0x13/scrow/commands/model/literal/LiteralMeta.java diff --git a/bukkit/site/lab0x13/scrow/commands/bukkit/BukkitPlatform.java b/bukkit/site/lab0x13/scrow/commands/bukkit/BukkitPlatform.java index 1f9b120..87827b8 100644 --- a/bukkit/site/lab0x13/scrow/commands/bukkit/BukkitPlatform.java +++ b/bukkit/site/lab0x13/scrow/commands/bukkit/BukkitPlatform.java @@ -1,11 +1,14 @@ package site.lab0x13.scrow.commands.bukkit; import net.kyori.adventure.text.Component; +import org.jetbrains.annotations.Nullable; import site.lab0x13.scrow.commands.PlatformAdapter; class BukkitPlatform> implements PlatformAdapter { @Override - public boolean checkPermission(C ctx, String permission) { + public boolean checkPermission(C ctx, @Nullable String permission) { + if (permission == null) + return true; return ctx.sender().hasPermission(permission); } diff --git a/common/site/lab0x13/scrow/commands/CommandHandler.java b/common/site/lab0x13/scrow/commands/CommandHandler.java index 70c1dbc..6c9a5f5 100644 --- a/common/site/lab0x13/scrow/commands/CommandHandler.java +++ b/common/site/lab0x13/scrow/commands/CommandHandler.java @@ -1,11 +1,14 @@ package site.lab0x13.scrow.commands; import site.lab0x13.scrow.commands.model.CommandContext; +import site.lab0x13.scrow.commands.model.literal.LiteralMeta; +import site.lab0x13.scrow.commands.model.literal.MessageStyle; import site.lab0x13.scrow.commands.model.literal.RootLiteral; import site.lab0x13.scrow.commands.parser.NodeTreeWalker; import site.lab0x13.scrow.commands.parser.WalkResult; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.stream.Stream; @@ -42,15 +45,21 @@ public class CommandHandler> { String input = null; switch (walkResult) { case WalkResult.LiteralUnknown res -> { - stream = res.lastLiteral().subLiteralNames().stream(); + stream = res.lastLiteral().subLiteralMetas().stream() + .filter(literalMeta -> platformAdapter.checkPermission(ctx, literalMeta.permission())) + .map(LiteralMeta::names) + .flatMap(Collection::stream); input = res.input(); } + case WalkResult.LiteralExpected res when trailingSpace -> + stream = res.lastLiteral().subLiteralMetas().stream() + .filter(literalMeta -> platformAdapter.checkPermission(ctx, literalMeta.permission())) + .map(LiteralMeta::names) + .flatMap(Collection::stream); case WalkResult.ArgumentIllegal res -> { stream = res.arg().suggestionProvider().suggest(ctx, res.input()).stream(); input = res.input(); } - case WalkResult.LiteralExpected res when trailingSpace -> - stream = res.lastLiteral().subLiteralNames().stream(); case WalkResult.ArgumentExpected res when trailingSpace -> stream = res.arg().suggestionProvider().suggest(ctx, "").stream(); default -> { diff --git a/common/site/lab0x13/scrow/commands/PlatformAdapter.java b/common/site/lab0x13/scrow/commands/PlatformAdapter.java index 7718f02..a2c6cc6 100644 --- a/common/site/lab0x13/scrow/commands/PlatformAdapter.java +++ b/common/site/lab0x13/scrow/commands/PlatformAdapter.java @@ -1,10 +1,11 @@ package site.lab0x13.scrow.commands; import net.kyori.adventure.text.Component; +import org.jetbrains.annotations.Nullable; public interface PlatformAdapter { - boolean checkPermission(C ctx, String permission); + boolean checkPermission(C ctx, @Nullable String permission); void sendMessage(C ctx, Component message); } diff --git a/common/site/lab0x13/scrow/commands/model/literal/DynamicLiteralBuilder.java b/common/site/lab0x13/scrow/commands/model/literal/DynamicLiteralBuilder.java index 46b3bd0..1e5db62 100644 --- a/common/site/lab0x13/scrow/commands/model/literal/DynamicLiteralBuilder.java +++ b/common/site/lab0x13/scrow/commands/model/literal/DynamicLiteralBuilder.java @@ -11,7 +11,7 @@ import java.util.function.Supplier; public final class DynamicLiteralBuilder> extends LiteralBuilder> { - private Supplier> subLiteralNamesSupplier = Collections::emptyList; + private Supplier> subLiteralMetaSupplier = Collections::emptyList; private Function> subLiteralProvider = _ -> null; DynamicLiteralBuilder(String... names) { @@ -23,6 +23,16 @@ public final class DynamicLiteralBuilder> extends Li return this; } + public DynamicLiteralBuilder withSubLiteralNames(Supplier> names) { + subLiteralMetaSupplier = names; + return this; + } + + public DynamicLiteralBuilder withSubLiteralProvider(Function> literalProvider) { + this.subLiteralProvider = literalProvider; + return this; + } + @Override public Literal build() { return new DynamicLiteral<>( @@ -37,19 +47,9 @@ public final class DynamicLiteralBuilder> extends Li } @Override - public List subLiteralNames() { - return subLiteralNamesSupplier.get(); + public List subLiteralMetas() { + return subLiteralMetaSupplier.get(); } }; } - - public DynamicLiteralBuilder withSubLiteralNames(Supplier> names) { - subLiteralNamesSupplier = names; - return this; - } - - public DynamicLiteralBuilder withSubLiteralProvider(Function> literalProvider) { - this.subLiteralProvider = literalProvider; - return this; - } } diff --git a/common/site/lab0x13/scrow/commands/model/literal/Literal.java b/common/site/lab0x13/scrow/commands/model/literal/Literal.java index a8107ef..204cfaa 100644 --- a/common/site/lab0x13/scrow/commands/model/literal/Literal.java +++ b/common/site/lab0x13/scrow/commands/model/literal/Literal.java @@ -7,12 +7,14 @@ import site.lab0x13.scrow.commands.model.Node; import site.lab0x13.scrow.commands.model.SuggestionProvider; import site.lab0x13.scrow.commands.model.argument.Argument; +import java.util.Arrays; +import java.util.Collection; import java.util.List; /** * @param argument of the command context */ -public interface Literal> extends Node { +public interface Literal> extends Node, LiteralMeta { static > StaticLiteralBuilder builder(String... names) { return new StaticLiteralBuilder<>(names); @@ -22,8 +24,6 @@ public interface Literal> extends Node { return new DynamicLiteralBuilder<>(names); } - List names(); - @Nullable CommandExecutor executor(); @Nullable Literal getSubLiteral(String name); @@ -31,14 +31,15 @@ public interface Literal> extends Node { /** * @return aliases/names of literals */ - List subLiteralNames(); + List subLiteralMetas(); List> arguments(); - String permission(); - @Override default SuggestionProvider suggestionProvider() { - return (_, _) -> subLiteralNames(); + return (_, _) -> subLiteralMetas().stream() + .map(LiteralMeta::names) + .flatMap(Collection::stream) + .toList(); } } \ No newline at end of file diff --git a/common/site/lab0x13/scrow/commands/model/literal/LiteralMeta.java b/common/site/lab0x13/scrow/commands/model/literal/LiteralMeta.java new file mode 100644 index 0000000..b0b2b1f --- /dev/null +++ b/common/site/lab0x13/scrow/commands/model/literal/LiteralMeta.java @@ -0,0 +1,9 @@ +package site.lab0x13.scrow.commands.model.literal; + +import java.util.List; + +public interface LiteralMeta { + List names(); + + String permission(); +} diff --git a/common/site/lab0x13/scrow/commands/model/literal/RootLiteralWrapper.java b/common/site/lab0x13/scrow/commands/model/literal/RootLiteralWrapper.java index 02a07e8..97586c1 100644 --- a/common/site/lab0x13/scrow/commands/model/literal/RootLiteralWrapper.java +++ b/common/site/lab0x13/scrow/commands/model/literal/RootLiteralWrapper.java @@ -37,8 +37,8 @@ public class RootLiteralWrapper> implements RootLite } @Override - public List subLiteralNames() { - return literal.subLiteralNames(); + public List subLiteralMetas() { + return literal.subLiteralMetas(); } @Override diff --git a/common/site/lab0x13/scrow/commands/model/literal/StaticLiteral.java b/common/site/lab0x13/scrow/commands/model/literal/StaticLiteral.java index 83f9d03..d78723d 100644 --- a/common/site/lab0x13/scrow/commands/model/literal/StaticLiteral.java +++ b/common/site/lab0x13/scrow/commands/model/literal/StaticLiteral.java @@ -30,9 +30,7 @@ public class StaticLiteral> extends DynamicLiteral subLiteralNames() { - return subLiterals.stream() - .flatMap(literal -> literal.names().stream()) - .toList(); + public List subLiteralMetas() { + return subLiterals; } } diff --git a/common/site/lab0x13/scrow/commands/parser/NodeTreeWalker.java b/common/site/lab0x13/scrow/commands/parser/NodeTreeWalker.java index f58c678..573374a 100644 --- a/common/site/lab0x13/scrow/commands/parser/NodeTreeWalker.java +++ b/common/site/lab0x13/scrow/commands/parser/NodeTreeWalker.java @@ -42,12 +42,12 @@ public class NodeTreeWalker> { var nextLiteral = literal.getSubLiteral(token); if (nextLiteral == null) return new WalkResult.LiteralUnknown<>(ctx, literal, token); - if (nextLiteral.permission() != null && platformAdapter.checkPermission(ctx, nextLiteral.permission())) + if (platformAdapter.checkPermission(ctx, nextLiteral.permission())) return new WalkResult.LiteralUnknown<>(ctx, literal, token); literal = nextLiteral; } - if (!literal.subLiteralNames().isEmpty()) { + if (!literal.subLiteralMetas().isEmpty()) { var isOptional = literal.executor() != null; return new WalkResult.LiteralExpected<>(ctx, literal, isOptional); } diff --git a/defs.bzl b/defs.bzl index 6838b9b..a32d963 100644 --- a/defs.bzl +++ b/defs.bzl @@ -1,2 +1,2 @@ GROUP = "site.lab0x13.scrow" -VERSION = "1.2.0" \ No newline at end of file +VERSION = "1.3.0" \ No newline at end of file diff --git a/velocity/site/lab0x13/scrow/commands/velocity/ScrowCommands.java b/velocity/site/lab0x13/scrow/commands/velocity/ScrowCommands.java index 92ae291..6821df0 100644 --- a/velocity/site/lab0x13/scrow/commands/velocity/ScrowCommands.java +++ b/velocity/site/lab0x13/scrow/commands/velocity/ScrowCommands.java @@ -10,11 +10,13 @@ public class ScrowCommands> implements IScro private final ProxyServer server; private final CommandContextFactory commandContextFactory; private final CommandHandler commandHandler; + private final VelocityPlatform platformAdapter; public ScrowCommands(ProxyServer server, CommandContextFactory commandContextFactory) { this.server = server; this.commandContextFactory = commandContextFactory; - this.commandHandler = new CommandHandler(new VelocityPlatform<>()); + this.platformAdapter = new VelocityPlatform<>(); + this.commandHandler = new CommandHandler<>(platformAdapter); } public void register(RootLiteral rootNode) { @@ -22,6 +24,6 @@ public class ScrowCommands> implements IScro var meta = cm.metaBuilder(rootNode.names().getFirst()) .aliases(rootNode.names().stream().skip(1).toArray(String[]::new)) .build(); - cm.register(meta, new VelocityCommand<>(commandHandler, commandContextFactory, rootNode)); + cm.register(meta, new VelocityCommand<>(commandHandler, commandContextFactory, platformAdapter, rootNode)); } } diff --git a/velocity/site/lab0x13/scrow/commands/velocity/VelocityCommand.java b/velocity/site/lab0x13/scrow/commands/velocity/VelocityCommand.java index 7b49149..3c45da5 100644 --- a/velocity/site/lab0x13/scrow/commands/velocity/VelocityCommand.java +++ b/velocity/site/lab0x13/scrow/commands/velocity/VelocityCommand.java @@ -2,6 +2,7 @@ package site.lab0x13.scrow.commands.velocity; import com.velocitypowered.api.command.RawCommand; import site.lab0x13.scrow.commands.CommandHandler; +import site.lab0x13.scrow.commands.PlatformAdapter; import site.lab0x13.scrow.commands.model.literal.RootLiteral; import java.util.Arrays; @@ -11,11 +12,13 @@ public class VelocityCommand> implements Raw private final CommandHandler commandHandler; private final CommandContextFactory commandContextFactory; + private final PlatformAdapter platformAdapter; private final RootLiteral rootLiteral; - public VelocityCommand(CommandHandler commandHandler, CommandContextFactory commandContextFactory, RootLiteral rootLiteral) { + public VelocityCommand(CommandHandler commandHandler, CommandContextFactory commandContextFactory, PlatformAdapter platformAdapter, RootLiteral rootLiteral) { this.commandHandler = commandHandler; this.commandContextFactory = commandContextFactory; + this.platformAdapter = platformAdapter; this.rootLiteral = rootLiteral; } @@ -29,8 +32,7 @@ public class VelocityCommand> implements Raw @Override public boolean hasPermission(Invocation ctx) { - if (rootLiteral.permission() == null) return true; - return ctx.source().hasPermission(rootLiteral.permission()); + return platformAdapter.checkPermission(ctx, rootLiteral.permission()); } @Override diff --git a/velocity/site/lab0x13/scrow/commands/velocity/VelocityPlatform.java b/velocity/site/lab0x13/scrow/commands/velocity/VelocityPlatform.java index 0b733f3..7c8f95d 100644 --- a/velocity/site/lab0x13/scrow/commands/velocity/VelocityPlatform.java +++ b/velocity/site/lab0x13/scrow/commands/velocity/VelocityPlatform.java @@ -1,11 +1,14 @@ package site.lab0x13.scrow.commands.velocity; import net.kyori.adventure.text.Component; +import org.jetbrains.annotations.Nullable; import site.lab0x13.scrow.commands.PlatformAdapter; public class VelocityPlatform> implements PlatformAdapter { @Override - public boolean checkPermission(C ctx, String permission) { + public boolean checkPermission(C ctx, @Nullable String permission) { + if (permission == null) + return true; return ctx.sender().hasPermission(permission); }