Skip to content

Commit 209f55e

Browse files
GH-519 Improved PermissionResolver and added support for LuckPerms (#519)
* fabric implements PermissionResolver * Implement support for luckperms * Update fabric.mod.json * Remove the declaration of accesswinder from the build script of example fabric * Use permission service by other platforms * Add the option to choose lazy/blocking mode for LuckPermsPermissionResolver * Add modmenu and update icons * Fabric platform support for PermissionService * Add nativePermission option to LiteFabricSettings. Fix suggestions based on permissions for fabric --------- Co-authored-by: Rollczi <[email protected]>
1 parent e81ce2a commit 209f55e

File tree

113 files changed

+1099
-661
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+1099
-661
lines changed

.github/TODO.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ TODO
66
- [x] @Async @Execute
77
- [ ] @Timeout(second = 10)
88
- [x] @Arg
9-
- [x] @Arg Option<T>
9+
- [x] @Arg Optional<T>
1010
- [ ] @Arg @Strict Option<T>
1111
- [x] @Arg Optional<T>
1212
- [x] @Arg CompletableFuture<User>
@@ -22,7 +22,7 @@ TODO
2222
- [x] @Arg Set<T> // for example 1, 4, 5
2323
- [ ] @Arg Map<K, V> // for example key1=value1, key2=value2 // do wyrzucenia chyba
2424
- [ ] @Suggest
25-
- [ ] @Literal
25+
- [x] @Literal
2626
- [x] @Validate(validator = MyValidator.class)
2727
- [x] @Cooldown - Określa cza s, przez który użytkownik nie może ponownie użyć danej komendy po jej wykonaniu.
2828
- [ ] @Cooldown(second = 10, bypass = "myplugin.bypass.cooldown", scope = CooldownScope.GLOBAL)
@@ -362,5 +362,17 @@ Command banCommand = new Command("ban")
362362
}
363363
}
364364

365+
class Main {
366+
367+
public static void main(String[] args) {
368+
369+
LiteCommands liteCommands = LiteBukkitPlatform.create()
370+
.commands(new BanCommand())
371+
.argument();
372+
373+
374+
}
375+
376+
}
365377

