Skip to content

Commit 24fbcec

Browse files
committed
Add LuckPerms hook
1 parent b4346be commit 24fbcec

7 files changed

Lines changed: 141 additions & 3 deletions

File tree

common/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ dependencies {
1212
implementation "org.yaml:snakeyaml:2.2"
1313

1414
compileOnly "net.kyori:adventure-api:4.17.0"
15+
compileOnly "net.luckperms:api:5.4"
1516
}
1617

1718
shadowJar {

common/src/main/java/com/cssbham/cssminecraft/common/AbstractCSSMinecraftPlugin.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import com.cssbham.cssminecraft.common.handler.PlayerQuitEventHandler;
2121
import com.cssbham.cssminecraft.common.handler.ServerMessageEventHandler;
2222
import com.cssbham.cssminecraft.common.logger.Logger;
23+
import com.cssbham.cssminecraft.common.permission.PermissionPluginService;
24+
import com.cssbham.cssminecraft.common.permission.PermissionPluginServiceFactory;
2325

2426
import java.nio.file.Path;
2527

@@ -59,9 +61,10 @@ public void enable() {
5961
eventBus.subscribe(PlayerQuitEvent.class, new PlayerQuitEventHandler(discordClientService));
6062
eventBus.subscribe(DiscordMessageEvent.class, new DiscordMessageEventHandler(provideServerChatAdapter()));
6163

64+
PermissionPluginService permissionPluginService = PermissionPluginServiceFactory.any();
6265
CommandService commandService = provideCommandService();
6366

64-
commandService.register("makegreen", new MakeGreenCommandHandler(discordClientService), "mg", "green");
67+
commandService.register("makegreen", new MakeGreenCommandHandler(discordClientService, permissionPluginService), "mg", "green");
6568
}
6669

6770
@Override

common/src/main/java/com/cssbham/cssminecraft/common/command/handler/MakeGreenCommandHandler.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,31 @@
44
import com.cssbham.cssminecraft.common.command.CommandHandler;
55
import com.cssbham.cssminecraft.common.command.CommandSender;
66
import com.cssbham.cssminecraft.common.discord.DiscordClientService;
7+
import com.cssbham.cssminecraft.common.permission.PermissionPluginService;
78
import net.kyori.adventure.text.Component;
89
import net.kyori.adventure.text.event.ClickEvent;
910
import net.kyori.adventure.text.format.NamedTextColor;
1011
import net.kyori.adventure.text.format.TextDecoration;
1112

13+
import java.util.concurrent.ExecutionException;
14+
1215
public class MakeGreenCommandHandler implements CommandHandler {
1316

1417
private final DiscordClientService discordClientService;
18+
private final PermissionPluginService permissionPluginService;
1519

16-
public MakeGreenCommandHandler(DiscordClientService discordClientService) {
20+
public MakeGreenCommandHandler(DiscordClientService discordClientService, PermissionPluginService permissionPluginService) {
1721
this.discordClientService = discordClientService;
22+
this.permissionPluginService = permissionPluginService;
1823
}
1924

2025
@Override
2126
public void handle(CommandSender sender, CommandContext context) {
27+
if (!permissionPluginService.isAvailable()) {
28+
sender.sendMessage(Component.text("There is no permissions plugin available.").color(NamedTextColor.RED));
29+
return;
30+
}
31+
2232
if (sender.isConsole()) {
2333
sender.sendMessage(Component.text("Only players may use this command.").color(NamedTextColor.RED));
2434
return;
@@ -31,7 +41,14 @@ public void handle(CommandSender sender, CommandContext context) {
3141
}
3242

3343
if (discordClientService.getDiscordClient().isMember(arg)) {
34-
//TODO the luckperms stuff
44+
sender.sendMessage(Component.text("Making you green...").color(NamedTextColor.GRAY));
45+
try {
46+
permissionPluginService.grantMemberRole(sender.getUuid()).get();
47+
} catch (InterruptedException | ExecutionException e) {
48+
sender.sendMessage(Component.text("There was a problem making you green. Try again later.")
49+
.color(NamedTextColor.RED));
50+
throw new RuntimeException(e);
51+
}
3552
sender.sendMessage(Component.text("Congratulations, you are now green!").color(NamedTextColor.GREEN));
3653
} else {
3754
sender.sendMessage(Component.text("You don't appear to be a ").color(NamedTextColor.RED).append(
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.cssbham.cssminecraft.common.permission;
2+
3+
import net.luckperms.api.LuckPerms;
4+
import net.luckperms.api.LuckPermsProvider;
5+
import net.luckperms.api.node.Node;
6+
7+
import java.util.UUID;
8+
import java.util.concurrent.CompletableFuture;
9+
10+
/**
11+
* {@link PermissionPluginService} implementation for LuckPerms
12+
*/
13+
public class LuckPermsPermissionPluginService implements PermissionPluginService {
14+
15+
@Override
16+
public CompletableFuture<Void> grantMemberRole(UUID player) {
17+
LuckPerms perms = LuckPermsProvider.get();
18+
return perms.getUserManager().modifyUser(player,
19+
user -> {
20+
user.data().add(Node.builder("group.member").build());
21+
user.data().remove(Node.builder("group.guest").build());
22+
}
23+
);
24+
}
25+
26+
@Override
27+
public boolean isAvailable() {
28+
return true;
29+
}
30+
31+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.cssbham.cssminecraft.common.permission;
2+
3+
import java.util.UUID;
4+
import java.util.concurrent.CompletableFuture;
5+
6+
/**
7+
* A permission plugin service. This service wraps the function calls
8+
* of a permissions plugin.
9+
*/
10+
public interface PermissionPluginService {
11+
12+
/**
13+
* Grant the Member role to a player
14+
*
15+
* @param player the player uuid
16+
* @return a future
17+
*/
18+
CompletableFuture<Void> grantMemberRole(UUID player);
19+
20+
/**
21+
* Get whether the service is usable
22+
*
23+
* @return true if it can be used, false otherwise
24+
*/
25+
boolean isAvailable();
26+
27+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.cssbham.cssminecraft.common.permission;
2+
3+
import java.lang.reflect.InvocationTargetException;
4+
5+
/**
6+
* Factory methods for getting a {@link PermissionPluginService}
7+
*/
8+
public class PermissionPluginServiceFactory {
9+
10+
public static PermissionPluginService any() {
11+
String[] plugins = new String[]{ "LuckPerms" };
12+
for (String plugin : plugins) {
13+
try {
14+
return forPlugin(plugin);
15+
} catch (RuntimeException ignored) { }
16+
}
17+
return new StubPermissionPluginService();
18+
}
19+
20+
public static PermissionPluginService forPlugin(String plugin) {
21+
try {
22+
return switch (plugin) {
23+
case "LuckPerms" -> checkClassAndBuild("net.luckperms.api.LuckPermsProvider", LuckPermsPermissionPluginService.class);
24+
default -> new StubPermissionPluginService();
25+
};
26+
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException |
27+
InvocationTargetException e) {
28+
throw new RuntimeException(String.format("Permission plugin %s is not available", plugin));
29+
}
30+
}
31+
32+
private static PermissionPluginService checkClassAndBuild(String className, Class<? extends PermissionPluginService> clazz)
33+
throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
34+
Class.forName(className);
35+
return clazz.getDeclaredConstructor().newInstance();
36+
}
37+
38+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.cssbham.cssminecraft.common.permission;
2+
3+
import java.util.UUID;
4+
import java.util.concurrent.CompletableFuture;
5+
6+
/**
7+
* A stub permission plugin service, for when no plugin is available
8+
*/
9+
public class StubPermissionPluginService implements PermissionPluginService {
10+
11+
@Override
12+
public CompletableFuture<Void> grantMemberRole(UUID player) {
13+
throw new UnsupportedOperationException("No permission plugin available!");
14+
}
15+
16+
@Override
17+
public boolean isAvailable() {
18+
return false;
19+
}
20+
21+
}

0 commit comments

Comments
 (0)