add fabric permission api support. closes #35

This commit is contained in:
Flemmli97 2021-03-09 13:29:26 +01:00
parent a8c8d7508b
commit 053d8ed500
7 changed files with 94 additions and 25 deletions

View File

@ -12,6 +12,10 @@ group = project.maven_group
repositories {
mavenCentral()
maven {
name = 'Fabric-Permission-API'
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
}
dependencies {
@ -26,6 +30,7 @@ dependencies {
compile group: 'org.yaml', name: 'snakeyaml', version: '1.25'
include group: 'org.yaml', name: 'snakeyaml', version: '1.25'
modImplementation 'me.lucko:fabric-permissions-api:0.1-SNAPSHOT'
// PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs.
// You may need to force-disable transitiveness on them.
}

View File

@ -15,6 +15,7 @@ import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents;
import net.fabricmc.fabric.api.event.player.UseBlockCallback;
import net.fabricmc.fabric.api.event.player.UseEntityCallback;
import net.fabricmc.fabric.api.event.player.UseItemCallback;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.server.MinecraftServer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@ -23,6 +24,8 @@ public class Flan implements ModInitializer {
public static final Logger logger = LogManager.getLogger("flan");
public static boolean permissionAPI;
@Override
public void onInitialize() {
PlayerBlockBreakEvents.BEFORE.register(BlockInteractEvents::breakBlocks);
@ -35,6 +38,8 @@ public class Flan implements ModInitializer {
ServerLifecycleEvents.SERVER_STARTING.register(this::lockRegistry);
CommandRegistrationCallback.EVENT.register(CommandClaim::register);
permissionAPI = FabricLoader.getInstance().isModLoaded("fabric-permissions-api-v0");
}
public void lockRegistry(MinecraftServer server) {

View File

@ -25,9 +25,10 @@ public interface ClaimPermissionEvent {
/**
* Callback for when permissions are checked
* @param player The corresponding player. Can be null if the check is e.g. caused by tnt explosions
*
* @param player The corresponding player. Can be null if the check is e.g. caused by tnt explosions
* @param permission The permission to check
* @param pos The block pos where the action is occuring
* @param pos The block pos where the action is occuring
* @return ActionResult#PASS to do nothing. ActionResult#FAIL to prevent the action. Else to allow the action
*/
ActionResult check(@Nullable ServerPlayerEntity player, ClaimPermission permission, BlockPos pos);

View File

@ -47,28 +47,28 @@ public class CommandClaim {
public static void register(CommandDispatcher<ServerCommandSource> dispatcher, boolean dedicated) {
dispatcher.register(CommandManager.literal("flan")
.then(CommandManager.literal("reload").requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)).executes(CommandClaim::reloadConfig))
.then(CommandManager.literal("addClaim").then(CommandManager.argument("from", BlockPosArgumentType.blockPos()).then(CommandManager.argument("to", BlockPosArgumentType.blockPos()).executes(CommandClaim::addClaim))))
.then(CommandManager.literal("menu").executes(CommandClaim::openMenu))
.then(CommandManager.literal("claimInfo").executes(CommandClaim::claimInfo))
.then(CommandManager.literal("transferClaim").then(CommandManager.argument("player", GameProfileArgumentType.gameProfile()).executes(CommandClaim::transferClaim)))
.then(CommandManager.literal("delete").executes(CommandClaim::deleteClaim))
.then(CommandManager.literal("deleteAll").executes(CommandClaim::deleteAllClaim))
.then(CommandManager.literal("deleteSubClaim").executes(CommandClaim::deleteSubClaim))
.then(CommandManager.literal("deleteAllSubClaims").executes(CommandClaim::deleteAllSubClaim))
.then(CommandManager.literal("list").executes(CommandClaim::listClaims).then(CommandManager.argument("player", GameProfileArgumentType.gameProfile()).requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel))
.then(CommandManager.literal("reload").requires(src -> CommandPermission.perm(src, CommandPermission.cmdReload, true)).executes(CommandClaim::reloadConfig))
.then(CommandManager.literal("addClaim").requires(src -> CommandPermission.perm(src, CommandPermission.claimCreate)).then(CommandManager.argument("from", BlockPosArgumentType.blockPos()).then(CommandManager.argument("to", BlockPosArgumentType.blockPos()).executes(CommandClaim::addClaim))))
.then(CommandManager.literal("menu").requires(src -> CommandPermission.perm(src, CommandPermission.cmdMenu)).executes(CommandClaim::openMenu))
.then(CommandManager.literal("claimInfo").requires(src -> CommandPermission.perm(src, CommandPermission.cmdInfo)).executes(CommandClaim::claimInfo))
.then(CommandManager.literal("transferClaim").requires(src -> CommandPermission.perm(src, CommandPermission.cmdTransfer)).then(CommandManager.argument("player", GameProfileArgumentType.gameProfile()).executes(CommandClaim::transferClaim)))
.then(CommandManager.literal("delete").requires(src -> CommandPermission.perm(src, CommandPermission.cmdTransfer)).executes(CommandClaim::deleteClaim))
.then(CommandManager.literal("deleteAll").requires(src -> CommandPermission.perm(src, CommandPermission.cmdTransfer)).executes(CommandClaim::deleteAllClaim))
.then(CommandManager.literal("deleteSubClaim").requires(src -> CommandPermission.perm(src, CommandPermission.cmdTransfer)).executes(CommandClaim::deleteSubClaim))
.then(CommandManager.literal("deleteAllSubClaims").requires(src -> CommandPermission.perm(src, CommandPermission.cmdTransfer)).executes(CommandClaim::deleteAllSubClaim))
.then(CommandManager.literal("list").requires(src -> CommandPermission.perm(src, CommandPermission.cmdList)).executes(CommandClaim::listClaims).then(CommandManager.argument("player", GameProfileArgumentType.gameProfile()).requires(src -> CommandPermission.perm(src, CommandPermission.cmdListAll, true))
.executes(cmd -> listClaims(cmd, GameProfileArgumentType.getProfileArgument(cmd, "player")))))
.then(CommandManager.literal("switchMode").executes(CommandClaim::switchClaimMode))
.then(CommandManager.literal("adminMode").requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)).executes(CommandClaim::switchAdminMode))
.then(CommandManager.literal("readGriefPrevention").requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)).executes(CommandClaim::readGriefPreventionData))
.then(CommandManager.literal("setAdminClaim").requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)).then(CommandManager.argument("toggle", BoolArgumentType.bool()).executes(CommandClaim::toggleAdminClaim)))
.then(CommandManager.literal("listAdminClaims").requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)).executes(CommandClaim::listAdminClaims))
.then(CommandManager.literal("adminDelete").requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)).executes(CommandClaim::adminDelete)
.then(CommandManager.literal("switchMode").requires(src -> CommandPermission.perm(src, CommandPermission.cmdClaimMode)).executes(CommandClaim::switchClaimMode))
.then(CommandManager.literal("adminMode").requires(src -> CommandPermission.perm(src, CommandPermission.cmdAdminMode, true)).executes(CommandClaim::switchAdminMode))
.then(CommandManager.literal("readGriefPrevention").requires(src -> CommandPermission.perm(src, CommandPermission.cmdGriefPrevention, true)).executes(CommandClaim::readGriefPreventionData))
.then(CommandManager.literal("setAdminClaim").requires(src -> CommandPermission.perm(src, CommandPermission.cmdAdminSet, true)).then(CommandManager.argument("toggle", BoolArgumentType.bool()).executes(CommandClaim::toggleAdminClaim)))
.then(CommandManager.literal("listAdminClaims").requires(src -> CommandPermission.perm(src, CommandPermission.cmdAdminList, true)).executes(CommandClaim::listAdminClaims))
.then(CommandManager.literal("adminDelete").requires(src -> CommandPermission.perm(src, CommandPermission.cmdAdminDelete, true)).executes(CommandClaim::adminDelete)
.then(CommandManager.literal("all").then(CommandManager.argument("players", GameProfileArgumentType.gameProfile())
.executes(CommandClaim::adminDeleteAll))))
.then(CommandManager.literal("giveClaimBlocks").requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)).then(CommandManager.argument("players", GameProfileArgumentType.gameProfile())
.then(CommandManager.literal("giveClaimBlocks").requires(src -> CommandPermission.perm(src, CommandPermission.cmdAdminGive, true)).then(CommandManager.argument("players", GameProfileArgumentType.gameProfile())
.then(CommandManager.argument("amount", IntegerArgumentType.integer()).executes(CommandClaim::giveClaimBlocks))))
.then(CommandManager.literal("group")
.then(CommandManager.literal("group").requires(src -> CommandPermission.perm(src, CommandPermission.cmdGroup))
.then(CommandManager.literal("add").then(CommandManager.argument("group", StringArgumentType.string()).executes(CommandClaim::addGroup)))
.then(CommandManager.literal("remove").then(CommandManager.argument("group", StringArgumentType.string())
.suggests(CommandClaim::groupSuggestion).executes(CommandClaim::removeGroup)))
@ -88,7 +88,7 @@ public class CommandClaim {
}
return CommandSource.suggestMatching(list, build);
}).executes(CommandClaim::removePlayer))))))
.then(CommandManager.literal("permission")
.then(CommandManager.literal("permission").requires(src -> CommandPermission.perm(src, CommandPermission.cmdPermission))
.then(CommandManager.literal("global").then(CommandManager.argument("permission", StringArgumentType.word()).suggests((ctx, b) -> permSuggestions(ctx, b, false))
.then(CommandManager.argument("toggle", StringArgumentType.word()).suggests((ctx, b) -> CommandSource.suggestMatching(new String[]{"default", "true", "false"}, b)).executes(CommandClaim::editGlobalPerm))))
.then(CommandManager.literal("group").then(CommandManager.argument("group", StringArgumentType.string()).suggests(CommandClaim::groupSuggestion)

View File

@ -0,0 +1,57 @@
package com.flemmli97.flan.commands;
import com.flemmli97.flan.Flan;
import com.flemmli97.flan.config.ConfigHandler;
import me.lucko.fabric.api.permissions.v0.Permissions;
import net.minecraft.server.command.CommandSource;
import net.minecraft.server.network.ServerPlayerEntity;
public class CommandPermission {
public static final String cmdReload = "flan.command.reload";
public static final String cmdGriefPrevention = "flan.command.read.griefprevention";
public static final String claimCreate = "flan.claim.create";
public static final String cmdMenu = "flan.command.menu";
public static final String cmdInfo = "flan.command.info";
public static final String cmdTransfer = "flan.command.transfer";
public static final String cmdDelete = "flan.command.delete";
public static final String cmdDeleteAll = "flan.command.delete.all";
public static final String cmdDeleteSub = "flan.command.delete.sub";
public static final String cmdDeleteSubAll = "flan.command.delete.sub.all";
public static final String cmdList = "flan.command.list";
public static final String cmdListAll = "flan.command.list.all";
public static final String cmdClaimMode = "flan.command.claim.mode";
public static final String cmdAdminMode = "flan.command.admin.mode";
public static final String cmdAdminSet = "flan.command.admin.claim";
public static final String cmdAdminList = "flan.command.admin.list";
public static final String cmdAdminDelete = "flan.command.admin.delete";
public static final String cmdAdminGive = "flan.command.admin.give";
public static final String cmdGroup = "flan.command.group";
public static final String cmdPermission = "flan.command.permission";
public static boolean perm(CommandSource src, String perm) {
return perm(src, perm, false);
}
public static boolean perm(CommandSource src, String perm, boolean adminCmd) {
if (!Flan.permissionAPI)
return !adminCmd || src.hasPermissionLevel(ConfigHandler.config.permissionLevel);
if (adminCmd)
return Permissions.check(src, perm, ConfigHandler.config.permissionLevel);
return Permissions.check(src, perm, true);
}
public static boolean perm(ServerPlayerEntity src, String perm, boolean adminCmd) {
if (!Flan.permissionAPI)
return !adminCmd || src.hasPermissionLevel(ConfigHandler.config.permissionLevel);
if (adminCmd)
return Permissions.check(src, perm, ConfigHandler.config.permissionLevel);
return Permissions.check(src, perm, true);
}
}

View File

@ -5,6 +5,7 @@ import com.flemmli97.flan.claim.Claim;
import com.flemmli97.flan.claim.ClaimStorage;
import com.flemmli97.flan.claim.IPermissionContainer;
import com.flemmli97.flan.claim.PermHelper;
import com.flemmli97.flan.commands.CommandPermission;
import com.flemmli97.flan.config.ConfigHandler;
import com.flemmli97.flan.player.EnumDisplayType;
import com.flemmli97.flan.player.EnumEditMode;
@ -118,6 +119,10 @@ public class ItemInteractEvents {
}
public static void claimLandHandling(ServerPlayerEntity player, BlockPos target) {
if (!CommandPermission.perm(player, CommandPermission.claimCreate, false)) {
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermission, Formatting.DARK_RED), true);
return;
}
if (ConfigHandler.config.worldWhitelist) {
if (!cantClaimInWorld(player.getServerWorld())) {
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.landClaimDisabledWorld, Formatting.DARK_RED), false);

View File

@ -2,7 +2,6 @@
"schemaVersion": 1,
"id": "flan",
"version": "${version}",
"name": "Flan",
"description": "A claiming mod for fabric",
"authors": [
@ -12,10 +11,8 @@
"homepage": "",
"sources": "https://github.com/Flemmli97/Flan"
},
"license": "ARR",
"icon": "assets/modid/icon.png",
"environment": "*",
"entrypoints": {
"main": [
@ -25,7 +22,6 @@
"mixins": [
"flan.mixins.json"
],
"depends": {
"fabricloader": ">=0.7.4",
"fabric": ">=0.19.0"