From 60f54ef7d42fb42832178b103d8083f51d1c3d86 Mon Sep 17 00:00:00 2001
From: altrisi
Date: Fri, 19 Jan 2024 19:29:48 +0100
Subject: [PATCH 1/4] Permissions API support concept 2
---
src/main/java/carpet/utils/CommandHelper.java | 13 ++++++++++++-
src/main/java/carpet/utils/FabricAPIHooks.java | 14 ++++++++++----
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/src/main/java/carpet/utils/CommandHelper.java b/src/main/java/carpet/utils/CommandHelper.java
index d6825a914f..513dd90c17 100644
--- a/src/main/java/carpet/utils/CommandHelper.java
+++ b/src/main/java/carpet/utils/CommandHelper.java
@@ -36,7 +36,18 @@ public static void notifyPlayersCommandsChanged(MinecraftServer server)
}
}));
}
-
+
+ /**
+ * Whether the given source has the given Permissions API permission if the api is installed, or otherwise the given
+ * permission level as returned by {@link #canUseCommand(CommandSourceStack, Object)}
+ */
+ public static boolean hasPermission(CommandSourceStack source, String permission, Object fallbackLevel) {
+ if (FabricAPIHooks.PERMISSIONS_API) {
+ return FabricAPIHooks.checkPermission(source, permission);
+ }
+ return canUseCommand(source, fallbackLevel);
+ }
+
/**
* Whether the given source has enough permission level to run a command that requires the given commandLevel
*/
diff --git a/src/main/java/carpet/utils/FabricAPIHooks.java b/src/main/java/carpet/utils/FabricAPIHooks.java
index 8ece719b54..3e07a3a77b 100644
--- a/src/main/java/carpet/utils/FabricAPIHooks.java
+++ b/src/main/java/carpet/utils/FabricAPIHooks.java
@@ -3,12 +3,15 @@
import carpet.network.CarpetClient;
import com.mojang.blaze3d.systems.RenderSystem;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
+*/
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.SemanticVersion;
import net.fabricmc.loader.api.Version;
import net.fabricmc.loader.api.VersionParsingException;
-*/
+import net.minecraft.commands.CommandSourceStack;
+
public class FabricAPIHooks {
+ public static final boolean PERMISSIONS_API = hasMod("fabric-permissions-api-v0", "0.2");
/*
public static final boolean WORLD_RENDER_EVENTS = hasMod("fabric-rendering-v1", "1.5.0");
@@ -24,6 +27,11 @@ public static void initialize() {
});
}
}
+*/
+ public static boolean checkPermission(CommandSourceStack source, String perm) {
+ if (!PERMISSIONS_API) throw new IllegalStateException();
+ throw null; // Assume this works for now, just have to get the dep and call a method
+ }
private static boolean hasMod(String id, String minimumVersion) {
return FabricLoader.getInstance().getModContainer(id).map(m -> {
@@ -31,7 +39,7 @@ private static boolean hasMod(String id, String minimumVersion) {
if (version instanceof SemanticVersion) {
try {
- return ((SemanticVersion) version).compareTo(SemanticVersion.parse(minimumVersion)) >= 0;
+ return version.compareTo(SemanticVersion.parse(minimumVersion)) >= 0;
} catch (VersionParsingException ignored) {
}
}
@@ -39,6 +47,4 @@ private static boolean hasMod(String id, String minimumVersion) {
return false;
}).orElse(false);
}
-
- */
}
From 2d209921d02d3ff679e1d9bcedf00bb034447dda Mon Sep 17 00:00:00 2001
From: altrisi
Date: Fri, 19 Jan 2024 19:46:43 +0100
Subject: [PATCH 2/4] Add note about permissions support being available
TBD: Not convinced to add it here, given extension commands may not support it
---
src/main/java/carpet/api/settings/Validators.java | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/src/main/java/carpet/api/settings/Validators.java b/src/main/java/carpet/api/settings/Validators.java
index 67cf099eb3..ab5c925c39 100644
--- a/src/main/java/carpet/api/settings/Validators.java
+++ b/src/main/java/carpet/api/settings/Validators.java
@@ -3,6 +3,8 @@
import java.util.List;
import carpet.utils.CommandHelper;
+import carpet.utils.FabricAPIHooks;
+import carpet.utils.Messenger;
import net.minecraft.commands.CommandSourceStack;
/**
@@ -20,7 +22,7 @@ public final class Validators {
* so either a number from 0 to 4, or one of the keywords {@code true}, {@code false} or {@code ops}
*
* While there is no public API method for checking whether a source can execute a command,
- * {@link CommandHelper#canUseCommand(CommandSourceStack, Object)} is not expected to change anytime soon.
+ * {@link CommandHelper#hasPermission(CommandSourceStack, String, Object)} is not expected to change anytime soon.
*
*/
public static class CommandLevel extends Validator {
@@ -32,6 +34,9 @@ public String validate(CommandSourceStack source, CarpetRule currentRule
{
return null;
}
+ if (FabricAPIHooks.PERMISSIONS_API) {
+ Messenger.m(source, "g Note that you can use your permission manager mod to control access to commands");
+ }
return newValue;
}
@Override public String description() { return "Can be limited to 'ops' only, true/false for everyone/no one, or a custom permission level";}
From d760f97e5212cfec4e6bd0ddf35f4db64572ea3f Mon Sep 17 00:00:00 2001
From: altrisi
Date: Fri, 19 Jan 2024 19:54:21 +0100
Subject: [PATCH 3/4] Use permission-node-capable method in command permission
checking
This will have to be pending the Scarpet command refactor thing to not
have conflicts
---
src/main/java/carpet/commands/CounterCommand.java | 3 ++-
src/main/java/carpet/commands/DistanceCommand.java | 2 +-
src/main/java/carpet/commands/DrawCommand.java | 2 +-
src/main/java/carpet/commands/InfoCommand.java | 2 +-
src/main/java/carpet/commands/LogCommand.java | 2 +-
src/main/java/carpet/commands/MobAICommand.java | 2 +-
src/main/java/carpet/commands/PerimeterInfoCommand.java | 2 +-
src/main/java/carpet/commands/PlayerCommand.java | 2 +-
src/main/java/carpet/commands/ProfileCommand.java | 2 +-
src/main/java/carpet/commands/SpawnCommand.java | 2 +-
src/main/java/carpet/script/external/Vanilla.java | 4 ++--
11 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/src/main/java/carpet/commands/CounterCommand.java b/src/main/java/carpet/commands/CounterCommand.java
index 2868381485..ffaf341f07 100644
--- a/src/main/java/carpet/commands/CounterCommand.java
+++ b/src/main/java/carpet/commands/CounterCommand.java
@@ -2,6 +2,7 @@
import carpet.CarpetSettings;
import carpet.helpers.HopperCounter;
+import carpet.utils.CommandHelper;
import carpet.utils.Messenger;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
@@ -23,7 +24,7 @@ public class CounterCommand
public static void register(CommandDispatcher dispatcher, CommandBuildContext commandBuildContext)
{
LiteralArgumentBuilder commandBuilder = literal("counter")
- .requires(c -> CarpetSettings.hopperCounters)
+ .requires(c -> CarpetSettings.hopperCounters && CommandHelper.hasPermission(c, "carpet.commands.counter", true))
.executes(c -> listAllCounters(c.getSource(), false))
.then(literal("reset")
.executes(c -> resetCounters(c.getSource())));
diff --git a/src/main/java/carpet/commands/DistanceCommand.java b/src/main/java/carpet/commands/DistanceCommand.java
index fe5c2e1b6e..c0eb01a6fb 100644
--- a/src/main/java/carpet/commands/DistanceCommand.java
+++ b/src/main/java/carpet/commands/DistanceCommand.java
@@ -17,7 +17,7 @@ public class DistanceCommand
public static void register(CommandDispatcher dispatcher, CommandBuildContext commandBuildContext)
{
LiteralArgumentBuilder command = literal("distance").
- requires((player) -> CommandHelper.canUseCommand(player, CarpetSettings.commandDistance)).
+ requires((player) -> CommandHelper.hasPermission(player, "carpet.commands.distance", CarpetSettings.commandDistance)).
then(literal("from").
executes( (c) -> DistanceCalculator.setStart(c.getSource(), c.getSource().getPosition())).
then(argument("from", Vec3Argument.vec3()).
diff --git a/src/main/java/carpet/commands/DrawCommand.java b/src/main/java/carpet/commands/DrawCommand.java
index df2e544c05..e8e9f1be71 100644
--- a/src/main/java/carpet/commands/DrawCommand.java
+++ b/src/main/java/carpet/commands/DrawCommand.java
@@ -40,7 +40,7 @@ public class DrawCommand
public static void register(CommandDispatcher dispatcher, final CommandBuildContext context)
{
LiteralArgumentBuilder command = literal("draw").
- requires((player) -> CommandHelper.canUseCommand(player, CarpetSettings.commandDraw)).
+ requires((player) -> CommandHelper.hasPermission(player, "carpet.commands.draw", CarpetSettings.commandDraw)).
then(literal("sphere").
then(argument("center", BlockPosArgument.blockPos()).
then(argument("radius", IntegerArgumentType.integer(1)).
diff --git a/src/main/java/carpet/commands/InfoCommand.java b/src/main/java/carpet/commands/InfoCommand.java
index 4e36964c7e..1b9317438d 100644
--- a/src/main/java/carpet/commands/InfoCommand.java
+++ b/src/main/java/carpet/commands/InfoCommand.java
@@ -27,7 +27,7 @@ public class InfoCommand
public static void register(CommandDispatcher dispatcher, CommandBuildContext commandBuildContext)
{
LiteralArgumentBuilder command = literal("info").
- requires((player) -> CommandHelper.canUseCommand(player, CarpetSettings.commandInfo)).
+ requires((player) -> CommandHelper.hasPermission(player, "carpet.commands.info", CarpetSettings.commandInfo)).
then(literal("block").
then(argument("block position", BlockPosArgument.blockPos()).
executes( (c) -> infoBlock(
diff --git a/src/main/java/carpet/commands/LogCommand.java b/src/main/java/carpet/commands/LogCommand.java
index bd9cd4eade..c597140b31 100644
--- a/src/main/java/carpet/commands/LogCommand.java
+++ b/src/main/java/carpet/commands/LogCommand.java
@@ -29,7 +29,7 @@ public class LogCommand
public static void register(CommandDispatcher dispatcher, CommandBuildContext commandBuildContext)
{
LiteralArgumentBuilder literalargumentbuilder = Commands.literal("log").
- requires((player) -> CommandHelper.canUseCommand(player, CarpetSettings.commandLog)).
+ requires((player) -> CommandHelper.hasPermission(player, "carpet.commands.log", CarpetSettings.commandLog)).
executes((context) -> listLogs(context.getSource())).
then(Commands.literal("clear").
executes( (c) -> unsubFromAll(c.getSource(), c.getSource().getTextName())).
diff --git a/src/main/java/carpet/commands/MobAICommand.java b/src/main/java/carpet/commands/MobAICommand.java
index 5345583079..048bef42e4 100644
--- a/src/main/java/carpet/commands/MobAICommand.java
+++ b/src/main/java/carpet/commands/MobAICommand.java
@@ -21,7 +21,7 @@ public class MobAICommand
public static void register(CommandDispatcher dispatcher, final CommandBuildContext commandBuildContext)
{
LiteralArgumentBuilder command = literal("track").
- requires((player) -> CommandHelper.canUseCommand(player, CarpetSettings.commandTrackAI)).
+ requires((player) -> CommandHelper.hasPermission(player, "carpet.commands.track", CarpetSettings.commandTrackAI)).
then(argument("entity type", resource(commandBuildContext, Registries.ENTITY_TYPE)).
suggests( (c, b) -> suggest(MobAI.availbleTypes(c.getSource()), b)).
diff --git a/src/main/java/carpet/commands/PerimeterInfoCommand.java b/src/main/java/carpet/commands/PerimeterInfoCommand.java
index bc4780958b..7436776586 100644
--- a/src/main/java/carpet/commands/PerimeterInfoCommand.java
+++ b/src/main/java/carpet/commands/PerimeterInfoCommand.java
@@ -27,7 +27,7 @@ public class PerimeterInfoCommand
public static void register(CommandDispatcher dispatcher, CommandBuildContext commandBuildContext)
{
LiteralArgumentBuilder command = literal("perimeterinfo").
- requires((player) -> CommandHelper.canUseCommand(player, CarpetSettings.commandPerimeterInfo)).
+ requires((player) -> CommandHelper.hasPermission(player, "carpet.commands.perimeterinfo", CarpetSettings.commandPerimeterInfo)).
executes( (c) -> perimeterDiagnose(
c.getSource(),
BlockPos.containing(c.getSource().getPosition()),
diff --git a/src/main/java/carpet/commands/PlayerCommand.java b/src/main/java/carpet/commands/PlayerCommand.java
index ca62991d86..2b631bc356 100644
--- a/src/main/java/carpet/commands/PlayerCommand.java
+++ b/src/main/java/carpet/commands/PlayerCommand.java
@@ -50,7 +50,7 @@ public class PlayerCommand
public static void register(CommandDispatcher dispatcher, CommandBuildContext commandBuildContext)
{
LiteralArgumentBuilder command = literal("player")
- .requires((player) -> CommandHelper.canUseCommand(player, CarpetSettings.commandPlayer))
+ .requires((player) -> CommandHelper.hasPermission(player, "carpet.commands.player", CarpetSettings.commandPlayer))
.then(argument("player", StringArgumentType.word())
.suggests((c, b) -> suggest(getPlayerSuggestions(c.getSource()), b))
.then(literal("stop").executes(manipulation(EntityPlayerActionPack::stopAll)))
diff --git a/src/main/java/carpet/commands/ProfileCommand.java b/src/main/java/carpet/commands/ProfileCommand.java
index 553f31c8a7..ff6d7f4f66 100644
--- a/src/main/java/carpet/commands/ProfileCommand.java
+++ b/src/main/java/carpet/commands/ProfileCommand.java
@@ -19,7 +19,7 @@ public class ProfileCommand
public static void register(CommandDispatcher dispatcher, CommandBuildContext commandBuildContext)
{
LiteralArgumentBuilder literalargumentbuilder = literal("profile").
- requires((player) -> CommandHelper.canUseCommand(player, CarpetSettings.commandProfile)).
+ requires((player) -> CommandHelper.hasPermission(player, "carpet.commands.profile", CarpetSettings.commandProfile)).
executes( (c) -> healthReport(c.getSource(), 100)).
then(literal("health").
executes( (c) -> healthReport(c.getSource(), 100)).
diff --git a/src/main/java/carpet/commands/SpawnCommand.java b/src/main/java/carpet/commands/SpawnCommand.java
index e8824aface..f56478bbfa 100644
--- a/src/main/java/carpet/commands/SpawnCommand.java
+++ b/src/main/java/carpet/commands/SpawnCommand.java
@@ -42,7 +42,7 @@ public class SpawnCommand
public static void register(CommandDispatcher dispatcher, CommandBuildContext commandBuildContext)
{
LiteralArgumentBuilder literalargumentbuilder = literal("spawn").
- requires((player) -> CommandHelper.canUseCommand(player, CarpetSettings.commandSpawn));
+ requires((player) -> CommandHelper.hasPermission(player, "carpet.commands.spawn", CarpetSettings.commandSpawn));
literalargumentbuilder.
then(literal("list").
diff --git a/src/main/java/carpet/script/external/Vanilla.java b/src/main/java/carpet/script/external/Vanilla.java
index 75ee9ab952..aefcd1042f 100644
--- a/src/main/java/carpet/script/external/Vanilla.java
+++ b/src/main/java/carpet/script/external/Vanilla.java
@@ -336,12 +336,12 @@ public static boolean ScriptServer_scriptDebugging(MinecraftServer server)
public static boolean ServerPlayer_canScriptACE(CommandSourceStack player)
{
- return CommandHelper.canUseCommand(player, CarpetSettings.commandScriptACE);
+ return CommandHelper.hasPermission(player, "carpet.commands.script.run", CarpetSettings.commandScriptACE);
}
public static boolean ServerPlayer_canScriptGeneral(CommandSourceStack player)
{
- return CommandHelper.canUseCommand(player, CarpetSettings.commandScript);
+ return CommandHelper.hasPermission(player, "carpet.commands.script", CarpetSettings.commandScript);
}
public static int MinecraftServer_getFillLimit(MinecraftServer server)
From c44f698ab83632645d83c48412888b4603cc987b Mon Sep 17 00:00:00 2001
From: altrisi
Date: Fri, 19 Jan 2024 20:00:26 +0100
Subject: [PATCH 4/4] Hook it to `SettingsManager` too
Hooking to Scarpet app commands is a bit more complex
---
src/main/java/carpet/api/settings/SettingsManager.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/carpet/api/settings/SettingsManager.java b/src/main/java/carpet/api/settings/SettingsManager.java
index b8a0430f72..20592a07b2 100644
--- a/src/main/java/carpet/api/settings/SettingsManager.java
+++ b/src/main/java/carpet/api/settings/SettingsManager.java
@@ -602,7 +602,7 @@ public void registerCommand(final CommandDispatcher dispatch
}
LiteralArgumentBuilder literalargumentbuilder = literal(identifier).requires((player) ->
- CommandHelper.canUseCommand(player, CarpetSettings.carpetCommandPermissionLevel) && !locked());
+ CommandHelper.hasPermission(player, identifier + ".commands.settings", CarpetSettings.carpetCommandPermissionLevel) && !locked());
literalargumentbuilder.executes((context)-> listAllSettings(context.getSource())).
then(literal("list").