From 0def5ca6b5c78f7afa7e728129612f5878dd8209 Mon Sep 17 00:00:00 2001 From: Luck Date: Wed, 22 Dec 2021 23:32:09 +0000 Subject: Update to new Forge permission API --- .../spark/forge/plugin/ForgeServerSparkPlugin.java | 48 +++++++++++++++++++--- 1 file changed, 43 insertions(+), 5 deletions(-) (limited to 'spark-forge/src/main/java') diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java index 5c2f6dd..4a2416f 100644 --- a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java +++ b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java @@ -20,6 +20,7 @@ package me.lucko.spark.forge.plugin; +import com.google.common.collect.ImmutableMap; import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.context.CommandContext; @@ -40,19 +41,26 @@ import me.lucko.spark.forge.ForgeTickReporter; import net.minecraft.commands.CommandSource; import net.minecraft.commands.CommandSourceStack; import net.minecraft.server.MinecraftServer; -import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.server.ServerStoppingEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.server.ServerLifecycleHooks; -import net.minecraftforge.server.permission.DefaultPermissionLevel; import net.minecraftforge.server.permission.PermissionAPI; +import net.minecraftforge.server.permission.events.PermissionGatherEvent; +import net.minecraftforge.server.permission.nodes.PermissionNode; +import net.minecraftforge.server.permission.nodes.PermissionNode.PermissionResolver; +import net.minecraftforge.server.permission.nodes.PermissionTypes; import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; +import java.util.stream.Collectors; import java.util.stream.Stream; public class ForgeServerSparkPlugin extends ForgeSparkPlugin implements Command, SuggestionProvider { @@ -67,10 +75,10 @@ public class ForgeServerSparkPlugin extends ForgeSparkPlugin implements Command< // register commands & permissions CommandDispatcher dispatcher = event.getDispatcher(); registerCommands(dispatcher, plugin, plugin, "spark"); - PermissionAPI.registerNode("spark", DefaultPermissionLevel.OP, "Access to the spark command"); } private final Supplier server; + private Map> registeredPermissions = Collections.emptyMap(); public ForgeServerSparkPlugin(ForgeSparkMod mod, Supplier server) { super(mod); @@ -82,6 +90,28 @@ public class ForgeServerSparkPlugin extends ForgeSparkPlugin implements Command< disable(); } + @SubscribeEvent + public void onPermissionGather(PermissionGatherEvent.Nodes e) { + PermissionResolver defaultValue = (player, playerUUID, context) -> player != null && player.hasPermissions(4); + + // collect all possible permissions + List permissions = this.platform.getCommands().stream() + .map(me.lucko.spark.common.command.Command::primaryAlias) + .collect(Collectors.toList()); + + // special case for the "spark" permission: map it to "spark.all" + permissions.add("all"); + + // register permissions with forge & keep a copy for lookup + ImmutableMap.Builder> builder = ImmutableMap.builder(); + for (String permission : permissions) { + PermissionNode node = new PermissionNode<>("spark", permission, PermissionTypes.BOOLEAN, defaultValue); + e.addNodes(node); + builder.put("spark." + permission, node); + } + this.registeredPermissions = builder.build(); + } + @Override public int run(CommandContext context) throws CommandSyntaxException { String[] args = processArgs(context, false); @@ -115,8 +145,16 @@ public class ForgeServerSparkPlugin extends ForgeSparkPlugin implements Command< @Override public boolean hasPermission(CommandSource sender, String permission) { - if (sender instanceof Player) { - return PermissionAPI.hasPermission((Player) sender, permission); + if (sender instanceof ServerPlayer) { + if (permission.equals("spark")) { + permission = "spark.all"; + } + + PermissionNode permissionNode = this.registeredPermissions.get(permission); + if (permissionNode == null) { + throw new IllegalStateException("spark permission not registered: " + permission); + } + return PermissionAPI.getPermission((ServerPlayer) sender, permissionNode); } else { return true; } -- cgit