From 6b122b60f1b53dd52621d648a79db3a6f51f8603 Mon Sep 17 00:00:00 2001 From: huanmeng-qwq <1871735932@qq.com> Date: Thu, 6 Feb 2025 15:39:12 +0800 Subject: [PATCH 1/5] fabric implements PermissionResolver --- .../litecommands/settings/PermissionResolver.java | 8 ++++++++ .../litecommands/fabric/FabricAbstractPlatform.java | 9 ++++----- .../litecommands/fabric/LiteFabricSettings.java | 11 +++++++++++ .../fabric/client/FabricClientPlatform.java | 13 ++++++++++++- .../fabric/client/FabricClientSender.java | 6 ++++-- .../fabric/server/FabricServerPlatform.java | 13 ++++++++++++- .../fabric/server/FabricServerSender.java | 6 ++++-- .../litecommands/minestom/LiteMinestomSettings.java | 6 +++--- .../minestom/settings/PermissionResolver.java | 10 ---------- 9 files changed, 58 insertions(+), 24 deletions(-) create mode 100644 litecommands-core/src/dev/rollczi/litecommands/settings/PermissionResolver.java delete mode 100644 litecommands-minestom/src/dev/rollczi/litecommands/minestom/settings/PermissionResolver.java diff --git a/litecommands-core/src/dev/rollczi/litecommands/settings/PermissionResolver.java b/litecommands-core/src/dev/rollczi/litecommands/settings/PermissionResolver.java new file mode 100644 index 000000000..2c56f1017 --- /dev/null +++ b/litecommands-core/src/dev/rollczi/litecommands/settings/PermissionResolver.java @@ -0,0 +1,8 @@ +package dev.rollczi.litecommands.settings; + +@FunctionalInterface +public interface PermissionResolver { + + boolean hasPermission(SENDER sender, String permission); + +} diff --git a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/FabricAbstractPlatform.java b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/FabricAbstractPlatform.java index e6ea05485..e226f87b7 100644 --- a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/FabricAbstractPlatform.java +++ b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/FabricAbstractPlatform.java @@ -4,17 +4,16 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.tree.LiteralCommandNode; import dev.rollczi.litecommands.command.CommandRoute; -import dev.rollczi.litecommands.platform.AbstractSimplePlatform; +import dev.rollczi.litecommands.platform.AbstractPlatform; import dev.rollczi.litecommands.platform.Platform; import dev.rollczi.litecommands.platform.PlatformInvocationListener; -import dev.rollczi.litecommands.platform.PlatformSenderFactory; import dev.rollczi.litecommands.platform.PlatformSuggestionListener; import java.util.HashMap; import java.util.Map; import java.util.UUID; -public abstract class FabricAbstractPlatform extends AbstractSimplePlatform implements Platform { +public abstract class FabricAbstractPlatform extends AbstractPlatform implements Platform { protected final Map> fabricCommands = new HashMap<>(); @@ -28,8 +27,8 @@ public abstract class FabricAbstractPlatform extends AbstractSimplePlatf } } - protected FabricAbstractPlatform(LiteFabricSettings settings, PlatformSenderFactory factory) { - super(settings, factory); + protected FabricAbstractPlatform(LiteFabricSettings settings) { + super(settings); registerEvents(); } diff --git a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/LiteFabricSettings.java b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/LiteFabricSettings.java index 602371467..a03906881 100644 --- a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/LiteFabricSettings.java +++ b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/LiteFabricSettings.java @@ -1,11 +1,14 @@ package dev.rollczi.litecommands.fabric; import dev.rollczi.litecommands.platform.PlatformSettings; +import dev.rollczi.litecommands.settings.PermissionResolver; +import net.minecraft.command.CommandSource; import org.jetbrains.annotations.ApiStatus; public class LiteFabricSettings implements PlatformSettings { private String inputInspectionDisplay = "[...]"; + private PermissionResolver permissionResolver = (sender, permission) -> true; String getInputInspectionDisplay() { return this.inputInspectionDisplay; @@ -22,4 +25,12 @@ public LiteFabricSettings inputInspectionDisplay(String name) { return this; } + public boolean hasPermission(CommandSource source, String permission) { + return this.permissionResolver.hasPermission(source, permission); + } + + public LiteFabricSettings permissionResolver(PermissionResolver permissionResolver) { + this.permissionResolver = permissionResolver; + return this; + } } diff --git a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientPlatform.java b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientPlatform.java index 87b6e9166..dc174fb2c 100644 --- a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientPlatform.java +++ b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientPlatform.java @@ -2,6 +2,8 @@ import dev.rollczi.litecommands.fabric.FabricAbstractPlatform; import dev.rollczi.litecommands.fabric.LiteFabricSettings; +import dev.rollczi.litecommands.platform.PlatformSender; +import dev.rollczi.litecommands.platform.PlatformSenderFactory; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; @@ -11,7 +13,7 @@ public class FabricClientPlatform extends FabricAbstractPlatform { public FabricClientPlatform(LiteFabricSettings settings) { - super(settings, source -> new FabricClientSender(source)); + super(settings); } @Override @@ -24,4 +26,13 @@ protected void registerEvents() { }); } + @Override + public PlatformSenderFactory getSenderFactory() { + return this::createSender; + } + + @Override + public PlatformSender createSender(FabricClientCommandSource nativeSender) { + return new FabricClientSender(nativeSender, this); + } } diff --git a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientSender.java b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientSender.java index a504f9e79..dc522638a 100644 --- a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientSender.java +++ b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientSender.java @@ -9,9 +9,11 @@ @Environment(EnvType.CLIENT) public class FabricClientSender extends AbstractPlatformSender { private final FabricClientCommandSource source; + private final FabricClientPlatform platform; - public FabricClientSender(FabricClientCommandSource source) { + public FabricClientSender(FabricClientCommandSource source, FabricClientPlatform platform) { this.source = source; + this.platform = platform; } @Override @@ -26,6 +28,6 @@ public Identifier getIdentifier() { @Override public boolean hasPermission(String permission) { - return false; + return this.platform.getConfiguration().hasPermission(this.source, permission); } } diff --git a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerPlatform.java b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerPlatform.java index 0c2bf6034..13a26ff33 100644 --- a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerPlatform.java +++ b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerPlatform.java @@ -2,12 +2,14 @@ import dev.rollczi.litecommands.fabric.FabricAbstractPlatform; import dev.rollczi.litecommands.fabric.LiteFabricSettings; +import dev.rollczi.litecommands.platform.PlatformSender; +import dev.rollczi.litecommands.platform.PlatformSenderFactory; import net.minecraft.server.command.ServerCommandSource; public class FabricServerPlatform extends FabricAbstractPlatform { public FabricServerPlatform(LiteFabricSettings settings) { - super(settings, source -> new FabricServerSender(source)); + super(settings); } @Override @@ -23,4 +25,13 @@ protected void registerEvents() { } } + @Override + public PlatformSenderFactory getSenderFactory() { + return this::createSender; + } + + @Override + public PlatformSender createSender(ServerCommandSource nativeSender) { + return new FabricServerSender(nativeSender, this); + } } diff --git a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerSender.java b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerSender.java index cbf0bce30..5291b6f05 100644 --- a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerSender.java +++ b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerSender.java @@ -10,9 +10,11 @@ public class FabricServerSender extends AbstractPlatformSender { private final ServerCommandSource source; + private final FabricServerPlatform platform; - public FabricServerSender(ServerCommandSource source) { + public FabricServerSender(ServerCommandSource source, FabricServerPlatform platform) { this.source = source; + this.platform = platform; } @Override @@ -34,6 +36,6 @@ public Identifier getIdentifier() { @Override public boolean hasPermission(String permission) { - return false; + return this.platform.getConfiguration().hasPermission(this.source, permission); } } diff --git a/litecommands-minestom/src/dev/rollczi/litecommands/minestom/LiteMinestomSettings.java b/litecommands-minestom/src/dev/rollczi/litecommands/minestom/LiteMinestomSettings.java index 99d3b01b6..72f519b3c 100644 --- a/litecommands-minestom/src/dev/rollczi/litecommands/minestom/LiteMinestomSettings.java +++ b/litecommands-minestom/src/dev/rollczi/litecommands/minestom/LiteMinestomSettings.java @@ -1,14 +1,14 @@ package dev.rollczi.litecommands.minestom; -import dev.rollczi.litecommands.minestom.settings.PermissionResolver; +import dev.rollczi.litecommands.settings.PermissionResolver; import dev.rollczi.litecommands.platform.PlatformSettings; import net.minestom.server.command.CommandSender; public class LiteMinestomSettings implements PlatformSettings { - private PermissionResolver permissionResolver = (sender, permission) -> true; + private PermissionResolver permissionResolver = (sender, permission) -> true; - public LiteMinestomSettings permissionResolver(PermissionResolver permissionResolver) { + public LiteMinestomSettings permissionResolver(PermissionResolver permissionResolver) { this.permissionResolver = permissionResolver; return this; } diff --git a/litecommands-minestom/src/dev/rollczi/litecommands/minestom/settings/PermissionResolver.java b/litecommands-minestom/src/dev/rollczi/litecommands/minestom/settings/PermissionResolver.java deleted file mode 100644 index cca8a4c52..000000000 --- a/litecommands-minestom/src/dev/rollczi/litecommands/minestom/settings/PermissionResolver.java +++ /dev/null @@ -1,10 +0,0 @@ -package dev.rollczi.litecommands.minestom.settings; - -import net.minestom.server.command.CommandSender; - -@FunctionalInterface -public interface PermissionResolver { - - boolean hasPermission(CommandSender sender, String permission); - -} From 71b2fe796f99a006084ea27c25e1fdb18d94c4b0 Mon Sep 17 00:00:00 2001 From: huanmeng-qwq <1871735932@qq.com> Date: Thu, 6 Feb 2025 17:25:59 +0800 Subject: [PATCH 2/5] Implement support for luckperms --- buildSrc/src/main/kotlin/Versions.kt | 3 ++ examples/fabric/build.gradle.kts | 16 ++++++ .../fabric/server/ServerExampleFabric.java | 19 ++++++- .../fabric/server/command/ExampleCommand.java | 10 ++++ .../fabric/src/main/resources/fabric.mod.json | 6 ++- .../litecommands-example.accesswidener | 3 ++ litecommands-luckperms/build.gradle.kts | 16 ++++++ .../luckperms/LuckPermsResolver.java | 49 +++++++++++++++++++ settings.gradle.kts | 1 + 9 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 examples/fabric/src/main/resources/litecommands-example.accesswidener create mode 100644 litecommands-luckperms/build.gradle.kts create mode 100644 litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsResolver.java diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index acdc5a236..bc318d5e8 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -52,4 +52,7 @@ object Versions { const val HIBERNATE_VALIDATOR = "8.0.2.Final" const val EXPRESSLY = "5.0.0" + // LuckPerms + const val LUCKPERMS_API = "5.4" + } \ No newline at end of file diff --git a/examples/fabric/build.gradle.kts b/examples/fabric/build.gradle.kts index 533eef59a..39008b96d 100644 --- a/examples/fabric/build.gradle.kts +++ b/examples/fabric/build.gradle.kts @@ -12,6 +12,7 @@ repositories { mavenCentral() maven("https://repo.panda-lang.org/releases/") maven("https://maven.fabricmc.net/") + maven("https://api.modrinth.com/maven") } dependencies { @@ -21,8 +22,19 @@ dependencies { modImplementation("net.fabricmc:fabric-loader:0.16.7") modImplementation("net.fabricmc.fabric-api:fabric-api:0.106.0+1.21.1") + modLocalRuntime("maven.modrinth:fabric-permissions-api:0.3.3") + modLocalRuntime("maven.modrinth:luckperms:v5.4.140-fabric") + // modImplementation("dev.rollczi:litecommands-fabric:3.9.7") // <-- uncomment in your project implementation(project(path = ":litecommands-fabric", configuration = "namedElements")) + /*"dev.rollczi:litecommands-luckperms:3.9.7".also { + api(it) + include(it) + }*/ + project(":litecommands-luckperms").also { + api(it) + include(it) + } } @@ -30,3 +42,7 @@ sourceSets.test { java.setSrcDirs(emptyList()) resources.setSrcDirs(emptyList()) } + +loom { + accessWidenerPath = project.file("src/main/resources/litecommands-example.accesswidener") +} \ No newline at end of file diff --git a/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/ServerExampleFabric.java b/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/ServerExampleFabric.java index da46abc2d..7fc10dd83 100644 --- a/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/ServerExampleFabric.java +++ b/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/ServerExampleFabric.java @@ -2,13 +2,28 @@ import dev.rollczi.example.fabric.server.command.ExampleCommand; import dev.rollczi.litecommands.fabric.LiteFabricFactory; +import dev.rollczi.litecommands.luckperms.LuckPermsResolver; import net.fabricmc.api.DedicatedServerModInitializer; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.command.ServerCommandSource; public class ServerExampleFabric implements DedicatedServerModInitializer { @Override public void onInitializeServer() { LiteFabricFactory.server() - .commands(new ExampleCommand()) - .build(); + .settings(settings -> + settings.permissionResolver( + new LuckPermsResolver<>(source -> { + if (source instanceof ServerCommandSource && ((ServerCommandSource) source).isExecutedByPlayer()) { + return ((ServerCommandSource) source).getPlayer().getUuid(); + } else if (source instanceof ServerCommandSource && ((ServerCommandSource) source).output instanceof MinecraftServer) { + return LuckPermsResolver.CONSOLE; + } + return null; + }) + ) + ) + .commands(new ExampleCommand()) + .build(); } } diff --git a/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/command/ExampleCommand.java b/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/command/ExampleCommand.java index 04c313072..a132f75b8 100644 --- a/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/command/ExampleCommand.java +++ b/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/command/ExampleCommand.java @@ -3,11 +3,14 @@ import dev.rollczi.litecommands.annotations.argument.Arg; import dev.rollczi.litecommands.annotations.async.Async; import dev.rollczi.litecommands.annotations.command.Command; +import dev.rollczi.litecommands.annotations.context.Sender; import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.join.Join; import dev.rollczi.litecommands.annotations.quoted.Quoted; +import dev.rollczi.litecommands.platform.PlatformSender; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; +import org.jetbrains.annotations.ApiStatus; @Command(name = "example", aliases = "tutorial") public class ExampleCommand { @@ -31,4 +34,11 @@ String thread1() { String thread2() { return Thread.currentThread().getName(); } + + @Execute(name = "testPermission") + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "3.12.0") + String testPermission(@Sender PlatformSender sender, @Arg String permission) { + return permission + ": " + sender.hasPermission(permission); + } } diff --git a/examples/fabric/src/main/resources/fabric.mod.json b/examples/fabric/src/main/resources/fabric.mod.json index 6ec29ecac..5220e615f 100644 --- a/examples/fabric/src/main/resources/fabric.mod.json +++ b/examples/fabric/src/main/resources/fabric.mod.json @@ -21,5 +21,9 @@ "client": [ "dev.rollczi.example.fabric.client.ClientExampleFabric" ] - } + }, + "depends": { + "luckperms": "*" + }, + "accessWidener": "litecommands-example.accesswidener" } \ No newline at end of file diff --git a/examples/fabric/src/main/resources/litecommands-example.accesswidener b/examples/fabric/src/main/resources/litecommands-example.accesswidener new file mode 100644 index 000000000..9e7e5b5a5 --- /dev/null +++ b/examples/fabric/src/main/resources/litecommands-example.accesswidener @@ -0,0 +1,3 @@ +accessWidener v1 named + +accessible field net/minecraft/server/command/ServerCommandSource output Lnet/minecraft/server/command/CommandOutput; \ No newline at end of file diff --git a/litecommands-luckperms/build.gradle.kts b/litecommands-luckperms/build.gradle.kts new file mode 100644 index 000000000..ccbb8096b --- /dev/null +++ b/litecommands-luckperms/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + `litecommands-java` + `litecommands-java-8` + `litecommands-repositories` + `litecommands-publish` +} + +dependencies { + api(project(":litecommands-core")) + + compileOnly("net.luckperms:api:${Versions.LUCKPERMS_API}") +} + +litecommandsPublish { + artifactId = "litecommands-luckperms" +} \ No newline at end of file diff --git a/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsResolver.java b/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsResolver.java new file mode 100644 index 000000000..49310cd57 --- /dev/null +++ b/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsResolver.java @@ -0,0 +1,49 @@ +package dev.rollczi.litecommands.luckperms; + +import dev.rollczi.litecommands.settings.PermissionResolver; +import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.model.user.User; +import net.luckperms.api.model.user.UserManager; +import net.luckperms.api.query.QueryOptions; + +import java.util.UUID; +import java.util.concurrent.ExecutionException; +import java.util.function.Function; +import java.util.function.Supplier; + +public class LuckPermsResolver implements PermissionResolver { + public static final UUID CONSOLE = new UUID(0, 0); + + private final Function uuidFunction; + private final Supplier getUserManager = () -> LuckPermsProvider.get().getUserManager(); + + public LuckPermsResolver(Function uuidFunction) { + this.uuidFunction = uuidFunction; + } + + @Override + public boolean hasPermission(SENDER sender, String permission) { + UUID uuid = uuidFunction.apply(sender); + if (uuid == null) { + return false; + } + if (CONSOLE.equals(uuid)) { + return true; + } + User user; + UserManager userManager = this.getUserManager.get(); + if (userManager.isLoaded(uuid)) { + user = userManager.getUser(uuid); + } else { + try { + user = userManager.loadUser(uuid).get(); + } catch (InterruptedException | ExecutionException e) { + return false; + } + } + if (user == null) { + return false; + } + return user.getCachedData().getPermissionData(QueryOptions.nonContextual()).checkPermission(permission).asBoolean(); + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 4de090e8c..331a00fb5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -28,6 +28,7 @@ include(":litecommands-adventure") include(":litecommands-adventure-platform", tests = false) include(":litecommands-chatgpt", VERSION_11) include(":litecommands-jakarta", VERSION_11) +include(":litecommands-luckperms") // platforms include(":litecommands-velocity", VERSION_11, tests = false) From 6b5f634a59423bbb107482a382d4411f5d824578 Mon Sep 17 00:00:00 2001 From: Rollczi Date: Sat, 15 Feb 2025 18:57:59 +0100 Subject: [PATCH 3/5] wip --- .../litecommands/platform/PlatformSender.java | 2 +- .../litecommands/luckperms/LuckPermsResolver.java | 14 ++++---------- litecommands-minecraft/build.gradle.kts | 15 +++++++++++++++ .../litecommands/minecraft/MinecraftSender.java | 4 ++++ .../minecraft/permission/PermissionService.java | 10 ++++++++++ settings.gradle.kts | 6 ++++-- 6 files changed, 38 insertions(+), 13 deletions(-) create mode 100644 litecommands-minecraft/build.gradle.kts create mode 100644 litecommands-minecraft/src/dev/rollczi/litecommands/minecraft/MinecraftSender.java create mode 100644 litecommands-minecraft/src/dev/rollczi/litecommands/minecraft/permission/PermissionService.java diff --git a/litecommands-core/src/dev/rollczi/litecommands/platform/PlatformSender.java b/litecommands-core/src/dev/rollczi/litecommands/platform/PlatformSender.java index b21b5631f..340144f3e 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/platform/PlatformSender.java +++ b/litecommands-core/src/dev/rollczi/litecommands/platform/PlatformSender.java @@ -28,7 +28,7 @@ public interface PlatformSender { * Use {@link Invocation#sender()} instead and check permissions. */ @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "3.12.0") + @ApiStatus.ScheduledForRemoval(inVersion = "3.10.0") boolean hasPermission(String permission); T getProperty(MetaKey key); diff --git a/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsResolver.java b/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsResolver.java index 49310cd57..de0e46e5c 100644 --- a/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsResolver.java +++ b/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsResolver.java @@ -30,17 +30,11 @@ public boolean hasPermission(SENDER sender, String permission) { if (CONSOLE.equals(uuid)) { return true; } - User user; + UserManager userManager = this.getUserManager.get(); - if (userManager.isLoaded(uuid)) { - user = userManager.getUser(uuid); - } else { - try { - user = userManager.loadUser(uuid).get(); - } catch (InterruptedException | ExecutionException e) { - return false; - } - } + User user = userManager.isLoaded(uuid) + ? userManager.getUser(uuid) + : userManager.loadUser(uuid); if (user == null) { return false; } diff --git a/litecommands-minecraft/build.gradle.kts b/litecommands-minecraft/build.gradle.kts new file mode 100644 index 000000000..737cfb214 --- /dev/null +++ b/litecommands-minecraft/build.gradle.kts @@ -0,0 +1,15 @@ +plugins { + `litecommands-java` + `litecommands-java-8` + `litecommands-unit-test` + `litecommands-repositories` + `litecommands-publish` +} + +dependencies { + api(project(":litecommands-framework")) +} + +litecommandsPublish { + artifactId = "litecommands-minecraft" +} \ No newline at end of file diff --git a/litecommands-minecraft/src/dev/rollczi/litecommands/minecraft/MinecraftSender.java b/litecommands-minecraft/src/dev/rollczi/litecommands/minecraft/MinecraftSender.java new file mode 100644 index 000000000..cd7e8613f --- /dev/null +++ b/litecommands-minecraft/src/dev/rollczi/litecommands/minecraft/MinecraftSender.java @@ -0,0 +1,4 @@ +package dev.rollczi.litecommands.minecraft; + +public interface MinecraftSender { +} diff --git a/litecommands-minecraft/src/dev/rollczi/litecommands/minecraft/permission/PermissionService.java b/litecommands-minecraft/src/dev/rollczi/litecommands/minecraft/permission/PermissionService.java new file mode 100644 index 000000000..2b55fafcd --- /dev/null +++ b/litecommands-minecraft/src/dev/rollczi/litecommands/minecraft/permission/PermissionService.java @@ -0,0 +1,10 @@ +package dev.rollczi.litecommands.minecraft.permission; + +import dev.rollczi.litecommands.platform.PlatformSender; +import java.util.concurrent.CompletableFuture; + +public interface PermissionService { + + CompletableFuture hasPermission(PlatformSender platformSender, SENDER sender, String permission); + +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 331a00fb5..fae9edcf1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -23,6 +23,8 @@ include(":litecommands-programmatic") include(":litecommands-framework") include(":litecommands-unit") +include(":litecommands-minecraft") + // extensions include(":litecommands-adventure") include(":litecommands-adventure-platform", tests = false) @@ -50,9 +52,9 @@ include(":examples:sponge", VERSION_21, tests = false) include(":examples:velocity", VERSION_11, tests = false) fun include(project: String, java: JavaVersion = VERSION_1_8, tests: Boolean = true) { - compatibleWith("including $project", java, tests, { + compatibleWith("including $project", java, tests) { settings.include(project) - }) + } } fun compatibleWith(action: String, java: JavaVersion, tests: Boolean = true, block: () -> Unit) { From 6856db4e3fa9fdb5d283536de74ce7186422ebe8 Mon Sep 17 00:00:00 2001 From: Rollczi Date: Wed, 26 Feb 2025 18:21:55 +0100 Subject: [PATCH 4/5] More changes --- .../fabric/server/ServerExampleFabric.java | 25 +++--- .../fabric/server/command/ExampleCommand.java | 6 -- .../requirment/AnnotatedValidator.java | 1 + .../AnnotatedValidatorProcessor.java | 1 + .../RequirementAnnotatedValidatorImpl.java | 1 + .../litecommands/bukkit/BukkitCommand.java | 4 +- .../bukkit/BukkitPlatformSender.java | 13 ++- .../litecommands/bungee/BungeeCommand.java | 4 +- .../litecommands/bungee/BungeeSender.java | 4 +- .../litecommands/LiteCommandsInternal.java | 4 + .../argument/parser/ParseResult.java | 5 -- .../litecommands/command/CommandNode.java | 11 ++- .../executor/CommandExecuteResult.java | 2 +- .../executor/CommandExecuteService.java | 86 +++++-------------- .../event/AbstractCommandExecutorEvent.java | 70 --------------- .../event/CandidateExecutorFoundEvent.java | 14 --- .../event/CandidateExecutorMatchEvent.java | 22 ----- .../executor/event/CommandExecutorEvent.java | 4 +- .../event/CommandExecutorFoundEvent.java | 68 +++++++++++++++ .../event/CommandExecutorNotFoundEvent.java | 39 +++++++++ .../event/CommandPreExecutionEvent.java | 36 +++++++- .../command/executor/flow/ExecuteFlow.java | 26 ------ .../executor/flow/ExecuteFlowEvent.java | 19 ---- .../cooldown/CooldownContext.java | 10 +++ .../cooldown/CooldownService.java | 14 +-- .../cooldown/CooldownStateController.java | 2 +- .../event/SimpleEventPublisher.java | 6 +- .../dev/rollczi/litecommands/flow/Flow.java | 4 +- .../rollczi/litecommands/flow/FlowImpl.java | 4 - .../litecommands/identifier/Identifier.java | 2 +- .../litecommands/invocation/Invocation.java | 9 +- .../dev/rollczi/litecommands/meta/Meta.java | 2 + .../rollczi/litecommands/meta/MetaHolder.java | 4 + .../litecommands/meta/MetaHolderImpl.java | 23 +++++ .../permission/MissingPermissions.java | 3 +- ...pl.java => PermissionDefaultResolver.java} | 36 ++++---- .../PermissionExecutionController.java | 41 +++++++++ .../permission/PermissionResolver.java | 21 +++++ .../permission/PermissionService.java | 21 +++++ .../permission/PermissionServiceImpl.java | 32 +++++++ .../PermissionSuggestionController.java | 24 ++++++ .../PermissionValidationService.java | 10 --- .../permission/PermissionValidator.java | 26 ------ .../event/PermissionValidationEvent.java | 35 -------- .../platform/PlatformReceiver.java | 2 +- .../litecommands/platform/PlatformSender.java | 15 +--- .../requirement/RequirementMatchService.java | 4 +- .../schematic/SchematicFastGenerator.java | 11 ++- .../schematic/SchematicGenerator.java | 8 -- .../schematic/SimpleSchematicGenerator.java | 11 ++- .../settings/PermissionResolver.java | 8 -- .../litecommands/shared/FailedReason.java | 29 ++----- .../litecommands/shared/Preconditions.java | 12 +++ .../suggestion/SuggestionService.java | 25 +++--- .../event/SuggestionCommandRouteEvent.java | 39 +++++++++ .../suggestion/event/SuggestionEvent.java | 6 ++ .../event/SuggestionExecutorEvent.java | 39 +++++++++ .../suggestion/event/SuggestionNodeEvent.java | 17 ++++ .../litecommands/validator/Validator.java | 1 + .../ValidatorExecutionController.java | 29 ------- .../ValidatorExecutorController.java | 43 ++++++++++ .../validator/ValidatorResult.java | 1 + .../validator/ValidatorScope.java | 1 + .../validator/ValidatorService.java | 1 + .../requirement/RequirementValidator.java | 1 + .../permission/PermissionValidatorTest.java | 14 +-- .../schematic/SchematicFastGeneratorTest.java | 17 +--- .../schematic/SchematicGeneratorTest.java | 17 +--- .../litecommands/fabric/FabricCommand.java | 4 +- .../fabric/LiteFabricSettings.java | 11 --- .../fabric/client/FabricClientPlatform.java | 4 +- .../fabric/client/FabricClientSender.java | 10 +-- .../fabric/server/FabricServerPlatform.java | 4 +- .../fabric/server/FabricServerSender.java | 13 ++- .../litecommands/LiteCommandsBaseBuilder.java | 30 +++++-- .../litecommands/LiteCommandsBuilder.java | 29 ++----- .../litecommands/LiteCommandsFactory.java | 17 ++-- .../jda/JDACommandTranslator.java | 1 - .../litecommands/jda/JDAPlatformSender.java | 5 +- .../luckperms/LuckPermsPermissionFactory.java | 74 ++++++++++++++++ .../luckperms/LuckPermsResolver.java | 43 ---------- .../minestom/LiteMinestomSettings.java | 14 --- .../minestom/MinestomCommand.java | 2 +- .../minestom/MinestomPlatform.java | 2 +- .../litecommands/minestom/MinestomSender.java | 15 ++-- .../litecommands/sponge/SpongeCommand.java | 4 +- .../litecommands/sponge/SpongeSender.java | 5 +- .../litecommands/unit/AssertSuggest.java | 2 +- .../unit/LiteCommandsTestFactory.java | 5 ++ .../litecommands/unit/TestPlatform.java | 10 +-- .../litecommands/unit/TestPlatformSender.java | 24 ++++-- .../rollczi/litecommands/unit/TestUtil.java | 29 ++++++- .../unit/annotations/LiteTestSpec.java | 6 ++ 93 files changed, 832 insertions(+), 676 deletions(-) delete mode 100644 litecommands-core/src/dev/rollczi/litecommands/command/executor/event/AbstractCommandExecutorEvent.java delete mode 100644 litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CandidateExecutorFoundEvent.java delete mode 100644 litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CandidateExecutorMatchEvent.java create mode 100644 litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandExecutorFoundEvent.java create mode 100644 litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandExecutorNotFoundEvent.java delete mode 100644 litecommands-core/src/dev/rollczi/litecommands/command/executor/flow/ExecuteFlow.java delete mode 100644 litecommands-core/src/dev/rollczi/litecommands/command/executor/flow/ExecuteFlowEvent.java create mode 100644 litecommands-core/src/dev/rollczi/litecommands/meta/MetaHolderImpl.java rename litecommands-core/src/dev/rollczi/litecommands/permission/{PermissionValidationServiceImpl.java => PermissionDefaultResolver.java} (54%) create mode 100644 litecommands-core/src/dev/rollczi/litecommands/permission/PermissionExecutionController.java create mode 100644 litecommands-core/src/dev/rollczi/litecommands/permission/PermissionResolver.java create mode 100644 litecommands-core/src/dev/rollczi/litecommands/permission/PermissionService.java create mode 100644 litecommands-core/src/dev/rollczi/litecommands/permission/PermissionServiceImpl.java create mode 100644 litecommands-core/src/dev/rollczi/litecommands/permission/PermissionSuggestionController.java delete mode 100644 litecommands-core/src/dev/rollczi/litecommands/permission/PermissionValidationService.java delete mode 100644 litecommands-core/src/dev/rollczi/litecommands/permission/PermissionValidator.java delete mode 100644 litecommands-core/src/dev/rollczi/litecommands/permission/event/PermissionValidationEvent.java delete mode 100644 litecommands-core/src/dev/rollczi/litecommands/settings/PermissionResolver.java create mode 100644 litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionCommandRouteEvent.java create mode 100644 litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionEvent.java create mode 100644 litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionExecutorEvent.java create mode 100644 litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionNodeEvent.java delete mode 100644 litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorExecutionController.java create mode 100644 litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorExecutorController.java create mode 100644 litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsPermissionFactory.java delete mode 100644 litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsResolver.java diff --git a/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/ServerExampleFabric.java b/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/ServerExampleFabric.java index 7fc10dd83..983e1ccd0 100644 --- a/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/ServerExampleFabric.java +++ b/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/ServerExampleFabric.java @@ -2,7 +2,7 @@ import dev.rollczi.example.fabric.server.command.ExampleCommand; import dev.rollczi.litecommands.fabric.LiteFabricFactory; -import dev.rollczi.litecommands.luckperms.LuckPermsResolver; +import dev.rollczi.litecommands.luckperms.LuckPermsPermissionFactory; import net.fabricmc.api.DedicatedServerModInitializer; import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; @@ -11,18 +11,17 @@ public class ServerExampleFabric implements DedicatedServerModInitializer { @Override public void onInitializeServer() { LiteFabricFactory.server() - .settings(settings -> - settings.permissionResolver( - new LuckPermsResolver<>(source -> { - if (source instanceof ServerCommandSource && ((ServerCommandSource) source).isExecutedByPlayer()) { - return ((ServerCommandSource) source).getPlayer().getUuid(); - } else if (source instanceof ServerCommandSource && ((ServerCommandSource) source).output instanceof MinecraftServer) { - return LuckPermsResolver.CONSOLE; - } - return null; - }) - ) - ) + .permissionResolver(LuckPermsPermissionFactory.create(ServerCommandSource.class, (sender) -> { + if (sender.isExecutedByPlayer()) { + return sender.getPlayer().getUuid(); + } + + if (sender.output instanceof MinecraftServer) { + return LuckPermsPermissionFactory.CONSOLE; + } + + return null; + })) .commands(new ExampleCommand()) .build(); } diff --git a/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/command/ExampleCommand.java b/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/command/ExampleCommand.java index a132f75b8..cb808e5f1 100644 --- a/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/command/ExampleCommand.java +++ b/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/command/ExampleCommand.java @@ -35,10 +35,4 @@ String thread2() { return Thread.currentThread().getName(); } - @Execute(name = "testPermission") - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "3.12.0") - String testPermission(@Sender PlatformSender sender, @Arg String permission) { - return permission + ": " + sender.hasPermission(permission); - } } diff --git a/litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/AnnotatedValidator.java b/litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/AnnotatedValidator.java index f385883f6..7e379cce4 100644 --- a/litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/AnnotatedValidator.java +++ b/litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/AnnotatedValidator.java @@ -7,6 +7,7 @@ import java.lang.annotation.Annotation; +@Deprecated @FunctionalInterface public interface AnnotatedValidator { diff --git a/litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/AnnotatedValidatorProcessor.java b/litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/AnnotatedValidatorProcessor.java index 59ea49aa4..75b58257e 100644 --- a/litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/AnnotatedValidatorProcessor.java +++ b/litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/AnnotatedValidatorProcessor.java @@ -6,6 +6,7 @@ import java.lang.annotation.Annotation; +@Deprecated public class AnnotatedValidatorProcessor implements AnnotationProcessor { private final Class annotationClass; diff --git a/litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/RequirementAnnotatedValidatorImpl.java b/litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/RequirementAnnotatedValidatorImpl.java index 0c8edc4ea..8e713e422 100644 --- a/litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/RequirementAnnotatedValidatorImpl.java +++ b/litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/RequirementAnnotatedValidatorImpl.java @@ -8,6 +8,7 @@ import java.lang.annotation.Annotation; +@Deprecated class RequirementAnnotatedValidatorImpl implements RequirementValidator { private final AnnotatedValidator validator; diff --git a/litecommands-bukkit/src/dev/rollczi/litecommands/bukkit/BukkitCommand.java b/litecommands-bukkit/src/dev/rollczi/litecommands/bukkit/BukkitCommand.java index fd0373f39..fa0d3887e 100644 --- a/litecommands-bukkit/src/dev/rollczi/litecommands/bukkit/BukkitCommand.java +++ b/litecommands-bukkit/src/dev/rollczi/litecommands/bukkit/BukkitCommand.java @@ -50,7 +50,7 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String alias, Str ParseableInput input = ParseableInput.raw(args); PlatformSender platformSender = new BukkitPlatformSender(sender); - this.invocationHook.execute(new Invocation<>(sender, platformSender, commandRoute.getName(), alias, input), input); + this.invocationHook.execute(new Invocation<>(platformSender, commandRoute.getName(), alias, input), input); return true; } @@ -83,7 +83,7 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String alias, Str public CompletableFuture> suggest(CommandSender sender, String alias, String[] args) { SuggestionInput input = SuggestionInput.raw(args); PlatformSender platformSender = new BukkitPlatformSender(sender); - Invocation invocation = new Invocation<>(sender, platformSender, commandRoute.getName(), alias, input); + Invocation invocation = new Invocation<>(platformSender, commandRoute.getName(), alias, input); return CompletableFuture.completedFuture(this.suggestionHook.suggest(invocation, input).getSuggestions()); // TODO Run suggestion asynchronously inside LiteCommands platform } diff --git a/litecommands-bukkit/src/dev/rollczi/litecommands/bukkit/BukkitPlatformSender.java b/litecommands-bukkit/src/dev/rollczi/litecommands/bukkit/BukkitPlatformSender.java index 475616c6f..7fd076de4 100644 --- a/litecommands-bukkit/src/dev/rollczi/litecommands/bukkit/BukkitPlatformSender.java +++ b/litecommands-bukkit/src/dev/rollczi/litecommands/bukkit/BukkitPlatformSender.java @@ -15,11 +15,6 @@ public BukkitPlatformSender(CommandSender handle) { this.handle = handle; } - @Override - public boolean hasPermission(String permission) { - return this.handle.hasPermission(permission); - } - @Override public String getName() { return this.handle.getName(); @@ -49,9 +44,13 @@ public Identifier getIdentifier() { } @Override - public Comparable sendMessage(String message) { + public Object getHandle() { + return this.handle; + } + + @Override + public void sendMessage(String message) { this.handle.sendMessage(message); - return null; } } diff --git a/litecommands-bungee/src/dev/rollczi/litecommands/bungee/BungeeCommand.java b/litecommands-bungee/src/dev/rollczi/litecommands/bungee/BungeeCommand.java index ac799ac88..01cf66527 100644 --- a/litecommands-bungee/src/dev/rollczi/litecommands/bungee/BungeeCommand.java +++ b/litecommands-bungee/src/dev/rollczi/litecommands/bungee/BungeeCommand.java @@ -35,7 +35,7 @@ public BungeeCommand(LiteBungeeSettings settings, CommandRoute co public void execute(CommandSender sender, String[] args) { ParseableInput input = ParseableInput.raw(args); BungeeSender platformSender = new BungeeSender(sender); - Invocation invocation = new Invocation<>(sender, platformSender, this.commandSection.getName(), this.label, input); + Invocation invocation = new Invocation<>(platformSender, this.commandSection.getName(), this.label, input); this.executeListener.execute(invocation, input); } @@ -44,7 +44,7 @@ public void execute(CommandSender sender, String[] args) { public Iterable onTabComplete(CommandSender sender, String[] args) { SuggestionInput input = SuggestionInput.raw(args); BungeeSender platformSender = new BungeeSender(sender); - Invocation invocation = new Invocation<>(sender, platformSender, this.commandSection.getName(), this.label, input); + Invocation invocation = new Invocation<>(platformSender, this.commandSection.getName(), this.label, input); return this.suggestionListener.suggest(invocation, input) .asMultiLevelList(); diff --git a/litecommands-bungee/src/dev/rollczi/litecommands/bungee/BungeeSender.java b/litecommands-bungee/src/dev/rollczi/litecommands/bungee/BungeeSender.java index 4a59cdd8c..53e2552ac 100644 --- a/litecommands-bungee/src/dev/rollczi/litecommands/bungee/BungeeSender.java +++ b/litecommands-bungee/src/dev/rollczi/litecommands/bungee/BungeeSender.java @@ -37,8 +37,8 @@ public Identifier getIdentifier() { } @Override - public boolean hasPermission(String permission) { - return this.handle.hasPermission(permission); + public Object getHandle() { + return this.handle; } } diff --git a/litecommands-core/src/dev/rollczi/litecommands/LiteCommandsInternal.java b/litecommands-core/src/dev/rollczi/litecommands/LiteCommandsInternal.java index 7e575ba8b..08e905a5e 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/LiteCommandsInternal.java +++ b/litecommands-core/src/dev/rollczi/litecommands/LiteCommandsInternal.java @@ -9,6 +9,7 @@ import dev.rollczi.litecommands.command.builder.CommandBuilderCollector; import dev.rollczi.litecommands.editor.EditorService; import dev.rollczi.litecommands.message.MessageRegistry; +import dev.rollczi.litecommands.permission.PermissionService; import dev.rollczi.litecommands.platform.PlatformSettings; import dev.rollczi.litecommands.platform.Platform; import dev.rollczi.litecommands.scheduler.Scheduler; @@ -39,6 +40,9 @@ public interface LiteCommandsInternal { @ApiStatus.Internal EditorService getEditorService(); + @ApiStatus.Internal + PermissionService getPermissionService(); + @ApiStatus.Internal ValidatorService getValidatorService(); diff --git a/litecommands-core/src/dev/rollczi/litecommands/argument/parser/ParseResult.java b/litecommands-core/src/dev/rollczi/litecommands/argument/parser/ParseResult.java index d1e61d633..b547a486d 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/argument/parser/ParseResult.java +++ b/litecommands-core/src/dev/rollczi/litecommands/argument/parser/ParseResult.java @@ -50,11 +50,6 @@ static ParseCompletedResult failure(Object failedReason) { return new ParseCompletedResult<>(null, FailedReason.of(failedReason), false, Collections.emptyList()); } - @Deprecated - static ParseCompletedResult failure() { - return new ParseCompletedResult<>(null, FailedReason.empty(), false, Collections.emptyList()); - } - @ApiStatus.Experimental static ParseCompletedResult conditional(EXPECTED parsed, List conditions) { return new ParseCompletedResult<>(parsed, null, false, Collections.unmodifiableList(conditions)); diff --git a/litecommands-core/src/dev/rollczi/litecommands/command/CommandNode.java b/litecommands-core/src/dev/rollczi/litecommands/command/CommandNode.java index 486bf8126..b60e7f9f9 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/command/CommandNode.java +++ b/litecommands-core/src/dev/rollczi/litecommands/command/CommandNode.java @@ -1,12 +1,21 @@ package dev.rollczi.litecommands.command; +import dev.rollczi.litecommands.meta.MetaHolder; +import org.jetbrains.annotations.Nullable; + /** * CommandNode is an any node of the command tree. * @see CommandRoute * @see dev.rollczi.litecommands.command.executor.CommandExecutor */ -public interface CommandNode { +public interface CommandNode extends MetaHolder { CommandRoute getParent(); + @Override + @Nullable + default MetaHolder parentMeta() { + return getParent(); + } + } diff --git a/litecommands-core/src/dev/rollczi/litecommands/command/executor/CommandExecuteResult.java b/litecommands-core/src/dev/rollczi/litecommands/command/executor/CommandExecuteResult.java index 16705cd49..9d9b083a2 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/command/executor/CommandExecuteResult.java +++ b/litecommands-core/src/dev/rollczi/litecommands/command/executor/CommandExecuteResult.java @@ -81,7 +81,7 @@ public static CommandExecuteResult failed(CommandExecutor executor, FailedRea Preconditions.notNull(executor, "executor"); Preconditions.notNull(failedReason, "failed cannot be null"); - return new CommandExecuteResult(executor, null, null, failedReason.getReasonOr(null)); + return new CommandExecuteResult(executor, null, null, failedReason.getReason()); } } diff --git a/litecommands-core/src/dev/rollczi/litecommands/command/executor/CommandExecuteService.java b/litecommands-core/src/dev/rollczi/litecommands/command/executor/CommandExecuteService.java index 36e89f4c1..5a2db17c0 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/command/executor/CommandExecuteService.java +++ b/litecommands-core/src/dev/rollczi/litecommands/command/executor/CommandExecuteService.java @@ -3,25 +3,23 @@ import dev.rollczi.litecommands.LiteCommandsException; import dev.rollczi.litecommands.argument.parser.input.ParseableInputMatcher; import dev.rollczi.litecommands.command.CommandRoute; -import dev.rollczi.litecommands.command.executor.event.CandidateExecutorFoundEvent; -import dev.rollczi.litecommands.command.executor.event.CandidateExecutorMatchEvent; +import dev.rollczi.litecommands.command.executor.event.CommandExecutorFoundEvent; +import dev.rollczi.litecommands.command.executor.event.CommandExecutorNotFoundEvent; import dev.rollczi.litecommands.command.executor.event.CommandPostExecutionEvent; import dev.rollczi.litecommands.command.executor.event.CommandPreExecutionEvent; -import dev.rollczi.litecommands.command.executor.flow.ExecuteFlow; +import dev.rollczi.litecommands.invalidusage.InvalidUsage.Cause; import dev.rollczi.litecommands.invalidusage.InvalidUsageException; import dev.rollczi.litecommands.event.EventPublisher; import dev.rollczi.litecommands.handler.result.ResultHandleService; +import dev.rollczi.litecommands.priority.MutablePrioritizedList; +import dev.rollczi.litecommands.priority.PriorityLevel; import dev.rollczi.litecommands.requirement.RequirementMatchService; import dev.rollczi.litecommands.shared.FailedReason; -import dev.rollczi.litecommands.flow.Flow; -import dev.rollczi.litecommands.invalidusage.InvalidUsage; import dev.rollczi.litecommands.invocation.Invocation; import dev.rollczi.litecommands.meta.Meta; import dev.rollczi.litecommands.scheduler.Scheduler; import dev.rollczi.litecommands.scheduler.SchedulerPoll; -import dev.rollczi.litecommands.validator.ValidatorService; import java.util.Iterator; -import org.jetbrains.annotations.Nullable; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; @@ -30,20 +28,17 @@ public class CommandExecuteService { - private final ValidatorService validatorService; private final ResultHandleService resultResolver; private final Scheduler scheduler; private final RequirementMatchService requirementMatchService; private final EventPublisher publisher; public CommandExecuteService( - ValidatorService validatorService, ResultHandleService resultResolver, Scheduler scheduler, RequirementMatchService requirementMatchService, EventPublisher publisher ) { - this.validatorService = validatorService; this.resultResolver = resultResolver; this.scheduler = scheduler; this.requirementMatchService = requirementMatchService; @@ -92,7 +87,7 @@ private > CompletableFuture matcher, CommandRoute commandRoute ) { - return this.execute(commandRoute.getExecutors().iterator(), invocation, matcher, commandRoute, null); + return this.execute(commandRoute.getExecutors().iterator(), invocation, matcher, commandRoute, new MutablePrioritizedList<>()); } private > CompletableFuture execute( @@ -100,78 +95,43 @@ private > CompletableFuture invocation, ParseableInputMatcher matcher, CommandRoute commandRoute, - @Nullable FailedReason last + MutablePrioritizedList failedReasons ) { // Handle failed if (!executors.hasNext()) { - // Route valid - Flow validate = validatorService.validate(invocation, commandRoute); - if (validate.isTerminate() || validate.isStopCurrent()) { - return completedFuture(CommandExecuteResult.failed(validate.getReason())); - } // TODO: event (CommandExcutorNotFoundEvent) - - CommandExecutor executor = commandRoute.getExecutors().isEmpty() - ? null : - commandRoute.getExecutors().last(); - - if (last != null && last.hasResult()) { - return completedFuture(CommandExecuteResult.failed(executor, last)); + if (commandRoute.getExecutors().isEmpty()) { + failedReasons.add(FailedReason.of(Cause.UNKNOWN_COMMAND, PriorityLevel.LOW)); } - return completedFuture(CommandExecuteResult.failed(InvalidUsage.Cause.UNKNOWN_COMMAND)); + CommandExecutorNotFoundEvent event = publisher.publish(new CommandExecutorNotFoundEvent(invocation, commandRoute, failedReasons)); + + return completedFuture(CommandExecuteResult.failed(event.getFailedReason().getReason())); } CommandExecutor executor = executors.next(); - if (publisher.hasSubscribers(CandidateExecutorFoundEvent.class)) { - CandidateExecutorFoundEvent foundEvent = publisher.publish(new CandidateExecutorFoundEvent<>(invocation, executor)); - if (foundEvent.getFlow() == ExecuteFlow.STOP) { - return completedFuture(CommandExecuteResult.failed(executor, foundEvent.getFlowResult())); - } - - if (foundEvent.getFlow() == ExecuteFlow.SKIP) { - return this.execute(executors, invocation, matcher, commandRoute, FailedReason.max(foundEvent.getFlowResult(), last)); - } - } - // Handle matching arguments return this.requirementMatchService.match(executor, invocation, matcher.copy()).thenCompose(match -> { - if (publisher.hasSubscribers(CandidateExecutorMatchEvent.class)) { - CandidateExecutorMatchEvent matchEvent = publisher.publish(new CandidateExecutorMatchEvent<>(invocation, executor, match)); - if (matchEvent.getFlow() == ExecuteFlow.STOP) { - return completedFuture(CommandExecuteResult.failed(executor, matchEvent.getFlowResult())); - } - - if (matchEvent.getFlow() == ExecuteFlow.SKIP) { - return this.execute(executors, invocation, matcher, commandRoute, FailedReason.max(matchEvent.getFlowResult(), last)); - } + CommandExecutorFoundEvent matchEvent = publisher.publish(new CommandExecutorFoundEvent<>(invocation, executor, match)); + if (matchEvent.isCancelled()) { + return completedFuture(CommandExecuteResult.failed(executor, matchEvent.getCancelReason())); } - if (match.isFailed()) { - FailedReason current = match.getFailedReason(); - - if (current.hasResult()) { - return this.execute(executors, invocation, matcher, commandRoute, FailedReason.max(current, last)); - } - - return this.execute(executors, invocation, matcher, commandRoute, last); + CommandExecutorMatchResult processedMatch = matchEvent.getResult(); + if (processedMatch.isFailed()) { + failedReasons.add(processedMatch.getFailedReason()); + return this.execute(executors, invocation, matcher, commandRoute, failedReasons); } - if (publisher.hasSubscribers(CommandPreExecutionEvent.class)) { - CommandPreExecutionEvent executionEvent = publisher.publish(new CommandPreExecutionEvent<>(invocation, executor)); - if (executionEvent.getFlow() == ExecuteFlow.STOP) { - return completedFuture(CommandExecuteResult.failed(executor, executionEvent.getFlowResult())); - } - - if (executionEvent.getFlow() == ExecuteFlow.SKIP) { - return this.execute(executors, invocation, matcher, commandRoute, FailedReason.max(executionEvent.getFlowResult(), last)); - } + CommandPreExecutionEvent executionEvent = publisher.publish(new CommandPreExecutionEvent<>(invocation, executor)); + if (executionEvent.isCancelled()) { + return completedFuture(CommandExecuteResult.failed(executor, executionEvent.getCancelReason())); } // Execution SchedulerPoll type = executor.metaCollector().findFirst(Meta.POLL_TYPE); - return scheduler.supply(type, () -> execute(match, executor)); + return scheduler.supply(type, () -> execute(processedMatch, executor)); }).exceptionally(throwable -> toThrown(executor, throwable)); } diff --git a/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/AbstractCommandExecutorEvent.java b/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/AbstractCommandExecutorEvent.java deleted file mode 100644 index 9995f63f9..000000000 --- a/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/AbstractCommandExecutorEvent.java +++ /dev/null @@ -1,70 +0,0 @@ -package dev.rollczi.litecommands.command.executor.event; - -import dev.rollczi.litecommands.command.executor.CommandExecutor; -import dev.rollczi.litecommands.command.executor.flow.ExecuteFlow; -import dev.rollczi.litecommands.command.executor.flow.ExecuteFlowEvent; -import dev.rollczi.litecommands.event.Event; -import dev.rollczi.litecommands.invocation.Invocation; -import dev.rollczi.litecommands.shared.FailedReason; -import dev.rollczi.litecommands.shared.Preconditions; -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; - -@ApiStatus.Experimental -abstract class AbstractCommandExecutorEvent implements Event, CommandExecutorEvent, ExecuteFlowEvent { - - private final Invocation invocation; - private final CommandExecutor executor; - private ExecuteFlow flow = ExecuteFlow.CONTINUE; - private FailedReason cancelReason; - - protected AbstractCommandExecutorEvent(Invocation invocation, CommandExecutor executor) { - this.invocation = invocation; - this.executor = executor; - } - - @Override - public Invocation getInvocation() { - return invocation; - } - - @Override - public CommandExecutor getExecutor() { - return executor; - } - - @Override - public ExecuteFlow getFlow() { - return flow; - } - - @Override - public @Nullable FailedReason getFlowResult() { - if (this.flow == ExecuteFlow.CONTINUE) { - throw new IllegalStateException("Cannot get cancel reason when flow is not TERMINATE or SKIP"); - } - - return cancelReason; - } - - @Override - public void continueFlow() { - this.flow = ExecuteFlow.CONTINUE; - this.cancelReason = null; - } - - @Override - public void stopFlow(FailedReason reason) { - Preconditions.notNull(reason, "reason"); - this.flow = ExecuteFlow.STOP; - this.cancelReason = reason; - } - - @Override - public void skipFlow(FailedReason reason) { - Preconditions.notNull(reason, "reason"); - this.flow = ExecuteFlow.SKIP; - this.cancelReason = reason; - } - -} diff --git a/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CandidateExecutorFoundEvent.java b/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CandidateExecutorFoundEvent.java deleted file mode 100644 index 2845621dd..000000000 --- a/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CandidateExecutorFoundEvent.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.rollczi.litecommands.command.executor.event; - -import dev.rollczi.litecommands.command.executor.CommandExecutor; -import dev.rollczi.litecommands.invocation.Invocation; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Experimental -public class CandidateExecutorFoundEvent extends AbstractCommandExecutorEvent { - - public CandidateExecutorFoundEvent(Invocation invocation, CommandExecutor executor) { - super(invocation, executor); - } - -} diff --git a/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CandidateExecutorMatchEvent.java b/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CandidateExecutorMatchEvent.java deleted file mode 100644 index e61e95355..000000000 --- a/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CandidateExecutorMatchEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -package dev.rollczi.litecommands.command.executor.event; - -import dev.rollczi.litecommands.command.executor.CommandExecutor; -import dev.rollczi.litecommands.command.executor.CommandExecutorMatchResult; -import dev.rollczi.litecommands.invocation.Invocation; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Experimental -public class CandidateExecutorMatchEvent extends AbstractCommandExecutorEvent { - - private final CommandExecutorMatchResult matchResult; - - public CandidateExecutorMatchEvent(Invocation invocation, CommandExecutor executor, CommandExecutorMatchResult matchResult) { - super(invocation, executor); - this.matchResult = matchResult; - } - - public CommandExecutorMatchResult getMatchResult() { - return matchResult; - } - -} diff --git a/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandExecutorEvent.java b/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandExecutorEvent.java index ffc3f5ce8..1047f7e40 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandExecutorEvent.java +++ b/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandExecutorEvent.java @@ -8,8 +8,8 @@ /** * Represents an event fired when a command executor is executed. * Flow: - * - {@link CandidateExecutorFoundEvent} - * - {@link CandidateExecutorMatchEvent} + * - {@link CommandExecutorFoundEvent} + * - {@link CommandExecutorFoundEvent} * - {@link CommandPreExecutionEvent} * - {@link CommandPostExecutionEvent} */ diff --git a/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandExecutorFoundEvent.java b/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandExecutorFoundEvent.java new file mode 100644 index 000000000..93451afec --- /dev/null +++ b/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandExecutorFoundEvent.java @@ -0,0 +1,68 @@ +package dev.rollczi.litecommands.command.executor.event; + +import dev.rollczi.litecommands.command.executor.CommandExecutor; +import dev.rollczi.litecommands.command.executor.CommandExecutorMatchResult; +import dev.rollczi.litecommands.invocation.Invocation; +import dev.rollczi.litecommands.shared.FailedReason; +import dev.rollczi.litecommands.shared.Preconditions; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +@ApiStatus.Experimental +public class CommandExecutorFoundEvent implements CommandExecutorEvent { + + private final Invocation invocation; + private final CommandExecutor executor; + + private CommandExecutorMatchResult matchResult; + private @Nullable FailedReason cancelReason; + + public CommandExecutorFoundEvent(Invocation invocation, CommandExecutor executor, CommandExecutorMatchResult matchResult) { + this.matchResult = matchResult; + this.invocation = invocation; + this.executor = executor; + } + + @Override + public Invocation getInvocation() { + return invocation; + } + + @Override + public CommandExecutor getExecutor() { + return executor; + } + + public CommandExecutorMatchResult getResult() { + return matchResult; + } + + /** + * Will skip the execution of the command if the result is failed. + */ + public void setResult(CommandExecutorMatchResult result) { + Preconditions.notNull(result, "match result"); + this.matchResult = result; + } + + /** + * Will stop the execution of the command. + */ + public void cancel(FailedReason reason) { + Preconditions.notNull(reason, "cancel reason"); + this.cancelReason = reason; + } + + public void allow() { + this.cancelReason = null; + } + + public boolean isCancelled() { + return this.cancelReason != null; + } + + public @Nullable FailedReason getCancelReason() { + return cancelReason; + } + +} diff --git a/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandExecutorNotFoundEvent.java b/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandExecutorNotFoundEvent.java new file mode 100644 index 000000000..8ae8dd2f9 --- /dev/null +++ b/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandExecutorNotFoundEvent.java @@ -0,0 +1,39 @@ +package dev.rollczi.litecommands.command.executor.event; + +import dev.rollczi.litecommands.command.CommandRoute; +import dev.rollczi.litecommands.event.Event; +import dev.rollczi.litecommands.invocation.Invocation; +import dev.rollczi.litecommands.priority.MutablePrioritizedList; +import dev.rollczi.litecommands.shared.FailedReason; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Experimental +public class CommandExecutorNotFoundEvent implements Event { + + private final Invocation invocation; + private final CommandRoute commandRoute; + private final MutablePrioritizedList failedReasons; + + public CommandExecutorNotFoundEvent(Invocation invocation, CommandRoute commandRoute, MutablePrioritizedList failedReasons) { + this.invocation = invocation; + this.commandRoute = commandRoute; + this.failedReasons = failedReasons; + } + + public Invocation getInvocation() { + return invocation; + } + + public CommandRoute getCommandRoute() { + return commandRoute; + } + + public void setFailedReason(FailedReason reason) { + failedReasons.add(reason); + } + + public FailedReason getFailedReason() { + return failedReasons.first(); + } + +} diff --git a/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandPreExecutionEvent.java b/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandPreExecutionEvent.java index 7fde1e8c4..843d2d0d8 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandPreExecutionEvent.java +++ b/litecommands-core/src/dev/rollczi/litecommands/command/executor/event/CommandPreExecutionEvent.java @@ -2,13 +2,45 @@ import dev.rollczi.litecommands.command.executor.CommandExecutor; import dev.rollczi.litecommands.invocation.Invocation; +import dev.rollczi.litecommands.shared.FailedReason; import org.jetbrains.annotations.ApiStatus; @ApiStatus.Experimental -public class CommandPreExecutionEvent extends AbstractCommandExecutorEvent implements CommandExecutorEvent { +public class CommandPreExecutionEvent implements CommandExecutorEvent { + + private final Invocation invocation; + private final CommandExecutor executor; + private FailedReason cancelReason; public CommandPreExecutionEvent(Invocation invocation, CommandExecutor executor) { - super(invocation, executor); + this.invocation = invocation; + this.executor = executor; + } + + @Override + public Invocation getInvocation() { + return invocation; + } + + @Override + public CommandExecutor getExecutor() { + return executor; + } + + public void cancel(FailedReason reason) { + this.cancelReason = reason; + } + + public void allow() { + this.cancelReason = null; + } + + public boolean isCancelled() { + return this.cancelReason != null; + } + + public FailedReason getCancelReason() { + return this.cancelReason; } } diff --git a/litecommands-core/src/dev/rollczi/litecommands/command/executor/flow/ExecuteFlow.java b/litecommands-core/src/dev/rollczi/litecommands/command/executor/flow/ExecuteFlow.java deleted file mode 100644 index 8a0685963..000000000 --- a/litecommands-core/src/dev/rollczi/litecommands/command/executor/flow/ExecuteFlow.java +++ /dev/null @@ -1,26 +0,0 @@ -package dev.rollczi.litecommands.command.executor.flow; - -import org.jetbrains.annotations.ApiStatus; - -/** - * Represents the flow of the command execution. - */ -@ApiStatus.Experimental -public enum ExecuteFlow { - - /** - * Continue the flow. - */ - CONTINUE, - - /** - * Skip the flow and continue to the next one. - */ - SKIP, - - /** - * Terminate the flow. (Stop the execution) - */ - STOP, - -} diff --git a/litecommands-core/src/dev/rollczi/litecommands/command/executor/flow/ExecuteFlowEvent.java b/litecommands-core/src/dev/rollczi/litecommands/command/executor/flow/ExecuteFlowEvent.java deleted file mode 100644 index 49b774dfd..000000000 --- a/litecommands-core/src/dev/rollczi/litecommands/command/executor/flow/ExecuteFlowEvent.java +++ /dev/null @@ -1,19 +0,0 @@ -package dev.rollczi.litecommands.command.executor.flow; - -import dev.rollczi.litecommands.event.Event; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Experimental -public interface ExecuteFlowEvent extends Event { - - ExecuteFlow getFlow(); - - R getFlowResult(); - - void continueFlow(); - - void stopFlow(R result); - - void skipFlow(R result); - -} diff --git a/litecommands-core/src/dev/rollczi/litecommands/cooldown/CooldownContext.java b/litecommands-core/src/dev/rollczi/litecommands/cooldown/CooldownContext.java index b6a86a8d6..436461d4b 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/cooldown/CooldownContext.java +++ b/litecommands-core/src/dev/rollczi/litecommands/cooldown/CooldownContext.java @@ -1,5 +1,7 @@ package dev.rollczi.litecommands.cooldown; +import dev.rollczi.litecommands.meta.Meta; +import dev.rollczi.litecommands.permission.PermissionSet; import dev.rollczi.litecommands.util.StringUtil; import java.time.Duration; @@ -8,11 +10,15 @@ public class CooldownContext { private final String key; private final Duration duration; private final String bypassPermission; + private final Meta meta = Meta.create(); public CooldownContext(String key, Duration duration, String bypassPermission) { this.key = key; this.duration = duration; this.bypassPermission = bypassPermission; + this.meta.listEditor(Meta.PERMISSIONS) + .add(new PermissionSet(bypassPermission)) + .apply(); } public CooldownContext(String key, Duration duration) { @@ -31,4 +37,8 @@ public String getBypassPermission() { return bypassPermission; } + Meta getPermissions() { + return meta; + } + } diff --git a/litecommands-core/src/dev/rollczi/litecommands/cooldown/CooldownService.java b/litecommands-core/src/dev/rollczi/litecommands/cooldown/CooldownService.java index 06c3ff45d..8068dfa9d 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/cooldown/CooldownService.java +++ b/litecommands-core/src/dev/rollczi/litecommands/cooldown/CooldownService.java @@ -8,6 +8,7 @@ import dev.rollczi.litecommands.identifier.Identifier; import dev.rollczi.litecommands.invocation.Invocation; import dev.rollczi.litecommands.meta.Meta; +import dev.rollczi.litecommands.permission.PermissionService; import dev.rollczi.litecommands.platform.PlatformSender; import dev.rollczi.litecommands.scheduler.Scheduler; import dev.rollczi.litecommands.scheduler.SchedulerPoll; @@ -21,11 +22,13 @@ public class CooldownService { private final Scheduler scheduler; + private final PermissionService permissionService; private final EventPublisher publisher; private final Map cooldowns = new HashMap<>(); - public CooldownService(Scheduler scheduler, EventPublisher publisher) { + public CooldownService(Scheduler scheduler, PermissionService permissionService, EventPublisher publisher) { this.scheduler = scheduler; + this.permissionService = permissionService; this.publisher = publisher; } @@ -76,17 +79,16 @@ public boolean removeCooldown(String key, Identifier senderIdentifier) { } private Optional getOperativeContext(CommandExecutor executor, PlatformSender sender) { - CooldownContext cooldownContext = executor.metaCollector().findFirst(Meta.COOLDOWN, null); - if (cooldownContext == null) { + CooldownContext context = executor.metaCollector().findFirst(Meta.COOLDOWN, null); + if (context == null) { return Optional.empty(); } - String bypassPermission = cooldownContext.getBypassPermission(); - if (!bypassPermission.isEmpty() && sender.hasPermission(bypassPermission)) { + if (!context.getBypassPermission().isEmpty() && permissionService.isPermitted(sender, context.getPermissions())) { return Optional.empty(); } - return Optional.of(cooldownContext); + return Optional.of(context); } } diff --git a/litecommands-core/src/dev/rollczi/litecommands/cooldown/CooldownStateController.java b/litecommands-core/src/dev/rollczi/litecommands/cooldown/CooldownStateController.java index e36b71953..929f1b8a3 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/cooldown/CooldownStateController.java +++ b/litecommands-core/src/dev/rollczi/litecommands/cooldown/CooldownStateController.java @@ -25,7 +25,7 @@ public void onEvent(CommandPreExecutionEvent event) { Optional currentState = this.cooldownService.getCooldown(event.getExecutor(), sender); if (currentState.isPresent()) { - event.stopFlow(FailedReason.of(currentState.get())); + event.cancel(FailedReason.of(currentState.get())); } } diff --git a/litecommands-core/src/dev/rollczi/litecommands/event/SimpleEventPublisher.java b/litecommands-core/src/dev/rollczi/litecommands/event/SimpleEventPublisher.java index b643d8787..de22d77cf 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/event/SimpleEventPublisher.java +++ b/litecommands-core/src/dev/rollczi/litecommands/event/SimpleEventPublisher.java @@ -29,7 +29,7 @@ public SimpleEventPublisher(BindRegistry bindRegistry) { @Override public boolean hasSubscribers(Class eventClass) { for (Class type : extractSuperTypes(eventClass)) { - if (listeners.containsKey(eventClass)) { + if (listeners.containsKey(type)) { return true; } } @@ -73,10 +73,6 @@ public void subscribe(EventListener listener) { throw new IllegalArgumentException("First parameter in method " + declaredMethod.getName() + " in " + listenerClass.getName() + " must be a subclass of Event"); } - if (firstEventParameter.isInterface()) { - throw new IllegalArgumentException("First parameter in method " + declaredMethod.getName() + " in " + listenerClass.getName() + " cannot be an interface"); - } - Class[] bindClasses = new Class[declaredMethod.getParameterCount() - 1]; System.arraycopy(declaredMethod.getParameterTypes(), 1, bindClasses, 0, declaredMethod.getParameterCount() - 1); diff --git a/litecommands-core/src/dev/rollczi/litecommands/flow/Flow.java b/litecommands-core/src/dev/rollczi/litecommands/flow/Flow.java index bafa1f4bc..2b727bb69 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/flow/Flow.java +++ b/litecommands-core/src/dev/rollczi/litecommands/flow/Flow.java @@ -25,8 +25,6 @@ public interface Flow { FailedReason failedReason(); - boolean hasReason(); - /** * Flow status * CONTINUE - continue current flow @@ -40,7 +38,7 @@ enum Status { } static Flow continueFlow() { - return new FlowImpl(Status.CONTINUE, null); + return new FlowImpl(Status.CONTINUE, "NONE"); } static Flow stopCurrentFlow(Object reason) { diff --git a/litecommands-core/src/dev/rollczi/litecommands/flow/FlowImpl.java b/litecommands-core/src/dev/rollczi/litecommands/flow/FlowImpl.java index ddba57857..2d13dab41 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/flow/FlowImpl.java +++ b/litecommands-core/src/dev/rollczi/litecommands/flow/FlowImpl.java @@ -46,9 +46,5 @@ public FailedReason failedReason() { return failedReason; } - @Override - public boolean hasReason() { - return failedReason.hasResult(); - } } diff --git a/litecommands-core/src/dev/rollczi/litecommands/identifier/Identifier.java b/litecommands-core/src/dev/rollczi/litecommands/identifier/Identifier.java index 0f24b1cae..7236380bb 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/identifier/Identifier.java +++ b/litecommands-core/src/dev/rollczi/litecommands/identifier/Identifier.java @@ -6,7 +6,7 @@ public interface Identifier { - Identifier CONSOLE = of(new UUID(0, 0), 0, 0L); + Identifier CONSOLE = of(new UUID(0, 0)); Optional getIdentifier(Class type); diff --git a/litecommands-core/src/dev/rollczi/litecommands/invocation/Invocation.java b/litecommands-core/src/dev/rollczi/litecommands/invocation/Invocation.java index daf379b43..382b5ab95 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/invocation/Invocation.java +++ b/litecommands-core/src/dev/rollczi/litecommands/invocation/Invocation.java @@ -5,15 +5,13 @@ public class Invocation { - private final SENDER handle; private final PlatformSender platformSender; private final String command; private final String label; private final Input arguments; private final InvocationContext context; - public Invocation(SENDER handle, PlatformSender platformSender, String command, String label, Input input, InvocationContext context) { - this.handle = handle; + public Invocation(PlatformSender platformSender, String command, String label, Input input, InvocationContext context) { this.platformSender = platformSender; this.command = command; this.label = label; @@ -21,8 +19,7 @@ public Invocation(SENDER handle, PlatformSender platformSender, String command, this.context = context; } - public Invocation(SENDER handle, PlatformSender platformSender, String command, String label, Input input) { - this.handle = handle; + public Invocation(PlatformSender platformSender, String command, String label, Input input) { this.platformSender = platformSender; this.command = command; this.label = label; @@ -31,7 +28,7 @@ public Invocation(SENDER handle, PlatformSender platformSender, String command, } public SENDER sender() { - return this.handle; + return (SENDER) this.platformSender.getHandle(); } public PlatformSender platformSender() { diff --git a/litecommands-core/src/dev/rollczi/litecommands/meta/Meta.java b/litecommands-core/src/dev/rollczi/litecommands/meta/Meta.java index 502e42a39..f6603e8ed 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/meta/Meta.java +++ b/litecommands-core/src/dev/rollczi/litecommands/meta/Meta.java @@ -29,7 +29,9 @@ public interface Meta { @Deprecated MetaKey ARGUMENT_KEY = MetaKey.of("argument-key", ArgumentKey.class, ArgumentKey.of()); MetaKey> COMMAND_ORIGIN_TYPE = MetaKey.of("command-origin-class", MetaType.list(), Collections.emptyList()); + @Deprecated MetaKey>>> VALIDATORS = MetaKey.of("validators", MetaType.list(), Collections.emptyList()); + @Deprecated MetaKey>> REQUIREMENT_VALIDATORS = MetaKey.of("requirement-validators", MetaType.list(), Collections.emptyList()); MetaKey COOLDOWN = MetaKey.of("cooldown", CooldownContext.class); MetaKey STRICT_MODE = MetaKey.of("strict-mode", StrictMode.class, StrictMode.DEFAULT); diff --git a/litecommands-core/src/dev/rollczi/litecommands/meta/MetaHolder.java b/litecommands-core/src/dev/rollczi/litecommands/meta/MetaHolder.java index 47053deb7..fe3eb45e1 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/meta/MetaHolder.java +++ b/litecommands-core/src/dev/rollczi/litecommands/meta/MetaHolder.java @@ -17,4 +17,8 @@ static MetaHolder empty() { return MetaHolderEmptyImpl.INSTANCE; } + static MetaHolder of(Meta meta) { + return new MetaHolderImpl(meta); + } + } diff --git a/litecommands-core/src/dev/rollczi/litecommands/meta/MetaHolderImpl.java b/litecommands-core/src/dev/rollczi/litecommands/meta/MetaHolderImpl.java new file mode 100644 index 000000000..1d15ab12b --- /dev/null +++ b/litecommands-core/src/dev/rollczi/litecommands/meta/MetaHolderImpl.java @@ -0,0 +1,23 @@ +package dev.rollczi.litecommands.meta; + +import org.jetbrains.annotations.Nullable; + +public class MetaHolderImpl implements MetaHolder { + + private final Meta meta; + + public MetaHolderImpl(Meta meta) { + this.meta = meta; + } + + @Override + public Meta meta() { + return meta; + } + + @Override + public @Nullable MetaHolder parentMeta() { + return null; + } + +} diff --git a/litecommands-core/src/dev/rollczi/litecommands/permission/MissingPermissions.java b/litecommands-core/src/dev/rollczi/litecommands/permission/MissingPermissions.java index fae754793..bc7fe526f 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/permission/MissingPermissions.java +++ b/litecommands-core/src/dev/rollczi/litecommands/permission/MissingPermissions.java @@ -3,6 +3,7 @@ import dev.rollczi.litecommands.meta.MetaHolder; import dev.rollczi.litecommands.platform.PlatformSender; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -52,7 +53,7 @@ public boolean isMissing() { } public static MissingPermissions check(PlatformSender platformSender, MetaHolder metaHolder) { - return new MissingPermissions(PermissionValidationServiceImpl.check(platformSender, metaHolder)); + return new MissingPermissions(new ArrayList<>()); //TODO } public static MissingPermissions missing(String... permissions) { diff --git a/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionValidationServiceImpl.java b/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionDefaultResolver.java similarity index 54% rename from litecommands-core/src/dev/rollczi/litecommands/permission/PermissionValidationServiceImpl.java rename to litecommands-core/src/dev/rollczi/litecommands/permission/PermissionDefaultResolver.java index 5e35b3662..0d86e82df 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionValidationServiceImpl.java +++ b/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionDefaultResolver.java @@ -1,29 +1,35 @@ package dev.rollczi.litecommands.permission; -import dev.rollczi.litecommands.event.EventPublisher; import dev.rollczi.litecommands.meta.Meta; import dev.rollczi.litecommands.meta.MetaHolder; -import dev.rollczi.litecommands.permission.event.PermissionValidationEvent; import dev.rollczi.litecommands.platform.PlatformSender; import java.util.ArrayList; import java.util.List; +import java.util.function.BiPredicate; +import org.jetbrains.annotations.Nullable; -public class PermissionValidationServiceImpl implements PermissionValidationService { +public class PermissionDefaultResolver implements PermissionResolver { - private final EventPublisher publisher; + private final BiPredicate hasPermission; - public PermissionValidationServiceImpl(EventPublisher publisher) { - this.publisher = publisher; + public PermissionDefaultResolver(BiPredicate hasPermission) { + this.hasPermission = hasPermission; } - @Override - public PermissionValidationResult validate(MetaHolder metaHolder, PlatformSender sender) { - List checked = check(sender, metaHolder); - return publisher.publish(new PermissionValidationEvent(metaHolder, checked)); + public PermissionDefaultResolver(Class type, BiPredicate hasPermission) { + this.hasPermission = (sender, permission) -> { + Object handle = sender.getHandle(); + if (!type.isAssignableFrom(handle.getClass())) { + return false; + } + + return hasPermission.test(type.cast(handle), permission); + }; } - static List check(PlatformSender platformSender, MetaHolder metaHolder) { - MetaHolder current = metaHolder; + @Override + public List resolve(PlatformSender sender, MetaHolder metaHolder) { + @Nullable MetaHolder current = metaHolder; List results = new ArrayList<>(); while (current != null) { @@ -32,14 +38,14 @@ static List check(PlatformSender platformSen continue; } - results.add(checkCurrent(platformSender, current)); + results.add(checkCurrent(sender, current)); current = current.parentMeta(); } return results; } - private static PermissionValidationResult.Verdict checkCurrent(PlatformSender platformSender, MetaHolder current) { + private PermissionValidationResult.Verdict checkCurrent(PlatformSender sender, MetaHolder current) { List checks = new ArrayList<>(); for (PermissionSet permissionSet : current.meta().get(Meta.PERMISSIONS)) { List checked = new ArrayList<>(); @@ -48,7 +54,7 @@ private static PermissionValidationResult.Verdict checkCurrent(PlatformSender pl for (String permission : permissionSet.getPermissions()) { checked.add(permission); - if (!platformSender.hasPermission(permission)) { + if (!hasPermission.test(sender, permission)) { missing.add(permission); } } diff --git a/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionExecutionController.java b/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionExecutionController.java new file mode 100644 index 000000000..7327cee58 --- /dev/null +++ b/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionExecutionController.java @@ -0,0 +1,41 @@ +package dev.rollczi.litecommands.permission; + +import dev.rollczi.litecommands.command.executor.CommandExecutorMatchResult; +import dev.rollczi.litecommands.command.executor.event.CommandExecutorFoundEvent; +import dev.rollczi.litecommands.command.executor.event.CommandExecutorNotFoundEvent; +import dev.rollczi.litecommands.event.EventListener; +import dev.rollczi.litecommands.event.Subscriber; +import dev.rollczi.litecommands.priority.PriorityLevel; +import dev.rollczi.litecommands.shared.FailedReason; + +public class PermissionExecutionController implements EventListener { + + private final PermissionService permissionService; + + public PermissionExecutionController(PermissionService permissionService) { + this.permissionService = permissionService; + } + + @Subscriber + void onEvent(CommandExecutorFoundEvent event) { + MissingPermissions result = this.permissionService.validate(event.getInvocation().platformSender(), event.getExecutor()); + if (result.isPermitted()) { + return; + } + + boolean successful = event.getResult().isSuccessful(); + PriorityLevel priority = successful ? PriorityLevel.HIGH : PriorityLevel.NORMAL; + event.setResult(CommandExecutorMatchResult.failed(FailedReason.of(result, priority))); + } + + @Subscriber + void onEvent(CommandExecutorNotFoundEvent event) { + MissingPermissions result = this.permissionService.validate(event.getInvocation().platformSender(), event.getCommandRoute()); + if (result.isPermitted()) { + return; + } + + event.setFailedReason(FailedReason.of(result)); + } + +} diff --git a/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionResolver.java b/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionResolver.java new file mode 100644 index 000000000..f0124d8a8 --- /dev/null +++ b/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionResolver.java @@ -0,0 +1,21 @@ +package dev.rollczi.litecommands.permission; + +import dev.rollczi.litecommands.meta.MetaHolder; +import dev.rollczi.litecommands.platform.PlatformSender; +import java.util.List; +import java.util.function.BiPredicate; +import java.util.function.Predicate; + +public interface PermissionResolver { + + List resolve(PlatformSender sender, MetaHolder metaHolder); + + static PermissionResolver createDefault(Class type, BiPredicate hasPermission) { + return new PermissionDefaultResolver(type, hasPermission); + } + + static PermissionResolver createDefault(BiPredicate hasPermission) { + return new PermissionDefaultResolver(hasPermission); + } + +} diff --git a/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionService.java b/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionService.java new file mode 100644 index 000000000..1471e2003 --- /dev/null +++ b/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionService.java @@ -0,0 +1,21 @@ +package dev.rollczi.litecommands.permission; + +import dev.rollczi.litecommands.meta.Meta; +import dev.rollczi.litecommands.meta.MetaHolder; +import dev.rollczi.litecommands.platform.PlatformSender; + +public interface PermissionService { + + MissingPermissions validate(PlatformSender sender, MetaHolder metaHolder); + + MissingPermissions validate(PlatformSender sender, Meta meta); + + default boolean isPermitted(PlatformSender sender, MetaHolder metaHolder) { + return validate(sender, metaHolder).isPermitted(); + } + + default boolean isPermitted(PlatformSender sender, Meta meta) { + return validate(sender, meta).isPermitted(); + } + +} diff --git a/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionServiceImpl.java b/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionServiceImpl.java new file mode 100644 index 000000000..3ff7bc596 --- /dev/null +++ b/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionServiceImpl.java @@ -0,0 +1,32 @@ +package dev.rollczi.litecommands.permission; + +import dev.rollczi.litecommands.meta.Meta; +import dev.rollczi.litecommands.meta.MetaHolder; +import dev.rollczi.litecommands.platform.PlatformSender; + +public class PermissionServiceImpl implements PermissionService { + + private PermissionResolver permissionResolver = PermissionResolver.createDefault((sender, permission) -> false); + + public PermissionServiceImpl() { + } + + public PermissionServiceImpl(PermissionResolver permissionResolver) { + this.permissionResolver = permissionResolver; + } + + public void setPermissionResolver(PermissionResolver permissionResolver) { + this.permissionResolver = permissionResolver; + } + + @Override + public MissingPermissions validate(PlatformSender sender, MetaHolder metaHolder) { + return new MissingPermissions(permissionResolver.resolve(sender, metaHolder)); + } + + @Override + public MissingPermissions validate(PlatformSender sender, Meta meta) { + return new MissingPermissions(permissionResolver.resolve(sender, MetaHolder.of(meta))); + } + +} diff --git a/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionSuggestionController.java b/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionSuggestionController.java new file mode 100644 index 000000000..cf9ccfbd9 --- /dev/null +++ b/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionSuggestionController.java @@ -0,0 +1,24 @@ +package dev.rollczi.litecommands.permission; + +import dev.rollczi.litecommands.event.EventListener; +import dev.rollczi.litecommands.event.Subscriber; + +import dev.rollczi.litecommands.suggestion.event.SuggestionNodeEvent; + +public class PermissionSuggestionController implements EventListener { + + private final PermissionService permissionService; + + public PermissionSuggestionController(PermissionService permissionService) { + this.permissionService = permissionService; + } + + @Subscriber + void onSuggestion(SuggestionNodeEvent event) { + PermissionValidationResult validationResult = permissionService.validate(event.getInvocation().platformSender(), event.getNode()); + if (!validationResult.isPermitted()) { + event.setCancelled(true); + } + } + +} diff --git a/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionValidationService.java b/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionValidationService.java deleted file mode 100644 index 17e7360a4..000000000 --- a/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionValidationService.java +++ /dev/null @@ -1,10 +0,0 @@ -package dev.rollczi.litecommands.permission; - -import dev.rollczi.litecommands.meta.MetaHolder; -import dev.rollczi.litecommands.platform.PlatformSender; - -public interface PermissionValidationService { - - PermissionValidationResult validate(MetaHolder metaHolder, PlatformSender sender); - -} diff --git a/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionValidator.java b/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionValidator.java deleted file mode 100644 index 67c18de80..000000000 --- a/litecommands-core/src/dev/rollczi/litecommands/permission/PermissionValidator.java +++ /dev/null @@ -1,26 +0,0 @@ -package dev.rollczi.litecommands.permission; - -import dev.rollczi.litecommands.flow.Flow; -import dev.rollczi.litecommands.invocation.Invocation; -import dev.rollczi.litecommands.meta.MetaHolder; -import dev.rollczi.litecommands.validator.Validator; - -public class PermissionValidator implements Validator { - private final PermissionValidationService validator; - - public PermissionValidator(PermissionValidationService validator) { - this.validator = validator; - } - - @Override - public Flow validate(Invocation invocation, MetaHolder metaHolder) { - PermissionValidationResult result = this.validator.validate(metaHolder, invocation.platformSender()); - - if (!result.isPermitted()) { - return Flow.terminateFlow(new MissingPermissions(result.getVerdicts())); - } - - return Flow.continueFlow(); - } - -} diff --git a/litecommands-core/src/dev/rollczi/litecommands/permission/event/PermissionValidationEvent.java b/litecommands-core/src/dev/rollczi/litecommands/permission/event/PermissionValidationEvent.java deleted file mode 100644 index a75de891c..000000000 --- a/litecommands-core/src/dev/rollczi/litecommands/permission/event/PermissionValidationEvent.java +++ /dev/null @@ -1,35 +0,0 @@ -package dev.rollczi.litecommands.permission.event; - -import dev.rollczi.litecommands.event.Event; -import dev.rollczi.litecommands.meta.MetaHolder; -import dev.rollczi.litecommands.permission.PermissionValidationResult; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Experimental -public class PermissionValidationEvent implements Event, PermissionValidationResult { - - private final MetaHolder source; - private List verdicts; - - public PermissionValidationEvent(MetaHolder source, List verdicts) { - this.source = source; - this.verdicts = verdicts; - } - - public MetaHolder getSource() { - return source; - } - - @Override - public List getVerdicts() { - return Collections.unmodifiableList(verdicts); - } - - public void setVerdicts(List verdicts) { - this.verdicts = new ArrayList<>(verdicts); - } - -} diff --git a/litecommands-core/src/dev/rollczi/litecommands/platform/PlatformReceiver.java b/litecommands-core/src/dev/rollczi/litecommands/platform/PlatformReceiver.java index 897b63764..d4edc281c 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/platform/PlatformReceiver.java +++ b/litecommands-core/src/dev/rollczi/litecommands/platform/PlatformReceiver.java @@ -6,6 +6,6 @@ public interface PlatformReceiver { @ApiStatus.Experimental - Comparable sendMessage(String message); + void sendMessage(String message); } diff --git a/litecommands-core/src/dev/rollczi/litecommands/platform/PlatformSender.java b/litecommands-core/src/dev/rollczi/litecommands/platform/PlatformSender.java index 340144f3e..9575fe361 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/platform/PlatformSender.java +++ b/litecommands-core/src/dev/rollczi/litecommands/platform/PlatformSender.java @@ -17,19 +17,8 @@ public interface PlatformSender { Identifier getIdentifier(); - /** - * Checks if the user has a specific permission. - * - * @param permission the permission to check - * @return true if the user has the permission, false otherwise - * - * @deprecated This method is deprecated and should not be used anymore. - * It will be removed in future versions of LiteCommands. - * Use {@link Invocation#sender()} instead and check permissions. - */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "3.10.0") - boolean hasPermission(String permission); + @ApiStatus.Internal + Object getHandle(); T getProperty(MetaKey key); diff --git a/litecommands-core/src/dev/rollczi/litecommands/requirement/RequirementMatchService.java b/litecommands-core/src/dev/rollczi/litecommands/requirement/RequirementMatchService.java index bc9c9ee69..f21472e46 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/requirement/RequirementMatchService.java +++ b/litecommands-core/src/dev/rollczi/litecommands/requirement/RequirementMatchService.java @@ -84,6 +84,7 @@ private CompletableFuture match( Object success = requirementResult.getSuccess(); + // TODO remove START List> validators = requirement.meta().get(Meta.REQUIREMENT_VALIDATORS); for (RequirementValidator validator : validators) { @@ -93,6 +94,7 @@ private CompletableFuture match( return completedFuture(CommandExecutorMatchResult.failed(validatorResult.getInvalidResult())); } } + // TODO remove END Add event matches.add(toMatch(requirement, success)); return match(invocation, executor, matches, requirementIterator, matcher).thenApply(executorMatchResult -> { @@ -111,6 +113,7 @@ private CompletableFuture match( @SuppressWarnings("unchecked") + @Deprecated private ValidatorResult validateRequirement( Invocation invocation, CommandExecutor executor, @@ -124,7 +127,6 @@ private ValidatorResult validateRequirement( return casted.validate(invocation, executor, castedRequirement, value); } - @SuppressWarnings("unchecked") private , T> RequirementMatch toMatch(R requirement, T result) { return new RequirementMatch(requirement, result); } diff --git a/litecommands-core/src/dev/rollczi/litecommands/schematic/SchematicFastGenerator.java b/litecommands-core/src/dev/rollczi/litecommands/schematic/SchematicFastGenerator.java index c1cdf707e..15c712c9c 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/schematic/SchematicFastGenerator.java +++ b/litecommands-core/src/dev/rollczi/litecommands/schematic/SchematicFastGenerator.java @@ -3,11 +3,10 @@ import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.Parser; import dev.rollczi.litecommands.argument.parser.ParserRegistry; -import dev.rollczi.litecommands.argument.parser.ParserSet; import dev.rollczi.litecommands.command.CommandRoute; import dev.rollczi.litecommands.command.executor.CommandExecutor; +import dev.rollczi.litecommands.permission.PermissionService; import dev.rollczi.litecommands.range.Range; -import dev.rollczi.litecommands.validator.ValidatorService; import java.util.LinkedHashSet; import java.util.Set; import org.jetbrains.annotations.ApiStatus; @@ -18,12 +17,12 @@ public class SchematicFastGenerator implements SchematicGenerator validatorService; + protected final PermissionService permissionService; protected final ParserRegistry parserRegistry; - public SchematicFastGenerator(SchematicFastFormat fastFormat, ValidatorService validatorService, ParserRegistry parserRegistry) { + public SchematicFastGenerator(SchematicFastFormat fastFormat, PermissionService permissionService, ParserRegistry parserRegistry) { this.fastFormat = fastFormat; - this.validatorService = validatorService; + this.permissionService = permissionService; this.parserRegistry = parserRegistry; } @@ -96,7 +95,7 @@ protected String generateArgumentName(SchematicInput input, Argument } protected boolean isVisible(SchematicInput input, CommandExecutor executor) { - return validatorService.validate(input.getInvocation(), executor).isContinue(); + return permissionService.validate(input.getInvocation().platformSender(), executor).isPermitted(); } protected boolean isOptional(SchematicInput input, Argument argument) { diff --git a/litecommands-core/src/dev/rollczi/litecommands/schematic/SchematicGenerator.java b/litecommands-core/src/dev/rollczi/litecommands/schematic/SchematicGenerator.java index eef01b39b..8be5c4670 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/schematic/SchematicGenerator.java +++ b/litecommands-core/src/dev/rollczi/litecommands/schematic/SchematicGenerator.java @@ -1,15 +1,7 @@ package dev.rollczi.litecommands.schematic; -import dev.rollczi.litecommands.argument.parser.ParserRegistry; -import dev.rollczi.litecommands.validator.ValidatorService; - public interface SchematicGenerator { Schematic generate(SchematicInput schematicInput); - @Deprecated - static SchematicGenerator from(SchematicFormat format, ValidatorService validatorService, ParserRegistry parserRegistry) { - return new SimpleSchematicGenerator<>(format, validatorService, parserRegistry); - } - } diff --git a/litecommands-core/src/dev/rollczi/litecommands/schematic/SimpleSchematicGenerator.java b/litecommands-core/src/dev/rollczi/litecommands/schematic/SimpleSchematicGenerator.java index 2baf45a80..084a0676f 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/schematic/SimpleSchematicGenerator.java +++ b/litecommands-core/src/dev/rollczi/litecommands/schematic/SimpleSchematicGenerator.java @@ -3,11 +3,10 @@ import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.parser.Parser; import dev.rollczi.litecommands.argument.parser.ParserRegistry; -import dev.rollczi.litecommands.argument.parser.ParserSet; import dev.rollczi.litecommands.command.CommandRoute; import dev.rollczi.litecommands.command.executor.CommandExecutor; +import dev.rollczi.litecommands.permission.PermissionService; import dev.rollczi.litecommands.range.Range; -import dev.rollczi.litecommands.validator.ValidatorService; import java.util.List; import java.util.stream.Collectors; @@ -18,12 +17,12 @@ public class SimpleSchematicGenerator implements SchematicGenerator validatorService; + protected final PermissionService permissionService; protected final ParserRegistry parserRegistry; - public SimpleSchematicGenerator(SchematicFormat format, ValidatorService validatorService, ParserRegistry parserRegistry) { + public SimpleSchematicGenerator(SchematicFormat format, PermissionService permissionService, ParserRegistry parserRegistry) { this.format = format; - this.validatorService = validatorService; + this.permissionService = permissionService; this.parserRegistry = parserRegistry; } @@ -85,7 +84,7 @@ protected String generateArgumentName(SchematicInput input, Argument } protected boolean isVisible(SchematicInput input, CommandExecutor executor) { - return validatorService.validate(input.getInvocation(), executor).isContinue(); + return permissionService.validate(input.getInvocation().platformSender(), executor).isPermitted(); } protected boolean isOptional(SchematicInput input, Argument argument) { diff --git a/litecommands-core/src/dev/rollczi/litecommands/settings/PermissionResolver.java b/litecommands-core/src/dev/rollczi/litecommands/settings/PermissionResolver.java deleted file mode 100644 index 2c56f1017..000000000 --- a/litecommands-core/src/dev/rollczi/litecommands/settings/PermissionResolver.java +++ /dev/null @@ -1,8 +0,0 @@ -package dev.rollczi.litecommands.settings; - -@FunctionalInterface -public interface PermissionResolver { - - boolean hasPermission(SENDER sender, String permission); - -} diff --git a/litecommands-core/src/dev/rollczi/litecommands/shared/FailedReason.java b/litecommands-core/src/dev/rollczi/litecommands/shared/FailedReason.java index a62f4311c..4bc757d99 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/shared/FailedReason.java +++ b/litecommands-core/src/dev/rollczi/litecommands/shared/FailedReason.java @@ -3,36 +3,24 @@ import dev.rollczi.litecommands.priority.Prioritized; import dev.rollczi.litecommands.priority.PriorityLevel; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; public class FailedReason implements Prioritized { private final Object reason; - private final boolean isEmpty; private final PriorityLevel priorityLevel; - private FailedReason(Object reason, boolean isEmpty, PriorityLevel priorityLevel) { + private FailedReason(Object reason, PriorityLevel priorityLevel) { + Preconditions.notNull(reason, "reason"); + Preconditions.notNull(priorityLevel, "priority"); + Preconditions.isNotInstanceOf(reason, FailedReason.class, "reason"); this.reason = reason; - this.isEmpty = isEmpty; this.priorityLevel = priorityLevel; } public Object getReason() { - if (this.isEmpty) { - throw new IllegalStateException("Cannot get reason when it is empty"); - } - return this.reason; } - public @Nullable Object getReasonOr(Object defaultValue) { - return this.isEmpty ? defaultValue : this.reason; - } - - public boolean hasResult() { - return !this.isEmpty; - } - @Override public PriorityLevel getPriority() { return this.priorityLevel; @@ -44,17 +32,12 @@ public String toString() { } public static FailedReason of(Object reason) { - return new FailedReason(reason, false, PriorityLevel.NORMAL); + return new FailedReason(reason, PriorityLevel.NORMAL); } @ApiStatus.Experimental public static FailedReason of(Object reason, PriorityLevel priorityLevel) { - return new FailedReason(reason, false, priorityLevel); - } - - @Deprecated - public static FailedReason empty() { - return new FailedReason(null, true, PriorityLevel.LOW); + return new FailedReason(reason, priorityLevel); } @ApiStatus.Experimental diff --git a/litecommands-core/src/dev/rollczi/litecommands/shared/Preconditions.java b/litecommands-core/src/dev/rollczi/litecommands/shared/Preconditions.java index 9b9dafcac..9ef67d5e3 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/shared/Preconditions.java +++ b/litecommands-core/src/dev/rollczi/litecommands/shared/Preconditions.java @@ -56,4 +56,16 @@ public static void notContains(Iterable iterable, Object element, String name } } + public static void isInstanceOf(Object value, Class clazz, String name) { + if (!clazz.isInstance(value)) { + throw new IllegalArgumentException(name + " must be instance of " + clazz.getName()); + } + } + + public static void isNotInstanceOf(Object value, Class clazz, String name) { + if (clazz.isInstance(value)) { + throw new IllegalArgumentException(name + " cannot be instance of " + clazz.getName()); + } + } + } diff --git a/litecommands-core/src/dev/rollczi/litecommands/suggestion/SuggestionService.java b/litecommands-core/src/dev/rollczi/litecommands/suggestion/SuggestionService.java index d01827e55..d32c4504b 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/suggestion/SuggestionService.java +++ b/litecommands-core/src/dev/rollczi/litecommands/suggestion/SuggestionService.java @@ -9,8 +9,11 @@ import dev.rollczi.litecommands.argument.parser.ParserRegistry; import dev.rollczi.litecommands.command.executor.CommandExecutor; import dev.rollczi.litecommands.command.CommandRoute; +import dev.rollczi.litecommands.event.EventPublisher; import dev.rollczi.litecommands.flow.Flow; import dev.rollczi.litecommands.invocation.Invocation; +import dev.rollczi.litecommands.suggestion.event.SuggestionCommandRouteEvent; +import dev.rollczi.litecommands.suggestion.event.SuggestionExecutorEvent; import dev.rollczi.litecommands.util.StringUtil; import dev.rollczi.litecommands.validator.ValidatorService; @@ -18,12 +21,12 @@ public class SuggestionService { private final ParserRegistry parserRegistry; private final SuggesterRegistry suggesterRegistry; - private final ValidatorService validatorService; + private final EventPublisher publisher; - public SuggestionService(ParserRegistry parserRegistry, SuggesterRegistry suggesterRegistry, ValidatorService validatorService) { + public SuggestionService(ParserRegistry parserRegistry, SuggesterRegistry suggesterRegistry, ValidatorService validatorService, EventPublisher publisher) { this.parserRegistry = parserRegistry; this.suggesterRegistry = suggesterRegistry; - this.validatorService = validatorService; + this.publisher = publisher; } public SuggestionResult suggest( @@ -40,9 +43,9 @@ private > SuggestionResult sugge CommandRoute commandRoute ) { if (matcher.hasNoNextRouteAndArguments()) { - Flow flow = this.validatorService.validate(invocation, commandRoute); + SuggestionCommandRouteEvent event = this.publisher.publish(new SuggestionCommandRouteEvent(invocation, commandRoute)); - if (flow.isTerminate() || flow.isStopCurrent()) { + if (event.isCancelled()) { return SuggestionResult.empty(); } @@ -52,9 +55,9 @@ private > SuggestionResult sugge SuggestionResult all = SuggestionResult.empty(); for (CommandExecutor executor : commandRoute.getExecutors()) { - Flow flow = this.validatorService.validate(invocation, executor); + SuggestionExecutorEvent executorEvent = this.publisher.publish(new SuggestionExecutorEvent(invocation, executor)); - if (flow.isTerminate() || flow.isStopCurrent()) { + if (executorEvent.isCancelled()) { continue; } @@ -87,16 +90,16 @@ private > SuggestionResult sugge } private boolean isAnyExecutorValid(Invocation invocation, CommandRoute route) { - Flow flow = this.validatorService.validate(invocation, route); + SuggestionCommandRouteEvent event = this.publisher.publish(new SuggestionCommandRouteEvent(invocation, route)); - if (flow.isTerminate() || flow.isStopCurrent()) { + if (event.isCancelled()) { return false; } for (CommandExecutor executor : route.getExecutors()) { - Flow flowExecutor = this.validatorService.validate(invocation, executor); + SuggestionExecutorEvent executorEvent = this.publisher.publish(new SuggestionExecutorEvent(invocation, executor)); - if (flowExecutor.isTerminate() || flowExecutor.isStopCurrent()) { + if (executorEvent.isCancelled()) { continue; } diff --git a/litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionCommandRouteEvent.java b/litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionCommandRouteEvent.java new file mode 100644 index 000000000..e6b768c0b --- /dev/null +++ b/litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionCommandRouteEvent.java @@ -0,0 +1,39 @@ +package dev.rollczi.litecommands.suggestion.event; + +import dev.rollczi.litecommands.command.CommandNode; +import dev.rollczi.litecommands.command.CommandRoute; +import dev.rollczi.litecommands.invocation.Invocation; + +public class SuggestionCommandRouteEvent implements SuggestionNodeEvent { + + private final Invocation invocation; + private final CommandRoute commandRoute; + private boolean isCancelled = false; + + public SuggestionCommandRouteEvent(Invocation invocation, CommandRoute commandRoute) { + this.invocation = invocation; + this.commandRoute = commandRoute; + } + + public CommandRoute getCommandRoute() { + return commandRoute; + } + + public Invocation getInvocation() { + return invocation; + } + + @Override + public CommandNode getNode() { + return commandRoute; + } + + public void setCancelled(boolean cancelled) { + isCancelled = cancelled; + } + + public boolean isCancelled() { + return isCancelled; + } + +} diff --git a/litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionEvent.java b/litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionEvent.java new file mode 100644 index 000000000..62ec034c1 --- /dev/null +++ b/litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionEvent.java @@ -0,0 +1,6 @@ +package dev.rollczi.litecommands.suggestion.event; + +import dev.rollczi.litecommands.event.Event; + +public interface SuggestionEvent extends Event { +} diff --git a/litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionExecutorEvent.java b/litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionExecutorEvent.java new file mode 100644 index 000000000..f4655c5a9 --- /dev/null +++ b/litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionExecutorEvent.java @@ -0,0 +1,39 @@ +package dev.rollczi.litecommands.suggestion.event; + +import dev.rollczi.litecommands.command.CommandNode; +import dev.rollczi.litecommands.command.executor.CommandExecutor; +import dev.rollczi.litecommands.invocation.Invocation; + +public class SuggestionExecutorEvent implements SuggestionNodeEvent { + + private final Invocation invocation; + private final CommandExecutor executor; + private boolean isCancelled = false; + + public SuggestionExecutorEvent(Invocation invocation, CommandExecutor executor) { + this.invocation = invocation; + this.executor = executor; + } + + public CommandExecutor getCommandExecutor() { + return executor; + } + + public Invocation getInvocation() { + return invocation; + } + + @Override + public CommandNode getNode() { + return executor; + } + + public void setCancelled(boolean cancelled) { + isCancelled = cancelled; + } + + public boolean isCancelled() { + return isCancelled; + } + +} diff --git a/litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionNodeEvent.java b/litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionNodeEvent.java new file mode 100644 index 000000000..2c8f61ebe --- /dev/null +++ b/litecommands-core/src/dev/rollczi/litecommands/suggestion/event/SuggestionNodeEvent.java @@ -0,0 +1,17 @@ +package dev.rollczi.litecommands.suggestion.event; + +import dev.rollczi.litecommands.command.CommandNode; +import dev.rollczi.litecommands.event.Event; +import dev.rollczi.litecommands.invocation.Invocation; + +public interface SuggestionNodeEvent extends Event { + + Invocation getInvocation(); + + CommandNode getNode(); + + void setCancelled(boolean cancelled); + + boolean isCancelled(); + +} diff --git a/litecommands-core/src/dev/rollczi/litecommands/validator/Validator.java b/litecommands-core/src/dev/rollczi/litecommands/validator/Validator.java index 4f4566db3..bc5bee3dd 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/validator/Validator.java +++ b/litecommands-core/src/dev/rollczi/litecommands/validator/Validator.java @@ -4,6 +4,7 @@ import dev.rollczi.litecommands.invocation.Invocation; import dev.rollczi.litecommands.meta.MetaHolder; +@Deprecated public interface Validator { Flow validate(Invocation invocation, MetaHolder metaHolder); diff --git a/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorExecutionController.java b/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorExecutionController.java deleted file mode 100644 index 26cd8f20d..000000000 --- a/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorExecutionController.java +++ /dev/null @@ -1,29 +0,0 @@ -package dev.rollczi.litecommands.validator; - -import dev.rollczi.litecommands.command.executor.event.CommandPreExecutionEvent; -import dev.rollczi.litecommands.event.EventListener; -import dev.rollczi.litecommands.event.Subscriber; -import dev.rollczi.litecommands.flow.Flow; - -public class ValidatorExecutionController implements EventListener { - - private final ValidatorService validatorService; - - public ValidatorExecutionController(ValidatorService validatorService) { - this.validatorService = validatorService; - } - - @Subscriber - public void onEvent(CommandPreExecutionEvent event) { - Flow flow = this.validatorService.validate(event.getInvocation(), event.getExecutor()); - - if (flow.isTerminate()) { - event.stopFlow(flow.failedReason()); - } - - if (flow.isStopCurrent()) { - event.skipFlow(flow.failedReason()); - } - } - -} diff --git a/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorExecutorController.java b/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorExecutorController.java new file mode 100644 index 000000000..98879becb --- /dev/null +++ b/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorExecutorController.java @@ -0,0 +1,43 @@ +package dev.rollczi.litecommands.validator; + +import dev.rollczi.litecommands.command.executor.CommandExecutorMatchResult; +import dev.rollczi.litecommands.command.executor.event.CommandExecutorFoundEvent; +import dev.rollczi.litecommands.command.executor.event.CommandExecutorNotFoundEvent; +import dev.rollczi.litecommands.event.EventListener; +import dev.rollczi.litecommands.event.Subscriber; +import dev.rollczi.litecommands.flow.Flow; +import dev.rollczi.litecommands.invocation.Invocation; + +@Deprecated +public class ValidatorExecutorController implements EventListener { + + private final ValidatorService validatorService; + + public ValidatorExecutorController(ValidatorService validatorService) { + this.validatorService = validatorService; + } + + @Subscriber + public void onEvent(CommandExecutorFoundEvent event) { + Flow flow = this.validatorService.validate(event.getInvocation(), event.getExecutor()); + + if (flow.isTerminate()) { + event.cancel(flow.failedReason()); + } + + if (flow.isStopCurrent()) { + event.setResult(CommandExecutorMatchResult.failed(flow.failedReason())); + } + } + + @Subscriber + void onEvent(CommandExecutorNotFoundEvent event) { + Flow flow = this.validatorService.validate((Invocation) event.getInvocation(), event.getCommandRoute()); + if (flow.isContinue()) { + return; + } + + event.setFailedReason(flow.failedReason()); + } + +} diff --git a/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorResult.java b/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorResult.java index 80d425da0..80b3f02b3 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorResult.java +++ b/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorResult.java @@ -3,6 +3,7 @@ import dev.rollczi.litecommands.shared.Preconditions; import org.jetbrains.annotations.Nullable; +@Deprecated public class ValidatorResult { private final boolean valid; diff --git a/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorScope.java b/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorScope.java index a31f5574f..d47302a53 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorScope.java +++ b/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorScope.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.stream.Collectors; +@Deprecated public class ValidatorScope implements Scope { private final Class type; diff --git a/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorService.java b/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorService.java index 2ee9f8b8c..f52c90c16 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorService.java +++ b/litecommands-core/src/dev/rollczi/litecommands/validator/ValidatorService.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Map; +@Deprecated public class ValidatorService { private final Map, Validator>> commandValidators = new HashMap<>(); diff --git a/litecommands-core/src/dev/rollczi/litecommands/validator/requirement/RequirementValidator.java b/litecommands-core/src/dev/rollczi/litecommands/validator/requirement/RequirementValidator.java index a7dc67ef9..9f8c959d7 100644 --- a/litecommands-core/src/dev/rollczi/litecommands/validator/requirement/RequirementValidator.java +++ b/litecommands-core/src/dev/rollczi/litecommands/validator/requirement/RequirementValidator.java @@ -5,6 +5,7 @@ import dev.rollczi.litecommands.requirement.Requirement; import dev.rollczi.litecommands.validator.ValidatorResult; +@Deprecated public interface RequirementValidator { ValidatorResult validate(Invocation invocation, CommandExecutor executor, Requirement requirement, T value); diff --git a/litecommands-core/test/dev/rollczi/litecommands/permission/PermissionValidatorTest.java b/litecommands-core/test/dev/rollczi/litecommands/permission/PermissionValidatorTest.java index 8a64655c3..4ea854d89 100644 --- a/litecommands-core/test/dev/rollczi/litecommands/permission/PermissionValidatorTest.java +++ b/litecommands-core/test/dev/rollczi/litecommands/permission/PermissionValidatorTest.java @@ -1,11 +1,8 @@ package dev.rollczi.litecommands.permission; -import dev.rollczi.litecommands.bind.BindRegistry; import dev.rollczi.litecommands.command.CommandRoute; import dev.rollczi.litecommands.command.builder.CommandBuilder; import dev.rollczi.litecommands.command.executor.CommandExecutor; -import dev.rollczi.litecommands.event.SimpleEventPublisher; -import dev.rollczi.litecommands.flow.Flow; import dev.rollczi.litecommands.invocation.Invocation; import dev.rollczi.litecommands.meta.Meta; import dev.rollczi.litecommands.unit.TestExecutor; @@ -19,14 +16,12 @@ import java.util.Optional; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; class PermissionValidatorTest { - private final PermissionValidationServiceImpl service = new PermissionValidationServiceImpl(new SimpleEventPublisher(new BindRegistry())); - final PermissionValidator validator = new PermissionValidator<>(service); + final PermissionService validator = new PermissionServiceImpl(); @Test @DisplayName("should scan all permissions from root to executor and check if sender has them") @@ -46,12 +41,7 @@ void test() { CommandRoute sub = assertPresent(test.getChild("sub")); CommandExecutor executor = sub.getExecutors().first(); - Flow result = validator.validate(invocation, executor); - - assertTrue(result.isTerminate()); - assertTrue(result.hasReason()); - - MissingPermissions missingPermissions = assertInstanceOf(MissingPermissions.class, result.getReason()); + MissingPermissions missingPermissions = validator.validate(invocation.platformSender(), executor); assertNotNull(missingPermissions); assertTrue(missingPermissions.isMissing()); diff --git a/litecommands-core/test/dev/rollczi/litecommands/schematic/SchematicFastGeneratorTest.java b/litecommands-core/test/dev/rollczi/litecommands/schematic/SchematicFastGeneratorTest.java index 50b133cf2..73738c92e 100644 --- a/litecommands-core/test/dev/rollczi/litecommands/schematic/SchematicFastGeneratorTest.java +++ b/litecommands-core/test/dev/rollczi/litecommands/schematic/SchematicFastGeneratorTest.java @@ -2,19 +2,13 @@ import dev.rollczi.litecommands.argument.parser.ParserRegistry; import dev.rollczi.litecommands.argument.parser.ParserRegistryImpl; -import dev.rollczi.litecommands.bind.BindRegistry; import dev.rollczi.litecommands.command.CommandRoute; import dev.rollczi.litecommands.command.executor.CommandExecutor; -import dev.rollczi.litecommands.event.SimpleEventPublisher; import dev.rollczi.litecommands.meta.Meta; -import dev.rollczi.litecommands.permission.PermissionValidator; import dev.rollczi.litecommands.permission.PermissionSet; -import dev.rollczi.litecommands.permission.PermissionValidationServiceImpl; -import dev.rollczi.litecommands.scope.Scope; +import dev.rollczi.litecommands.permission.PermissionServiceImpl; import dev.rollczi.litecommands.unit.TestExecutor; import dev.rollczi.litecommands.unit.TestUtil; -import dev.rollczi.litecommands.validator.ValidatorService; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import java.util.Collections; @@ -25,15 +19,8 @@ @SuppressWarnings({"rawtypes", "unchecked"}) class SchematicFastGeneratorTest { - static ValidatorService validatorService = new ValidatorService(); static ParserRegistry parserRegistry = new ParserRegistryImpl(); - static SchematicGenerator schematicGenerator = new SchematicFastGenerator(SchematicFormat.angleBrackets(), validatorService, parserRegistry); - - @BeforeAll - static void beforeAll() { - PermissionValidationServiceImpl service = new PermissionValidationServiceImpl(new SimpleEventPublisher(new BindRegistry())); - validatorService.registerValidator(Scope.global(), new PermissionValidator<>(service)); - } + static SchematicGenerator schematicGenerator = new SchematicFastGenerator(SchematicFormat.angleBrackets(), new PermissionServiceImpl(), parserRegistry); @Test void test() { diff --git a/litecommands-core/test/dev/rollczi/litecommands/schematic/SchematicGeneratorTest.java b/litecommands-core/test/dev/rollczi/litecommands/schematic/SchematicGeneratorTest.java index 5d47d17c7..2385188ba 100644 --- a/litecommands-core/test/dev/rollczi/litecommands/schematic/SchematicGeneratorTest.java +++ b/litecommands-core/test/dev/rollczi/litecommands/schematic/SchematicGeneratorTest.java @@ -2,19 +2,13 @@ import dev.rollczi.litecommands.argument.parser.ParserRegistry; import dev.rollczi.litecommands.argument.parser.ParserRegistryImpl; -import dev.rollczi.litecommands.bind.BindRegistry; import dev.rollczi.litecommands.command.CommandRoute; import dev.rollczi.litecommands.command.executor.CommandExecutor; -import dev.rollczi.litecommands.event.SimpleEventPublisher; import dev.rollczi.litecommands.meta.Meta; -import dev.rollczi.litecommands.permission.PermissionValidator; import dev.rollczi.litecommands.permission.PermissionSet; -import dev.rollczi.litecommands.permission.PermissionValidationServiceImpl; -import dev.rollczi.litecommands.scope.Scope; +import dev.rollczi.litecommands.permission.PermissionServiceImpl; import dev.rollczi.litecommands.unit.TestExecutor; import dev.rollczi.litecommands.unit.TestUtil; -import dev.rollczi.litecommands.validator.ValidatorService; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import java.util.Collections; @@ -25,15 +19,8 @@ @SuppressWarnings({"rawtypes", "unchecked"}) class SchematicGeneratorTest { - static ValidatorService validatorService = new ValidatorService(); static ParserRegistry parserRegistry = new ParserRegistryImpl(); - static SchematicGenerator schematicGenerator = new SimpleSchematicGenerator<>(SchematicFormat.angleBrackets(), validatorService, parserRegistry); - - @BeforeAll - static void beforeAll() { - PermissionValidationServiceImpl service = new PermissionValidationServiceImpl(new SimpleEventPublisher(new BindRegistry())); - validatorService.registerValidator(Scope.global(), new PermissionValidator<>(service)); - } + static SchematicGenerator schematicGenerator = new SimpleSchematicGenerator<>(SchematicFormat.angleBrackets(), new PermissionServiceImpl(), parserRegistry); @Test void test() { diff --git a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/FabricCommand.java b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/FabricCommand.java index d03cd47c1..309698ba6 100644 --- a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/FabricCommand.java +++ b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/FabricCommand.java @@ -76,7 +76,7 @@ private int execute(CommandContext context) { RawCommand rawCommand = RawCommand.from(context.getInput()); ParseableInput parseableInput = rawCommand.toParseableInput(); PlatformSender platformSender = this.senderFactory.create(context.getSource()); - Invocation invocation = new Invocation<>(context.getSource(), platformSender, baseRoute.getName(), rawCommand.getLabel(), parseableInput); + Invocation invocation = new Invocation<>(platformSender, baseRoute.getName(), rawCommand.getLabel(), parseableInput); invocationHook.execute(invocation, parseableInput); return Command.SINGLE_SUCCESS; @@ -88,7 +88,7 @@ private int execute(CommandContext context) { RawCommand rawCommand = RawCommand.from(input); SuggestionInput suggestionInput = rawCommand.toSuggestionInput(); PlatformSender platformSender = this.senderFactory.create(context.getSource()); - Invocation invocation = new Invocation<>(context.getSource(), platformSender, baseRoute.getName(), rawCommand.getLabel(), suggestionInput); + Invocation invocation = new Invocation<>(platformSender, baseRoute.getName(), rawCommand.getLabel(), suggestionInput); SuggestionResult suggest = suggestionHook.suggest(invocation, suggestionInput); diff --git a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/LiteFabricSettings.java b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/LiteFabricSettings.java index a03906881..602371467 100644 --- a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/LiteFabricSettings.java +++ b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/LiteFabricSettings.java @@ -1,14 +1,11 @@ package dev.rollczi.litecommands.fabric; import dev.rollczi.litecommands.platform.PlatformSettings; -import dev.rollczi.litecommands.settings.PermissionResolver; -import net.minecraft.command.CommandSource; import org.jetbrains.annotations.ApiStatus; public class LiteFabricSettings implements PlatformSettings { private String inputInspectionDisplay = "[...]"; - private PermissionResolver permissionResolver = (sender, permission) -> true; String getInputInspectionDisplay() { return this.inputInspectionDisplay; @@ -25,12 +22,4 @@ public LiteFabricSettings inputInspectionDisplay(String name) { return this; } - public boolean hasPermission(CommandSource source, String permission) { - return this.permissionResolver.hasPermission(source, permission); - } - - public LiteFabricSettings permissionResolver(PermissionResolver permissionResolver) { - this.permissionResolver = permissionResolver; - return this; - } } diff --git a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientPlatform.java b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientPlatform.java index dc174fb2c..1b0d19091 100644 --- a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientPlatform.java +++ b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientPlatform.java @@ -28,11 +28,11 @@ protected void registerEvents() { @Override public PlatformSenderFactory getSenderFactory() { - return this::createSender; + return nativeSender -> createSender(nativeSender); } @Override public PlatformSender createSender(FabricClientCommandSource nativeSender) { - return new FabricClientSender(nativeSender, this); + return new FabricClientSender(nativeSender); } } diff --git a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientSender.java b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientSender.java index dc522638a..d4b533f71 100644 --- a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientSender.java +++ b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/client/FabricClientSender.java @@ -8,12 +8,11 @@ @Environment(EnvType.CLIENT) public class FabricClientSender extends AbstractPlatformSender { + private final FabricClientCommandSource source; - private final FabricClientPlatform platform; - public FabricClientSender(FabricClientCommandSource source, FabricClientPlatform platform) { + public FabricClientSender(FabricClientCommandSource source) { this.source = source; - this.platform = platform; } @Override @@ -27,7 +26,8 @@ public Identifier getIdentifier() { } @Override - public boolean hasPermission(String permission) { - return this.platform.getConfiguration().hasPermission(this.source, permission); + public Object getHandle() { + return (SENDER) this.source; } + } diff --git a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerPlatform.java b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerPlatform.java index 13a26ff33..4795778b0 100644 --- a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerPlatform.java +++ b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerPlatform.java @@ -27,11 +27,11 @@ protected void registerEvents() { @Override public PlatformSenderFactory getSenderFactory() { - return this::createSender; + return nativeSender -> createSender(nativeSender); } @Override public PlatformSender createSender(ServerCommandSource nativeSender) { - return new FabricServerSender(nativeSender, this); + return new FabricServerSender(nativeSender); } } diff --git a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerSender.java b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerSender.java index 5291b6f05..9ff20755a 100644 --- a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerSender.java +++ b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerSender.java @@ -9,12 +9,11 @@ import java.util.List; public class FabricServerSender extends AbstractPlatformSender { + private final ServerCommandSource source; - private final FabricServerPlatform platform; - public FabricServerSender(ServerCommandSource source, FabricServerPlatform platform) { + public FabricServerSender(ServerCommandSource source) { this.source = source; - this.platform = platform; } @Override @@ -30,12 +29,12 @@ public Identifier getIdentifier() { if (entity != null) { list.add(entity.getUuid()); } - Object[] objects = list.toArray(); - return Identifier.of(objects); + return Identifier.of(list.toArray()); } @Override - public boolean hasPermission(String permission) { - return this.platform.getConfiguration().hasPermission(this.source, permission); + public Object getHandle() { + return (SENDER) this.source; } + } diff --git a/litecommands-framework/src/dev/rollczi/litecommands/LiteCommandsBaseBuilder.java b/litecommands-framework/src/dev/rollczi/litecommands/LiteCommandsBaseBuilder.java index bc39c9777..09f2c6f21 100644 --- a/litecommands-framework/src/dev/rollczi/litecommands/LiteCommandsBaseBuilder.java +++ b/litecommands-framework/src/dev/rollczi/litecommands/LiteCommandsBaseBuilder.java @@ -22,6 +22,9 @@ import dev.rollczi.litecommands.extension.LiteCommandsProviderExtension; import dev.rollczi.litecommands.extension.annotations.AnnotationsExtension; import dev.rollczi.litecommands.extension.annotations.LiteAnnotationsProcessorExtension; +import dev.rollczi.litecommands.permission.PermissionResolver; +import dev.rollczi.litecommands.permission.PermissionService; +import dev.rollczi.litecommands.permission.PermissionServiceImpl; import dev.rollczi.litecommands.processor.LiteBuilderAction; import dev.rollczi.litecommands.command.executor.CommandExecuteService; import dev.rollczi.litecommands.bind.BindRegistry; @@ -96,6 +99,7 @@ public class LiteCommandsBaseBuilder> commandsProviderExtensions = new ArrayList<>(); protected final EditorService editorService; + protected final PermissionServiceImpl permissionService; protected final ValidatorService validatorService; protected final ParserRegistry parserRegistry; protected final SuggesterRegistry suggesterRegistry; @@ -121,6 +125,7 @@ public LiteCommandsBaseBuilder(Class senderClass, Platform pl senderClass, platform, new EditorService<>(), + new PermissionServiceImpl(), new ValidatorService<>(), new ParserRegistryImpl<>(), new SuggesterRegistryImpl<>(), @@ -143,6 +148,7 @@ public LiteCommandsBaseBuilder( Platform platform, EditorService editorService, + PermissionServiceImpl permissionService, ValidatorService validatorService, ParserRegistry parserRegistry, SuggesterRegistry suggesterRegistry, @@ -158,6 +164,7 @@ public LiteCommandsBaseBuilder( this.editorService = editorService; this.validatorService = validatorService; + this.permissionService = permissionService; this.parserRegistry = parserRegistry; this.suggesterRegistry = suggesterRegistry; this.bindRegistry = bindRegistry; @@ -169,8 +176,8 @@ public LiteCommandsBaseBuilder( this.scheduler = new SchedulerReference(new SchedulerExecutorPoolImpl("litecommands")); this.eventPublisher = new SimpleEventPublisher(bindRegistry); - this.schematicGenerator = new SchematicGeneratorReference<>(new SchematicFastGenerator<>(SchematicFormat.angleBrackets(), validatorService, parserRegistry)); - this.cooldownService = new CooldownService(this.scheduler, eventPublisher); + this.schematicGenerator = new SchematicGeneratorReference<>(new SchematicFastGenerator<>(SchematicFormat.angleBrackets(), permissionService, parserRegistry)); + this.cooldownService = new CooldownService(this.scheduler, permissionService, eventPublisher); } @Override @@ -509,13 +516,13 @@ public B schematicGenerator(SchematicGenerator schematicGenerator) { @Override public B schematicGenerator(SchematicFormat format) { - this.schematicGenerator.setSchematicGenerator(new SimpleSchematicGenerator<>(format, validatorService, parserRegistry)); + this.schematicGenerator.setSchematicGenerator(new SimpleSchematicGenerator<>(format, permissionService, parserRegistry)); return this.self(); } @Override public B schematicGenerator(SchematicFastFormat format) { - this.schematicGenerator.setSchematicGenerator(new SchematicFastGenerator<>(format, validatorService, parserRegistry)); + this.schematicGenerator.setSchematicGenerator(new SchematicFastGenerator<>(format, permissionService, parserRegistry)); return this.self(); } @@ -555,6 +562,12 @@ public B afterBuild(LiteBuilderAction action) { return this.self(); } + @Override + public B permissionResolver(PermissionResolver permissionResolver) { + this.permissionService.setPermissionResolver(permissionResolver); + return this.self(); + } + @Override public B extension(LiteExtension extension) { return this.extension(extension, configuration -> {}); @@ -628,8 +641,8 @@ public LiteCommands build(boolean register) { protected CommandManager createCommandManager() { RequirementMatchService requirementMatchService = new RequirementMatchService<>(strictService, contextRegistry, parserRegistry, bindRegistry, scheduler); - CommandExecuteService commandExecuteService = new CommandExecuteService<>(validatorService, resultHandleService, scheduler, requirementMatchService, eventPublisher); - SuggestionService suggestionService = new SuggestionService<>(parserRegistry, suggesterRegistry, validatorService); + CommandExecuteService commandExecuteService = new CommandExecuteService<>(resultHandleService, scheduler, requirementMatchService, eventPublisher); + SuggestionService suggestionService = new SuggestionService<>(parserRegistry, suggesterRegistry, validatorService, eventPublisher); return new CommandManager<>(this.platform, commandExecuteService, suggestionService); } @@ -673,6 +686,11 @@ public EditorService getEditorService() { return this.editorService; } + @Override + public PermissionService getPermissionService() { + return this.permissionService; + } + @Override @ApiStatus.Internal public ValidatorService getValidatorService() { diff --git a/litecommands-framework/src/dev/rollczi/litecommands/LiteCommandsBuilder.java b/litecommands-framework/src/dev/rollczi/litecommands/LiteCommandsBuilder.java index c8ef75f0a..d47d3f5cd 100644 --- a/litecommands-framework/src/dev/rollczi/litecommands/LiteCommandsBuilder.java +++ b/litecommands-framework/src/dev/rollczi/litecommands/LiteCommandsBuilder.java @@ -11,6 +11,7 @@ import dev.rollczi.litecommands.context.ContextChainedProvider; import dev.rollczi.litecommands.event.Subscriber; import dev.rollczi.litecommands.extension.annotations.AnnotationsExtension; +import dev.rollczi.litecommands.permission.PermissionResolver; import dev.rollczi.litecommands.processor.LiteBuilderAction; import dev.rollczi.litecommands.context.ContextProvider; import dev.rollczi.litecommands.extension.LiteExtension; @@ -173,8 +174,10 @@ default B bind(Class on, BindProvider bindProvider) { B editor(Scope scope, Editor editor); + @Deprecated B validatorGlobal(Validator validator); + @Deprecated B validator(Scope scope, Validator validator); default B validatorMarked(Validator validator) { @@ -237,36 +240,14 @@ default B validatorMarked(Validator validator) { B listener(Class event, Consumer listener); - /** - * @deprecated use {@link LiteCommandsBuilder#self(LiteBuilderAction)} instead - */ - @Deprecated - default B selfProcessor(LiteBuilderAction processor) { - return self(processor); - } - - /** - * @deprecated use {@link LiteCommandsBuilder#beforeBuild(LiteBuilderAction)} instead - */ - @Deprecated - default B preProcessor(LiteBuilderAction preProcessor) { - return beforeBuild(preProcessor); - } - - /** - * @deprecated use {@link LiteCommandsBuilder#afterBuild(LiteBuilderAction)} instead - */ - @Deprecated - default B postProcessor(LiteBuilderAction postProcessor) { - return afterBuild(postProcessor); - } - B self(LiteBuilderAction action); B beforeBuild(LiteBuilderAction action); B afterBuild(LiteBuilderAction action); + B permissionResolver(PermissionResolver permissionResolver); + /** * Register extension for this builder. * @param extension extension to register diff --git a/litecommands-framework/src/dev/rollczi/litecommands/LiteCommandsFactory.java b/litecommands-framework/src/dev/rollczi/litecommands/LiteCommandsFactory.java index 13504be5d..df6ac5558 100644 --- a/litecommands-framework/src/dev/rollczi/litecommands/LiteCommandsFactory.java +++ b/litecommands-framework/src/dev/rollczi/litecommands/LiteCommandsFactory.java @@ -48,9 +48,11 @@ import dev.rollczi.litecommands.literal.LiteralArgumentResolver; import dev.rollczi.litecommands.message.MessageRegistry; import dev.rollczi.litecommands.permission.MissingPermissionResultHandler; -import dev.rollczi.litecommands.permission.PermissionValidator; +import dev.rollczi.litecommands.permission.PermissionExecutionController; +import dev.rollczi.litecommands.permission.PermissionService; +import dev.rollczi.litecommands.permission.PermissionSuggestionController; import dev.rollczi.litecommands.permission.MissingPermissions; -import dev.rollczi.litecommands.permission.PermissionValidationServiceImpl; +import dev.rollczi.litecommands.permission.PermissionServiceImpl; import dev.rollczi.litecommands.platform.Platform; import dev.rollczi.litecommands.platform.PlatformSender; import dev.rollczi.litecommands.platform.PlatformSettings; @@ -60,7 +62,7 @@ import static dev.rollczi.litecommands.reflect.type.TypeRange.upwards; import dev.rollczi.litecommands.scheduler.Scheduler; import dev.rollczi.litecommands.scope.Scope; -import dev.rollczi.litecommands.validator.ValidatorExecutionController; +import dev.rollczi.litecommands.validator.ValidatorExecutorController; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; @@ -97,8 +99,7 @@ public static messageRegistry = internal.getMessageRegistry(); ParserRegistry parser = internal.getParserRegistry(); SuggesterRegistry suggester = internal.getSuggesterRegistry(); - EventPublisher eventPublisher = internal.getEventPublisher(); - + PermissionService permissionService = internal.getPermissionService(); List> excluded = Arrays.asList(Cloneable.class, Serializable.class, Object.class); builder.advanced() @@ -108,11 +109,11 @@ public static ContextResult.ok(() -> invocation.platformSender())) .context(Invocation.class, invocation -> ContextResult.ok(() -> invocation)) // Do not use short method reference here (it will cause bad return type in method reference on Java 8) - .validator(Scope.global(), new PermissionValidator<>(new PermissionValidationServiceImpl(eventPublisher))) - - .listener(new ValidatorExecutionController<>(internal.getValidatorService())) + .listener(new ValidatorExecutorController<>(internal.getValidatorService())) // TODO remove .listener(new CooldownStateController<>(internal.getCooldownService())) .listener(new InvalidUsageResultController<>(internal.getSchematicGenerator())) + .listener(new PermissionSuggestionController(permissionService)) + .listener(new PermissionExecutionController(permissionService)) .argument(String.class, new StringArgumentResolver<>()) .argument(Boolean.class, new BooleanArgumentResolver<>()) diff --git a/litecommands-jda/src/dev/rollczi/litecommands/jda/JDACommandTranslator.java b/litecommands-jda/src/dev/rollczi/litecommands/jda/JDACommandTranslator.java index 6b63687a4..18864cb52 100644 --- a/litecommands-jda/src/dev/rollczi/litecommands/jda/JDACommandTranslator.java +++ b/litecommands-jda/src/dev/rollczi/litecommands/jda/JDACommandTranslator.java @@ -276,7 +276,6 @@ Invocation translateInvocation(CommandRoute route, Input argument .build(); return new Invocation<>( - interaction.getUser(), new JDAPlatformSender(interaction.getUser()), route.getName(), interaction.getName(), diff --git a/litecommands-jda/src/dev/rollczi/litecommands/jda/JDAPlatformSender.java b/litecommands-jda/src/dev/rollczi/litecommands/jda/JDAPlatformSender.java index b28bf665b..66e1041d2 100644 --- a/litecommands-jda/src/dev/rollczi/litecommands/jda/JDAPlatformSender.java +++ b/litecommands-jda/src/dev/rollczi/litecommands/jda/JDAPlatformSender.java @@ -23,9 +23,8 @@ public Identifier getIdentifier() { } @Override - @Deprecated - public boolean hasPermission(String permission) { - return false; + public Object getHandle() { + return this.user; } } diff --git a/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsPermissionFactory.java b/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsPermissionFactory.java new file mode 100644 index 000000000..1eaf198a6 --- /dev/null +++ b/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsPermissionFactory.java @@ -0,0 +1,74 @@ +package dev.rollczi.litecommands.luckperms; + +import dev.rollczi.litecommands.permission.PermissionResolver; +import dev.rollczi.litecommands.platform.PlatformSender; +import java.util.function.BiPredicate; +import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.model.user.User; +import net.luckperms.api.model.user.UserManager; +import net.luckperms.api.query.QueryOptions; + +import java.util.UUID; +import java.util.function.Function; +import java.util.function.Supplier; +import org.jetbrains.annotations.Nullable; + +public class LuckPermsPermissionFactory { + + public static final UUID CONSOLE = new UUID(0, 0); + + private static final Supplier USER_MANAGER = () -> LuckPermsProvider.get().getUserManager(); + + public static PermissionResolver create(Class playerType, Class consoleType, Function uuidProvider) { + return PermissionResolver.createDefault(new ComplexResolver<>(playerType, consoleType, uuidProvider)); + } + + public static PermissionResolver create(Class senderType, Function uuidProvider) { + return PermissionResolver.createDefault(senderType, (sender, permission) -> hasPermission(uuidProvider.apply(sender), permission)); + } + + private static boolean hasPermission(UUID sender, String permission) { + if (sender == null) { + return false; + } + if (CONSOLE.equals(sender)) { + return true; + } + + UserManager userManager = USER_MANAGER.get(); + User user = userManager.isLoaded(sender) + ? userManager.getUser(sender) + : userManager.loadUser(sender).join(); + + if (user == null) { + return false; + } + + return user.getCachedData().getPermissionData(QueryOptions.nonContextual()).checkPermission(permission).asBoolean(); + } + + private static class ComplexResolver implements BiPredicate { + private final Class playerType; + private final Class consoleType; + private final Function uuidProvider; + + public ComplexResolver(Class playerType, Class consoleType, Function uuidProvider) { + this.playerType = playerType; + this.consoleType = consoleType; + this.uuidProvider = uuidProvider; + } + + @Override + public boolean test(PlatformSender sender, String permission) { + Object handle = sender.getHandle(); + if (playerType.isAssignableFrom(handle.getClass())) { + PLAYER player = playerType.cast(handle); + UUID uuid = uuidProvider.apply(player); + return hasPermission(uuid, permission); + } + + return consoleType.isAssignableFrom(handle.getClass()); + } + } + +} diff --git a/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsResolver.java b/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsResolver.java deleted file mode 100644 index de0e46e5c..000000000 --- a/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsResolver.java +++ /dev/null @@ -1,43 +0,0 @@ -package dev.rollczi.litecommands.luckperms; - -import dev.rollczi.litecommands.settings.PermissionResolver; -import net.luckperms.api.LuckPermsProvider; -import net.luckperms.api.model.user.User; -import net.luckperms.api.model.user.UserManager; -import net.luckperms.api.query.QueryOptions; - -import java.util.UUID; -import java.util.concurrent.ExecutionException; -import java.util.function.Function; -import java.util.function.Supplier; - -public class LuckPermsResolver implements PermissionResolver { - public static final UUID CONSOLE = new UUID(0, 0); - - private final Function uuidFunction; - private final Supplier getUserManager = () -> LuckPermsProvider.get().getUserManager(); - - public LuckPermsResolver(Function uuidFunction) { - this.uuidFunction = uuidFunction; - } - - @Override - public boolean hasPermission(SENDER sender, String permission) { - UUID uuid = uuidFunction.apply(sender); - if (uuid == null) { - return false; - } - if (CONSOLE.equals(uuid)) { - return true; - } - - UserManager userManager = this.getUserManager.get(); - User user = userManager.isLoaded(uuid) - ? userManager.getUser(uuid) - : userManager.loadUser(uuid); - if (user == null) { - return false; - } - return user.getCachedData().getPermissionData(QueryOptions.nonContextual()).checkPermission(permission).asBoolean(); - } -} diff --git a/litecommands-minestom/src/dev/rollczi/litecommands/minestom/LiteMinestomSettings.java b/litecommands-minestom/src/dev/rollczi/litecommands/minestom/LiteMinestomSettings.java index 72f519b3c..059fedb4b 100644 --- a/litecommands-minestom/src/dev/rollczi/litecommands/minestom/LiteMinestomSettings.java +++ b/litecommands-minestom/src/dev/rollczi/litecommands/minestom/LiteMinestomSettings.java @@ -1,20 +1,6 @@ package dev.rollczi.litecommands.minestom; -import dev.rollczi.litecommands.settings.PermissionResolver; import dev.rollczi.litecommands.platform.PlatformSettings; -import net.minestom.server.command.CommandSender; public class LiteMinestomSettings implements PlatformSettings { - - private PermissionResolver permissionResolver = (sender, permission) -> true; - - public LiteMinestomSettings permissionResolver(PermissionResolver permissionResolver) { - this.permissionResolver = permissionResolver; - return this; - } - - boolean hasPermission(CommandSender handle, String permission) { - return permissionResolver.hasPermission(handle, permission); - } - } diff --git a/litecommands-minestom/src/dev/rollczi/litecommands/minestom/MinestomCommand.java b/litecommands-minestom/src/dev/rollczi/litecommands/minestom/MinestomCommand.java index 1ad4b7f66..299eb5bf2 100644 --- a/litecommands-minestom/src/dev/rollczi/litecommands/minestom/MinestomCommand.java +++ b/litecommands-minestom/src/dev/rollczi/litecommands/minestom/MinestomCommand.java @@ -76,7 +76,7 @@ Component tooltip(String string) { } private Invocation createInvocation(CommandSender sender, String alias, Input input) { - return new Invocation<>(sender, platform.createSender(sender), this.command.getName(), alias, input); + return new Invocation<>(platform.createSender(sender), this.command.getName(), alias, input); } private String[] fixArguments(String[] args) { diff --git a/litecommands-minestom/src/dev/rollczi/litecommands/minestom/MinestomPlatform.java b/litecommands-minestom/src/dev/rollczi/litecommands/minestom/MinestomPlatform.java index 58ce3f433..bb2adaa43 100644 --- a/litecommands-minestom/src/dev/rollczi/litecommands/minestom/MinestomPlatform.java +++ b/litecommands-minestom/src/dev/rollczi/litecommands/minestom/MinestomPlatform.java @@ -44,7 +44,7 @@ public PlatformSenderFactory getSenderFactory() { @Override public PlatformSender createSender(CommandSender nativeSender) { - return new MinestomSender(nativeSender, this); + return new MinestomSender(nativeSender); } private MinestomCommand createCommand(CommandRoute command, PlatformInvocationListener invocationHook, PlatformSuggestionListener suggestionHook) { diff --git a/litecommands-minestom/src/dev/rollczi/litecommands/minestom/MinestomSender.java b/litecommands-minestom/src/dev/rollczi/litecommands/minestom/MinestomSender.java index 316cefc73..14237d99c 100644 --- a/litecommands-minestom/src/dev/rollczi/litecommands/minestom/MinestomSender.java +++ b/litecommands-minestom/src/dev/rollczi/litecommands/minestom/MinestomSender.java @@ -2,7 +2,6 @@ import dev.rollczi.litecommands.identifier.Identifier; import dev.rollczi.litecommands.platform.AbstractPlatformSender; -import net.kyori.adventure.pointer.Pointer; import net.minestom.server.command.CommandSender; import net.minestom.server.command.ConsoleSender; import net.minestom.server.command.ServerSender; @@ -11,16 +10,9 @@ class MinestomSender extends AbstractPlatformSender { private final CommandSender handle; - private final MinestomPlatform platform; - public MinestomSender(CommandSender handle, MinestomPlatform platform) { + public MinestomSender(CommandSender handle) { this.handle = handle; - this.platform = platform; - } - - @Override - public boolean hasPermission(String permission) { - return this.platform.getConfiguration().hasPermission(this.handle, permission); } @Override @@ -49,4 +41,9 @@ public Identifier getIdentifier() { return Identifier.CONSOLE; } + @Override + public Object getHandle() { + return this.handle; + } + } diff --git a/litecommands-sponge/src/dev/rollczi/litecommands/sponge/SpongeCommand.java b/litecommands-sponge/src/dev/rollczi/litecommands/sponge/SpongeCommand.java index 57d0b24c4..38fbb528d 100644 --- a/litecommands-sponge/src/dev/rollczi/litecommands/sponge/SpongeCommand.java +++ b/litecommands-sponge/src/dev/rollczi/litecommands/sponge/SpongeCommand.java @@ -40,7 +40,7 @@ public CommandRoute getCommandRoute() { @Override public CommandResult process(CommandCause cause, ArgumentReader.Mutable arguments) { ParseableInput input = rawCommand(arguments).toParseableInput(); - Invocation invocation = new Invocation<>(cause, new SpongeSender(cause), commandRoute.getName(), commandRoute.getName(), input); + Invocation invocation = new Invocation<>(new SpongeSender(cause), commandRoute.getName(), commandRoute.getName(), input); this.executeHook.execute(invocation, input); return CommandResult.success(); } @@ -48,7 +48,7 @@ public CommandResult process(CommandCause cause, ArgumentReader.Mutable argument @Override public List complete(CommandCause cause, ArgumentReader.Mutable arguments) { SuggestionInput input = rawCommand(arguments).toSuggestionInput(); - Invocation invocation = new Invocation<>(cause, new SpongeSender(cause), commandRoute.getName(), commandRoute.getName(), input); + Invocation invocation = new Invocation<>(new SpongeSender(cause), commandRoute.getName(), commandRoute.getName(), input); return this.suggestionHook.suggest(invocation, input) .getSuggestions() diff --git a/litecommands-sponge/src/dev/rollczi/litecommands/sponge/SpongeSender.java b/litecommands-sponge/src/dev/rollczi/litecommands/sponge/SpongeSender.java index f7018b13d..a77da18ec 100644 --- a/litecommands-sponge/src/dev/rollczi/litecommands/sponge/SpongeSender.java +++ b/litecommands-sponge/src/dev/rollczi/litecommands/sponge/SpongeSender.java @@ -32,7 +32,8 @@ public Identifier getIdentifier() { } @Override - public boolean hasPermission(String permission) { - return handle.hasPermission(permission); + public Object getHandle() { + return (SENDER) handle; } + } diff --git a/litecommands-unit/src/dev/rollczi/litecommands/unit/AssertSuggest.java b/litecommands-unit/src/dev/rollczi/litecommands/unit/AssertSuggest.java index b61c0c38d..9011a1b7b 100644 --- a/litecommands-unit/src/dev/rollczi/litecommands/unit/AssertSuggest.java +++ b/litecommands-unit/src/dev/rollczi/litecommands/unit/AssertSuggest.java @@ -74,7 +74,7 @@ public AssertSuggest assertAsSuggester(Suggester suggester, Funct public AssertSuggest assertAsSuggester(Suggester suggester, Argument argument, Function mapper, String input) { Suggestion suggestion = Suggestion.of(input); SuggestionInput suggestionInput = SuggestionInput.raw(suggestion.multilevelList().toArray(new String[0])); - Invocation invocation = new Invocation<>(new TestSender(), TestPlatformSender.permittedAll(), "-", "-", suggestionInput); + Invocation invocation = new Invocation<>(TestPlatformSender.permittedAll(), "-", "-", suggestionInput); SuggestionResult suggestionResult = suggester.suggest(invocation, (Argument) argument, new SuggestionContext(suggestion)); SuggestionResult result = suggestionResult diff --git a/litecommands-unit/src/dev/rollczi/litecommands/unit/LiteCommandsTestFactory.java b/litecommands-unit/src/dev/rollczi/litecommands/unit/LiteCommandsTestFactory.java index f155a7f60..a94bd7d23 100644 --- a/litecommands-unit/src/dev/rollczi/litecommands/unit/LiteCommandsTestFactory.java +++ b/litecommands-unit/src/dev/rollczi/litecommands/unit/LiteCommandsTestFactory.java @@ -3,6 +3,7 @@ import dev.rollczi.litecommands.LiteCommandsFactory; import dev.rollczi.litecommands.LiteCommandsBuilder; +import dev.rollczi.litecommands.permission.PermissionResolver; import dev.rollczi.litecommands.unit.blocking.BlockingArgument; import dev.rollczi.litecommands.unit.blocking.BlockingArgumentResolver; import java.util.function.UnaryOperator; @@ -20,6 +21,10 @@ public static TestPlatform startPlatform(UnaryOperator invocation.sender().sendMessage(result)) .argument(BlockingArgument.class, new BlockingArgumentResolver<>()) .invalidUsage((invocation, result, chain) -> {}) + .permissionResolver(PermissionResolver.createDefault((platformSender, permission) -> { + TestPlatformSender sender = (TestPlatformSender) platformSender; + return sender.hasPermission(permission); + })) .build() .register(); diff --git a/litecommands-unit/src/dev/rollczi/litecommands/unit/TestPlatform.java b/litecommands-unit/src/dev/rollczi/litecommands/unit/TestPlatform.java index b1cc2be21..e5af26b7c 100644 --- a/litecommands-unit/src/dev/rollczi/litecommands/unit/TestPlatform.java +++ b/litecommands-unit/src/dev/rollczi/litecommands/unit/TestPlatform.java @@ -19,12 +19,12 @@ public class TestPlatform extends AbstractSimplePlatform { - private static final TestPlatformSender DEFAULT_SENDER = new TestPlatformSender(); + private static final TestPlatformSender DEFAULT_SENDER = new TestPlatformSender(new TestSender()); private final Map, PlatformInvocationListener> executeListeners = new LinkedHashMap<>(); private final Map, PlatformSuggestionListener> suggestListeners = new LinkedHashMap<>(); public TestPlatform() { - super(new TestSettings(), testSender -> new TestPlatformSender()); + super(new TestSettings(), testSender -> new TestPlatformSender(testSender)); } @Override @@ -45,7 +45,7 @@ public AssertExecute execute(String command) { public AssertExecute execute(PlatformSender sender, String command) { try { - return this.executeAsync(sender, command).get(15, TimeUnit.SECONDS); + return this.executeAsync(sender, command).get(3, TimeUnit.MINUTES); } catch (InterruptedException | ExecutionException | TimeoutException e) { throw new RuntimeException(e); @@ -63,7 +63,7 @@ public CompletableFuture executeAsync(PlatformSender sender, Stri String label = rawCommand.getLabel(); ParseableInput input = rawCommand.toParseableInput(); - Invocation invocation = new Invocation<>(testSender, sender, label, label, input); + Invocation invocation = new Invocation<>(sender, label, label, input); CommandRoute route = this.commandRoutes.get(label); if (route == null) { @@ -91,7 +91,7 @@ public AssertSuggest suggest(PlatformSender platformSender, String command) { String label = rawCommand.getLabel(); SuggestionInput arguments = rawCommand.toSuggestionInput(); - Invocation invocation = new Invocation<>(testSender, platformSender, label, label, arguments); + Invocation invocation = new Invocation<>(platformSender, label, label, arguments); CommandRoute route = this.commandRoutes.get(label); if (route == null) { diff --git a/litecommands-unit/src/dev/rollczi/litecommands/unit/TestPlatformSender.java b/litecommands-unit/src/dev/rollczi/litecommands/unit/TestPlatformSender.java index a877b3394..8c80802cf 100644 --- a/litecommands-unit/src/dev/rollczi/litecommands/unit/TestPlatformSender.java +++ b/litecommands-unit/src/dev/rollczi/litecommands/unit/TestPlatformSender.java @@ -15,10 +15,16 @@ public class TestPlatformSender extends AbstractPlatformSender { public static final MetaKey LOCALE = MetaKey.of("locale", Locale.class); + private final TestSender handle; + private final List permissions = new ArrayList<>(); private boolean permittedAll = false; private String name = "TestSender"; + public TestPlatformSender(TestSender handle) { + this.handle = handle; + } + public static PlatformSender named(String name) { return builder() .name(name) @@ -36,12 +42,8 @@ public Identifier getIdentifier() { } @Override - public boolean hasPermission(String permission) { - if (this.permittedAll) { - return true; - } - - return this.permissions.contains(permission); + public Object getHandle() { + return handle; } public static Builder builder() { @@ -66,9 +68,17 @@ public static PlatformSender permitted(String... permissions) { .build(); } + public boolean hasPermission(String permission) { + if (this.permittedAll) { + return true; + } + + return this.permissions.contains(permission); + } + public static class Builder { - private final TestPlatformSender sender = new TestPlatformSender(); + private final TestPlatformSender sender = new TestPlatformSender(new TestSender()); public Builder permission(String permission) { this.sender.permissions.add(permission); diff --git a/litecommands-unit/src/dev/rollczi/litecommands/unit/TestUtil.java b/litecommands-unit/src/dev/rollczi/litecommands/unit/TestUtil.java index 2a22917ea..11f42015b 100644 --- a/litecommands-unit/src/dev/rollczi/litecommands/unit/TestUtil.java +++ b/litecommands-unit/src/dev/rollczi/litecommands/unit/TestUtil.java @@ -1,7 +1,9 @@ package dev.rollczi.litecommands.unit; import dev.rollczi.litecommands.argument.parser.input.ParseableInput; +import dev.rollczi.litecommands.identifier.Identifier; import dev.rollczi.litecommands.invocation.Invocation; +import dev.rollczi.litecommands.platform.AbstractPlatformSender; public final class TestUtil { @@ -9,11 +11,34 @@ private TestUtil() { } public static Invocation invocation(String command, String... args) { - return new Invocation<>(new TestSender(), new TestPlatformSender(), command, command, ParseableInput.raw(args)); + return new Invocation<>(new TestPlatformSender(new TestSender()), command, command, ParseableInput.raw(args)); } public static Invocation invocation(SENDER sender, String command, String... args) { - return new Invocation<>(sender, new TestPlatformSender(), command, command, ParseableInput.raw(args)); + return new Invocation<>(new WrapperPlatformSender(sender), command, command, ParseableInput.raw(args)); + } + + private static class WrapperPlatformSender extends AbstractPlatformSender { + private final Object sender; + + public WrapperPlatformSender(Object sender) { + this.sender = sender; + } + + @Override + public Object getHandle() { + return sender; + } + + @Override + public String getName() { + return sender.getClass().getSimpleName(); + } + + @Override + public Identifier getIdentifier() { + return Identifier.of(sender); + } } } diff --git a/litecommands-unit/src/dev/rollczi/litecommands/unit/annotations/LiteTestSpec.java b/litecommands-unit/src/dev/rollczi/litecommands/unit/annotations/LiteTestSpec.java index f5daa8cce..7c7b0a4a7 100644 --- a/litecommands-unit/src/dev/rollczi/litecommands/unit/annotations/LiteTestSpec.java +++ b/litecommands-unit/src/dev/rollczi/litecommands/unit/annotations/LiteTestSpec.java @@ -6,6 +6,8 @@ import dev.rollczi.litecommands.annotations.LiteCommandsAnnotations; import dev.rollczi.litecommands.annotations.command.RootCommand; import dev.rollczi.litecommands.annotations.command.Command; +import dev.rollczi.litecommands.permission.PermissionResolver; +import dev.rollczi.litecommands.unit.TestPlatformSender; import dev.rollczi.litecommands.unit.TestSettings; import dev.rollczi.litecommands.unit.TestPlatform; import dev.rollczi.litecommands.unit.TestSender; @@ -41,6 +43,10 @@ public static void beforeAll(TestInfo testInfo) { liteCommands = configureLiteTest(LiteCommandsFactory.builder(TestSender.class, platform) .commands(LiteCommandsAnnotations.ofClasses(commands)) + .permissionResolver(PermissionResolver.createDefault((platformSender, permission) -> { + TestPlatformSender sender = (TestPlatformSender) platformSender; + return sender.hasPermission(permission); + })) .exceptionUnexpected((invocation, exception, chain) -> {}), type) .argument(BlockingArgument.class, new BlockingArgumentResolver<>()) .build(); From aa99d3255ce9ec0f8626a92626efee8e295c87f3 Mon Sep 17 00:00:00 2001 From: Rollczi Date: Sun, 2 Mar 2025 18:33:57 +0100 Subject: [PATCH 5/5] simplify my own code --- .../fabric/server/ServerExampleFabric.java | 14 +---- .../fabric/server/FabricServerSender.java | 14 ++--- .../luckperms/LuckPermsPermissionFactory.java | 55 ++++--------------- 3 files changed, 18 insertions(+), 65 deletions(-) diff --git a/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/ServerExampleFabric.java b/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/ServerExampleFabric.java index 983e1ccd0..8bfbf65da 100644 --- a/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/ServerExampleFabric.java +++ b/examples/fabric/src/main/java/dev/rollczi/example/fabric/server/ServerExampleFabric.java @@ -4,24 +4,12 @@ import dev.rollczi.litecommands.fabric.LiteFabricFactory; import dev.rollczi.litecommands.luckperms.LuckPermsPermissionFactory; import net.fabricmc.api.DedicatedServerModInitializer; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.command.ServerCommandSource; public class ServerExampleFabric implements DedicatedServerModInitializer { @Override public void onInitializeServer() { LiteFabricFactory.server() - .permissionResolver(LuckPermsPermissionFactory.create(ServerCommandSource.class, (sender) -> { - if (sender.isExecutedByPlayer()) { - return sender.getPlayer().getUuid(); - } - - if (sender.output instanceof MinecraftServer) { - return LuckPermsPermissionFactory.CONSOLE; - } - - return null; - })) + .permissionResolver(new LuckPermsPermissionFactory()) .commands(new ExampleCommand()) .build(); } diff --git a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerSender.java b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerSender.java index 9ff20755a..607f527c5 100644 --- a/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerSender.java +++ b/litecommands-fabric/src/main/java/dev/rollczi/litecommands/fabric/server/FabricServerSender.java @@ -5,9 +5,6 @@ import net.minecraft.entity.Entity; import net.minecraft.server.command.ServerCommandSource; -import java.util.ArrayList; -import java.util.List; - public class FabricServerSender extends AbstractPlatformSender { private final ServerCommandSource source; @@ -23,18 +20,17 @@ public String getName() { @Override public Identifier getIdentifier() { - List list = new ArrayList<>(); - list.add(source.getName()); Entity entity = source.getEntity(); - if (entity != null) { - list.add(entity.getUuid()); + if (entity == null) { + return Identifier.CONSOLE; } - return Identifier.of(list.toArray()); + + return Identifier.of(source.getName(), entity.getUuid()); } @Override public Object getHandle() { - return (SENDER) this.source; + return this.source; } } diff --git a/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsPermissionFactory.java b/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsPermissionFactory.java index 1eaf198a6..fcbb047a9 100644 --- a/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsPermissionFactory.java +++ b/litecommands-luckperms/src/dev/rollczi/litecommands/luckperms/LuckPermsPermissionFactory.java @@ -1,44 +1,37 @@ package dev.rollczi.litecommands.luckperms; -import dev.rollczi.litecommands.permission.PermissionResolver; +import dev.rollczi.litecommands.identifier.Identifier; +import dev.rollczi.litecommands.permission.PermissionDefaultResolver; import dev.rollczi.litecommands.platform.PlatformSender; -import java.util.function.BiPredicate; import net.luckperms.api.LuckPermsProvider; import net.luckperms.api.model.user.User; import net.luckperms.api.model.user.UserManager; import net.luckperms.api.query.QueryOptions; import java.util.UUID; -import java.util.function.Function; import java.util.function.Supplier; -import org.jetbrains.annotations.Nullable; -public class LuckPermsPermissionFactory { - - public static final UUID CONSOLE = new UUID(0, 0); +public class LuckPermsPermissionFactory extends PermissionDefaultResolver { private static final Supplier USER_MANAGER = () -> LuckPermsProvider.get().getUserManager(); - public static PermissionResolver create(Class playerType, Class consoleType, Function uuidProvider) { - return PermissionResolver.createDefault(new ComplexResolver<>(playerType, consoleType, uuidProvider)); - } - - public static PermissionResolver create(Class senderType, Function uuidProvider) { - return PermissionResolver.createDefault(senderType, (sender, permission) -> hasPermission(uuidProvider.apply(sender), permission)); + public LuckPermsPermissionFactory() { + super((sender, permission) -> hasPermission(sender, permission)); } - private static boolean hasPermission(UUID sender, String permission) { - if (sender == null) { - return false; - } - if (CONSOLE.equals(sender)) { + private static boolean hasPermission(PlatformSender platformSender, String permission) { + Identifier identifier = platformSender.getIdentifier(); + if (identifier.equals(Identifier.CONSOLE)) { return true; } + UUID sender = identifier.getIdentifier(UUID.class) + .orElseThrow(() -> new IllegalArgumentException(platformSender.getHandle().getClass().getSimpleName() + " does not have UUID identifier!")); + UserManager userManager = USER_MANAGER.get(); User user = userManager.isLoaded(sender) ? userManager.getUser(sender) - : userManager.loadUser(sender).join(); + : userManager.loadUser(sender).join(); // TODO: Handle async if (user == null) { return false; @@ -47,28 +40,4 @@ private static boolean hasPermission(UUID sender, String permission) { return user.getCachedData().getPermissionData(QueryOptions.nonContextual()).checkPermission(permission).asBoolean(); } - private static class ComplexResolver implements BiPredicate { - private final Class playerType; - private final Class consoleType; - private final Function uuidProvider; - - public ComplexResolver(Class playerType, Class consoleType, Function uuidProvider) { - this.playerType = playerType; - this.consoleType = consoleType; - this.uuidProvider = uuidProvider; - } - - @Override - public boolean test(PlatformSender sender, String permission) { - Object handle = sender.getHandle(); - if (playerType.isAssignableFrom(handle.getClass())) { - PLAYER player = playerType.cast(handle); - UUID uuid = uuidProvider.apply(player); - return hasPermission(uuid, permission); - } - - return consoleType.isAssignableFrom(handle.getClass()); - } - } - }