366378
```

buildSrc/src/main/kotlin/Versions.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,7 @@ object Versions {
5252
const val HIBERNATE_VALIDATOR = "8.0.2.Final"
5353
const val EXPRESSLY = "5.0.0"
5454

55+
// LuckPerms
56+
const val LUCKPERMS_API = "5.4"
57+
5558
}

examples/fabric/build.gradle.kts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ repositories {
1212
mavenCentral()
1313
maven("https://repo.panda-lang.org/releases/")
1414
maven("https://maven.fabricmc.net/")
15+
maven("https://api.modrinth.com/maven")
16+
maven("https://maven.terraformersmc.com/releases/")
1517
}
1618

1719
dependencies {
@@ -21,12 +23,17 @@ dependencies {
2123
modImplementation("net.fabricmc:fabric-loader:0.16.7")
2224
modImplementation("net.fabricmc.fabric-api:fabric-api:0.106.0+1.21.1")
2325

24-
// modImplementation("dev.rollczi:litecommands-fabric:3.9.7") // <-- uncomment in your project
25-
implementation(project(path = ":litecommands-fabric", configuration = "namedElements"))
26+
modLocalRuntime("maven.modrinth:fabric-permissions-api:0.3.3")
27+
modLocalRuntime("maven.modrinth:luckperms:v5.4.140-fabric")
28+
modLocalRuntime("com.terraformersmc:modmenu:11.0.3")
2629

30+
// modImplementation("dev.rollczi:litecommands-fabric:3.9.7") <-- uncomment in your project
31+
// modImplementation("dev.rollczi:litecommands-luckperms:3.9.7") <-- uncomment in your project
32+
implementation(project(path = ":litecommands-fabric", configuration = "namedElements")) // <-- REMOVE THIS
33+
implementation(project(":litecommands-luckperms")) // <-- REMOVE THIS
2734
}
2835

2936
sourceSets.test {
3037
java.setSrcDirs(emptyList<String>())
3138
resources.setSrcDirs(emptyList<String>())
32-
}
39+
}

examples/fabric/src/main/java/dev/rollczi/example/fabric/server/ServerExampleFabric.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
import dev.rollczi.example.fabric.server.command.ExampleCommand;
44
import dev.rollczi.litecommands.fabric.LiteFabricFactory;
5+
import dev.rollczi.litecommands.luckperms.LuckPermsPermissionResolver;
56
import net.fabricmc.api.DedicatedServerModInitializer;
67

78
public class ServerExampleFabric implements DedicatedServerModInitializer {
89
@Override
910
public void onInitializeServer() {
1011
LiteFabricFactory.server()
11-
.commands(new ExampleCommand())
12-
.build();
12+
.permissionResolver(LuckPermsPermissionResolver.lazy())
13+
.commands(new ExampleCommand())
14+
.build();
1315
}
1416
}

examples/fabric/src/main/java/dev/rollczi/example/fabric/server/command/ExampleCommand.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
import dev.rollczi.litecommands.annotations.argument.Arg;
44
import dev.rollczi.litecommands.annotations.async.Async;
55
import dev.rollczi.litecommands.annotations.command.Command;
6+
import dev.rollczi.litecommands.annotations.context.Context;
67
import dev.rollczi.litecommands.annotations.execute.Execute;
78
import dev.rollczi.litecommands.annotations.join.Join;
9+
import dev.rollczi.litecommands.annotations.permission.Permission;
810
import dev.rollczi.litecommands.annotations.quoted.Quoted;
11+
import dev.rollczi.litecommands.platform.PlatformSender;
912
import net.minecraft.server.network.ServerPlayerEntity;
1013
import net.minecraft.text.Text;
1114

@@ -31,4 +34,11 @@ String thread1() {
3134
String thread2() {
3235
return Thread.currentThread().getName();
3336
}
37+
38+
@Execute(name = "admin")
39+
@Permission("permission.admin")
40+
String admin(@Context PlatformSender sender) {
41+
return "Hi " + sender.getName() + ", you have permission!";
42+
}
43+
3444
}
Loading

examples/fabric/src/main/resources/fabric.mod.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,8 @@
2121
"client": [
2222
"dev.rollczi.example.fabric.client.ClientExampleFabric"
2323
]
24+
},
25+
"depends": {
26+
"luckperms": "*"
2427
}
2528
}

litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/AnnotatedValidator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import java.lang.annotation.Annotation;
99

10+
@Deprecated
1011
@FunctionalInterface
1112
public interface AnnotatedValidator<SENDER, T, A extends Annotation> {
1213

litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/AnnotatedValidatorProcessor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.lang.annotation.Annotation;
88

9+
@Deprecated
910
public class AnnotatedValidatorProcessor<SENDER, T, A extends Annotation> implements AnnotationProcessor<SENDER> {
1011

1112
private final Class<A> annotationClass;

litecommands-annotations/src/dev/rollczi/litecommands/annotations/validator/requirment/RequirementAnnotatedValidatorImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import java.lang.annotation.Annotation;
1010

11+
@Deprecated
1112
class RequirementAnnotatedValidatorImpl<SENDER, T, A extends Annotation> implements RequirementValidator<SENDER, T> {
1213

1314
private final AnnotatedValidator<SENDER, T, A> validator;

litecommands-bukkit/src/dev/rollczi/litecommands/bukkit/BukkitCommand.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import dev.rollczi.litecommands.command.CommandRoute;
55
import dev.rollczi.litecommands.invocation.Invocation;
66
import dev.rollczi.litecommands.permission.MissingPermissions;
7+
import dev.rollczi.litecommands.permission.PermissionService;
78
import dev.rollczi.litecommands.platform.PlatformInvocationListener;
89
import dev.rollczi.litecommands.platform.PlatformSender;
910
import dev.rollczi.litecommands.platform.PlatformSuggestionListener;
@@ -31,14 +32,17 @@ public class BukkitCommand extends Command {
3132
private final CommandRoute<CommandSender> commandRoute;
3233
private final PlatformInvocationListener<CommandSender> invocationHook;
3334
private final PlatformSuggestionListener<CommandSender> suggestionHook;
35+
private final PermissionService permissionService;
36+
3437
private boolean syncTabComplete = false;
3538

36-
BukkitCommand(LiteBukkitSettings settings, CommandRoute<CommandSender> commandRoute, PlatformInvocationListener<CommandSender> invocationHook, PlatformSuggestionListener<CommandSender> suggestionHook) {
39+
BukkitCommand(LiteBukkitSettings settings, CommandRoute<CommandSender> commandRoute, PlatformInvocationListener<CommandSender> invocationHook, PlatformSuggestionListener<CommandSender> suggestionHook, PermissionService permissionService) {
3740
super(commandRoute.getName(), "", "/" + commandRoute.getName(), commandRoute.getAliases());
3841
this.settings = settings;
3942
this.commandRoute = commandRoute;
4043
this.invocationHook = invocationHook;
4144
this.suggestionHook = suggestionHook;
45+
this.permissionService = permissionService;
4246
}
4347

4448
public void setSyncTabComplete(boolean syncTabComplete) {
@@ -50,7 +54,7 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String alias, Str
5054
ParseableInput<?> input = ParseableInput.raw(args);
5155
PlatformSender platformSender = new BukkitPlatformSender(sender);
5256

53-
this.invocationHook.execute(new Invocation<>(sender, platformSender, commandRoute.getName(), alias, input), input);
57+
this.invocationHook.execute(new Invocation<>(platformSender, commandRoute.getName(), alias, input), input);
5458
return true;
5559
}
5660

@@ -83,7 +87,7 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String alias, Str
8387
public CompletableFuture<Set<Suggestion>> suggest(CommandSender sender, String alias, String[] args) {
8488
SuggestionInput<?> input = SuggestionInput.raw(args);
8589
PlatformSender platformSender = new BukkitPlatformSender(sender);
86-
Invocation<CommandSender> invocation = new Invocation<>(sender, platformSender, commandRoute.getName(), alias, input);
90+
Invocation<CommandSender> invocation = new Invocation<>(platformSender, commandRoute.getName(), alias, input);
8791

8892
return CompletableFuture.completedFuture(this.suggestionHook.suggest(invocation, input).getSuggestions()); // TODO Run suggestion asynchronously inside LiteCommands platform
8993
}
@@ -94,9 +98,7 @@ public boolean testPermissionSilent(@NotNull CommandSender target) {
9498
return super.testPermissionSilent(target);
9599
}
96100

97-
MissingPermissions check = MissingPermissions.check(new BukkitPlatformSender(target), commandRoute);
98-
99-
return check.isPermitted();
101+
return permissionService.isPermitted(new BukkitPlatformSender(target), commandRoute);
100102
}
101103

102104
public CommandRoute<CommandSender> getCommandRoute() {

litecommands-bukkit/src/dev/rollczi/litecommands/bukkit/BukkitPlatform.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.rollczi.litecommands.bukkit;
22

33
import dev.rollczi.litecommands.command.CommandRoute;
4+
import dev.rollczi.litecommands.permission.PermissionService;
45
import dev.rollczi.litecommands.platform.AbstractSimplePlatform;
56
import dev.rollczi.litecommands.platform.Platform;
67
import dev.rollczi.litecommands.platform.PlatformInvocationListener;
@@ -9,13 +10,16 @@
910

1011
class BukkitPlatform extends AbstractSimplePlatform<CommandSender, LiteBukkitSettings> implements Platform<CommandSender, LiteBukkitSettings> {
1112

12-
BukkitPlatform(LiteBukkitSettings settings) {
13+
private final PermissionService permissionService;
14+
15+
BukkitPlatform(LiteBukkitSettings settings, PermissionService permissionService) {
1316
super(settings, sender -> new BukkitPlatformSender(sender));
17+
this.permissionService = permissionService;
1418
}
1519

1620
@Override
1721
protected void hook(CommandRoute<CommandSender> commandRoute, PlatformInvocationListener<CommandSender> invocationHook, PlatformSuggestionListener<CommandSender> suggestionHook) {
18-
BukkitCommand bukkitSimpleCommand = new BukkitCommand(settings, commandRoute, invocationHook, suggestionHook);
22+
BukkitCommand bukkitSimpleCommand = new BukkitCommand(settings, commandRoute, invocationHook, suggestionHook, permissionService);
1923

2024
this.settings.tabCompleter().register(settings.fallbackPrefix(), bukkitSimpleCommand);
2125
this.settings.commandsRegistry().register(commandRoute.getName(), settings.fallbackPrefix(), bukkitSimpleCommand);

litecommands-bukkit/src/dev/rollczi/litecommands/bukkit/BukkitPlatformSender.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,6 @@ public BukkitPlatformSender(CommandSender handle) {
1515
this.handle = handle;
1616
}
1717

18-
@Override
19-
public boolean hasPermission(String permission) {
20-
return this.handle.hasPermission(permission);
21-
}
22-
2318
@Override
2419
public String getName() {
2520
return this.handle.getName();
@@ -49,9 +44,13 @@ public Identifier getIdentifier() {
4944
}
5045

5146
@Override
52-
public Comparable<Void> sendMessage(String message) {
47+
public Object getHandle() {
48+
return this.handle;
49+
}
50+
51+
@Override
52+
public void sendMessage(String message) {
5353
this.handle.sendMessage(message);
54-
return null;
5554
}
5655

5756
}

litecommands-bukkit/src/dev/rollczi/litecommands/bukkit/LiteBukkitFactory.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.rollczi.litecommands.bukkit;
22

3+
import dev.rollczi.litecommands.LiteCommandsBaseBuilder;
34
import dev.rollczi.litecommands.LiteCommandsBuilder;
45
import dev.rollczi.litecommands.LiteCommandsFactory;
56
import dev.rollczi.litecommands.bukkit.argument.LocationArgument;
@@ -14,6 +15,9 @@
1415
import dev.rollczi.litecommands.bukkit.context.WorldContext;
1516
import dev.rollczi.litecommands.bukkit.util.BukkitFallbackPrefixUtil;
1617
import dev.rollczi.litecommands.message.MessageRegistry;
18+
import dev.rollczi.litecommands.permission.PermissionResolver;
19+
import dev.rollczi.litecommands.platform.Platform;
20+
import dev.rollczi.litecommands.platform.PlatformSettings;
1721
import dev.rollczi.litecommands.reflect.type.TypeRange;
1822
import org.bukkit.Location;
1923
import org.bukkit.OfflinePlayer;
@@ -25,6 +29,7 @@
2529
import org.bukkit.plugin.Plugin;
2630
import org.bukkit.plugin.java.JavaPlugin;
2731
import org.bukkit.scheduler.BukkitScheduler;
32+
import org.jetbrains.annotations.NotNull;
2833

2934
public final class LiteBukkitFactory {
3035

@@ -56,12 +61,20 @@ public static <B extends LiteCommandsBuilder<CommandSender, LiteBukkitSettings,
5661
return builder(plugin, server, settings);
5762
}
5863

64+
5965
@SuppressWarnings("unchecked")
6066
public static <B extends LiteCommandsBuilder<CommandSender, LiteBukkitSettings, B>> B builder(Plugin plugin, Server server, LiteBukkitSettings settings) {
61-
return (B) LiteCommandsFactory.builder(CommandSender.class, new BukkitPlatform(settings)).self((builder, internal) -> {
67+
return (B) builder0(plugin, server, settings);
68+
}
69+
70+
@SuppressWarnings("unchecked")
71+
private static <B extends LiteCommandsBaseBuilder<CommandSender, LiteBukkitSettings, B>> B builder0(Plugin plugin, Server server, LiteBukkitSettings settings) {
72+
return LiteCommandsFactory.<CommandSender, LiteBukkitSettings, B>builder(CommandSender.class, builder -> new BukkitPlatform(settings, builder.getPermissionService())).self((builder, internal) -> {
6273
MessageRegistry<CommandSender> messageRegistry = internal.getMessageRegistry();
6374

6475
builder
76+
.permissionResolver(PermissionResolver.createDefault(CommandSender.class, (sender, permission) -> sender.hasPermission(permission)))
77+
6578
.bind(Plugin.class, () -> plugin)
6679
.bind(Server.class, () -> server)
6780
.bind(BukkitScheduler.class, () -> server.getScheduler())

litecommands-bungee/src/dev/rollczi/litecommands/bungee/BungeeCommand.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import dev.rollczi.litecommands.invocation.Invocation;
66
import dev.rollczi.litecommands.meta.Meta;
77
import dev.rollczi.litecommands.permission.MissingPermissions;
8+
import dev.rollczi.litecommands.permission.PermissionService;
89
import dev.rollczi.litecommands.platform.PlatformInvocationListener;
910
import dev.rollczi.litecommands.platform.PlatformSuggestionListener;
1011
import dev.rollczi.litecommands.argument.suggester.input.SuggestionInput;
@@ -17,14 +18,16 @@
1718
class BungeeCommand extends Command implements TabExecutor {
1819

1920
private final LiteBungeeSettings settings;
21+
private final PermissionService permissionService;
2022
private final CommandRoute<CommandSender> commandSection;
2123
private final String label;
2224
private final PlatformInvocationListener<CommandSender> executeListener;
2325
private final PlatformSuggestionListener<CommandSender> suggestionListener;
2426

25-
public BungeeCommand(LiteBungeeSettings settings, CommandRoute<CommandSender> command, String label, PlatformInvocationListener<CommandSender> executeListener, PlatformSuggestionListener<CommandSender> suggestionListener) {
27+
public BungeeCommand(LiteBungeeSettings settings, PermissionService permissionService, CommandRoute<CommandSender> command, String label, PlatformInvocationListener<CommandSender> executeListener, PlatformSuggestionListener<CommandSender> suggestionListener) {
2628
super(label, "", label);
2729
this.settings = settings;
30+
this.permissionService = permissionService;
2831
this.commandSection = command;
2932
this.label = label;
3033
this.executeListener = executeListener;
@@ -35,7 +38,7 @@ public BungeeCommand(LiteBungeeSettings settings, CommandRoute<CommandSender> co
3538
public void execute(CommandSender sender, String[] args) {
3639
ParseableInput<?> input = ParseableInput.raw(args);
3740
BungeeSender platformSender = new BungeeSender(sender);
38-
Invocation<CommandSender> invocation = new Invocation<>(sender, platformSender, this.commandSection.getName(), this.label, input);
41+
Invocation<CommandSender> invocation = new Invocation<>(platformSender, this.commandSection.getName(), this.label, input);
3942

4043
this.executeListener.execute(invocation, input);
4144
}
@@ -44,7 +47,7 @@ public void execute(CommandSender sender, String[] args) {
4447
public Iterable<String> onTabComplete(CommandSender sender, String[] args) {
4548
SuggestionInput<?> input = SuggestionInput.raw(args);
4649
BungeeSender platformSender = new BungeeSender(sender);
47-
Invocation<CommandSender> invocation = new Invocation<>(sender, platformSender, this.commandSection.getName(), this.label, input);
50+
Invocation<CommandSender> invocation = new Invocation<>(platformSender, this.commandSection.getName(), this.label, input);
4851

4952
return this.suggestionListener.suggest(invocation, input)
5053
.asMultiLevelList();
@@ -55,9 +58,7 @@ public boolean hasPermission(CommandSender sender) {
5558
boolean isNative = commandSection.meta().get(Meta.NATIVE_PERMISSIONS);
5659

5760
if (isNative || settings.isNativePermissions()) {
58-
MissingPermissions missingPermissions = MissingPermissions.check(new BungeeSender(sender), this.commandSection);
59-
60-
return missingPermissions.isPermitted();
61+
return permissionService.isPermitted(new BungeeSender(sender), this.commandSection);
6162
}
6263

6364
return super.hasPermission(sender);

litecommands-bungee/src/dev/rollczi/litecommands/bungee/BungeePlatform.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.rollczi.litecommands.bungee;
22

33
import dev.rollczi.litecommands.command.CommandRoute;
4+
import dev.rollczi.litecommands.permission.PermissionService;
45
import dev.rollczi.litecommands.platform.AbstractSimplePlatform;
56
import dev.rollczi.litecommands.platform.PlatformInvocationListener;
67
import dev.rollczi.litecommands.platform.PlatformSuggestionListener;
@@ -17,17 +18,19 @@ class BungeePlatform extends AbstractSimplePlatform<CommandSender, LiteBungeeSet
1718

1819
private final Plugin plugin;
1920
private final PluginManager pluginManager;
21+
private final PermissionService permissionService;
2022

21-
public BungeePlatform(Plugin plugin, LiteBungeeSettings liteBungeeSettings) {
23+
public BungeePlatform(Plugin plugin, LiteBungeeSettings liteBungeeSettings, PermissionService permissionService) {
2224
super(liteBungeeSettings, sender -> new BungeeSender(sender));
2325
this.plugin = plugin;
2426
this.pluginManager = plugin.getProxy().getPluginManager();
27+
this.permissionService = permissionService;
2528
}
2629

2730
@Override
2831
protected void hook(CommandRoute<CommandSender> commandRoute, PlatformInvocationListener<CommandSender> invocationHook, PlatformSuggestionListener<CommandSender> suggestionHook) {
2932
for (String label : commandRoute.names()) {
30-
BungeeCommand command = new BungeeCommand(settings, commandRoute, label, invocationHook, suggestionHook);
33+
BungeeCommand command = new BungeeCommand(settings, permissionService, commandRoute, label, invocationHook, suggestionHook);
3134

3235
pluginManager.registerCommand(this.plugin, command);
3336
}

0 commit comments

Comments
 (0)