From 78e8496d5a20a8e62ea7f46fa85608aec2ac5a55 Mon Sep 17 00:00:00 2001 From: Dico Karssiens Date: Sun, 6 Jan 2019 12:55:21 +0000 Subject: Add permission info --- .../io/dico/dicore/command/RootCommandAddress.java | 2 +- permissions.md | 71 ++++++ .../dico/parcels2/command/ParcelCommandBuilder.kt | 276 +++++++++++---------- 3 files changed, 211 insertions(+), 138 deletions(-) create mode 100644 permissions.md diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/RootCommandAddress.java b/dicore3/command/src/main/java/io/dico/dicore/command/RootCommandAddress.java index b6d3b86..a17cfb0 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/RootCommandAddress.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/RootCommandAddress.java @@ -76,7 +76,7 @@ public class RootCommandAddress extends ModifiableCommandAddress implements ICom } - private static void debugChildren(ModifiableCommandAddress address) { + public static void debugChildren(ModifiableCommandAddress address) { Collection keys = address.getChildrenMainKeys(); for (String key : keys) { ChildCommandAddress child = address.getChild(key); diff --git a/permissions.md b/permissions.md new file mode 100644 index 0000000..e058fb3 --- /dev/null +++ b/permissions.md @@ -0,0 +1,71 @@ +# Permission Nodes + +Node|Description +---|--- +parcels.command.home | Access to `/p home` and aliases (example 1) +parcels.command.option.interact.gates | Access to `/p option interact gates` and aliases (example 2) +parcels.admin.bypass.ban | Ability to enter plots that listed a player as banned +parcels.admin.bypass.build | Ability to build anywhere +parcels.admin.bypass.gamemode | Be exempt from the world-specific gamemode enforcement +parcels.command.home.others | Ability to use `/p home` for plots other than your own +parcels.admin.manage | Admin rights. Required for staff commands and operations. + +## All Commands + +* parcel +* parcel goto +* parcel clear +* parcel goto_fake +* parcel claim +* parcel auto +* parcel tp +* parcel home +* parcel info +* parcel setbiome +* parcel ban +* parcel disallow +* parcel distrust +* parcel allow +* parcel unban +* parcel entrust +* parcel option +* parcel option interact +* parcel option interact buttons +* parcel option interact levers +* parcel option interact pressure_plates +* parcel option interact redstone +* parcel option interact containers +* parcel option interact gates +* parcel global +* parcel global ban +* parcel global disallow +* parcel global distrust +* parcel global allow +* parcel global unban +* parcel global entrust +* parcel global list +* parcel admin +* parcel admin swap +* parcel admin reset +* parcel admin setowner +* parcel admin dispose +* parcel admin update_all_owner_signs +* parcel admin global +* parcel admin global ban +* parcel admin global disallow +* parcel admin global distrust +* parcel admin global allow +* parcel admin global unban +* parcel admin global entrust +* parcel admin global list +* parcel debug +* parcel debug permissions +* parcel debug reloadoptions +* parcel debug privilege +* parcel debug complete_jobs +* parcel debug jobs +* parcel debug tpworld +* parcel debug make_mess +* parcel debug hasperm +* parcel debug message +* parcel debug directionality diff --git a/src/main/kotlin/io/dico/parcels2/command/ParcelCommandBuilder.kt b/src/main/kotlin/io/dico/parcels2/command/ParcelCommandBuilder.kt index 155f4f1..b4eae30 100644 --- a/src/main/kotlin/io/dico/parcels2/command/ParcelCommandBuilder.kt +++ b/src/main/kotlin/io/dico/parcels2/command/ParcelCommandBuilder.kt @@ -1,137 +1,139 @@ -package io.dico.parcels2.command - -import io.dico.dicore.command.* -import io.dico.dicore.command.parameter.ArgumentBuffer -import io.dico.dicore.command.predef.DefaultGroupCommand -import io.dico.dicore.command.registration.reflect.ReflectiveRegistration -import io.dico.parcels2.Interactables -import io.dico.parcels2.ParcelsPlugin -import io.dico.parcels2.logger -import io.dico.parcels2.util.ext.hasPermAdminManage -import org.bukkit.command.CommandSender -import java.util.LinkedList -import java.util.Queue - -@Suppress("UsePropertyAccessSyntax") -fun getParcelCommands(plugin: ParcelsPlugin): ICommandDispatcher = CommandBuilder().apply { - val parcelsAddress = SpecialCommandAddress() - - setChatHandler(ParcelsChatHandler()) - addParameterType(false, ParcelParameterType(plugin.parcelProvider)) - addParameterType(false, ProfileParameterType()) - addParameterType(true, ParcelTarget.PType(plugin.parcelProvider, parcelsAddress)) - - group(parcelsAddress, "parcel", "plot", "plots", "p") { - addContextFilter(IContextFilter.inheritablePermission("parcels.command")) - registerCommands(CommandsGeneral(plugin, parcelsAddress)) - registerCommands(CommandsPrivilegesLocal(plugin)) - - group("option", "opt", "o") { - setGroupDescription( - "changes interaction options for this parcel", - "Sets whether players who are not allowed to", - "build here can interact with certain things." - ) - - group("interact", "i") { - val command = ParcelOptionsInteractCommand(plugin) - Interactables.classesById.forEach { - addSubCommand(it.name, command) - } - } - } - - val adminPrivilegesGlobal = CommandsAdminPrivilegesGlobal(plugin) - - group("global", "g") { - registerCommands(CommandsPrivilegesGlobal(plugin, adminVersion = adminPrivilegesGlobal)) - } - - group("admin", "a") { - setCommand(AdminGroupCommand()) - registerCommands(CommandsAdmin(plugin)) - - group("global", "g") { - registerCommands(adminPrivilegesGlobal) - } - } - - if (!logger.isDebugEnabled) return@group - - group("debug", "d") { - registerCommands(CommandsDebug(plugin)) - } - } - - generateHelpAndSyntaxCommands(parcelsAddress) -}.getDispatcher() - -private inline fun CommandBuilder.group(name: String, vararg aliases: String, config: CommandBuilder.() -> Unit) { - group(name, *aliases) - config() - parent() -} - -private inline fun CommandBuilder.group(address: ICommandAddress, name: String, vararg aliases: String, config: CommandBuilder.() -> Unit) { - group(address, name, *aliases) - config() - parent() -} - -private fun CommandBuilder.generateHelpAndSyntaxCommands(root: ICommandAddress): CommandBuilder { - generateCommands(root, "help", "syntax") - return this -} - -private fun generateCommands(address: ICommandAddress, vararg names: String) { - val addresses: Queue = LinkedList() - addresses.offer(address) - - while (addresses.isNotEmpty()) { - val cur = addresses.poll() - cur.childrenMainKeys.mapTo(addresses) { cur.getChild(it) } - if (cur.hasCommand()) { - ReflectiveRegistration.generateCommands(cur, names) - } - } -} - -class SpecialCommandAddress : ChildCommandAddress() { - private val speciallyTreatedKeys = mutableListOf() - - // Used to allow /p h:1 syntax, which is the same as what PlotMe uses. - var speciallyParsedIndex: Int? = null; private set - - fun addSpeciallyTreatedKeys(vararg keys: String) { - for (key in keys) { - speciallyTreatedKeys.add(key + ":") - } - } - - // h:1 - @Throws(CommandException::class) - override fun getChild(context: ExecutionContext, buffer: ArgumentBuffer): ChildCommandAddress? { - speciallyParsedIndex = null - - val key = buffer.next() ?: return null - for (specialKey in speciallyTreatedKeys) { - if (key.startsWith(specialKey)) { - val result = getChild(specialKey.substring(0, specialKey.length - 1)) - ?: return null - - val text = key.substring(specialKey.length) - val num = text.toIntOrNull() ?: throw CommandException("$text is not a number") - speciallyParsedIndex = num - - return result - } - } - - return super.getChild(key) - } - -} - -private class AdminGroupCommand : DefaultGroupCommand() { - override fun isVisibleTo(sender: CommandSender) = sender.hasPermAdminManage -} +package io.dico.parcels2.command + +import io.dico.dicore.command.* +import io.dico.dicore.command.parameter.ArgumentBuffer +import io.dico.dicore.command.predef.DefaultGroupCommand +import io.dico.dicore.command.registration.reflect.ReflectiveRegistration +import io.dico.parcels2.Interactables +import io.dico.parcels2.ParcelsPlugin +import io.dico.parcels2.logger +import io.dico.parcels2.util.ext.hasPermAdminManage +import org.bukkit.command.CommandSender +import java.util.LinkedList +import java.util.Queue + +@Suppress("UsePropertyAccessSyntax") +fun getParcelCommands(plugin: ParcelsPlugin): ICommandDispatcher = CommandBuilder().apply { + val parcelsAddress = SpecialCommandAddress() + + setChatHandler(ParcelsChatHandler()) + addParameterType(false, ParcelParameterType(plugin.parcelProvider)) + addParameterType(false, ProfileParameterType()) + addParameterType(true, ParcelTarget.PType(plugin.parcelProvider, parcelsAddress)) + + group(parcelsAddress, "parcel", "plot", "plots", "p") { + addContextFilter(IContextFilter.inheritablePermission("parcels.command")) + registerCommands(CommandsGeneral(plugin, parcelsAddress)) + registerCommands(CommandsPrivilegesLocal(plugin)) + + group("option", "opt", "o") { + setGroupDescription( + "changes interaction options for this parcel", + "Sets whether players who are not allowed to", + "build here can interact with certain things." + ) + + group("interact", "i") { + val command = ParcelOptionsInteractCommand(plugin) + Interactables.classesById.forEach { + addSubCommand(it.name, command) + } + } + } + + val adminPrivilegesGlobal = CommandsAdminPrivilegesGlobal(plugin) + + group("global", "g") { + registerCommands(CommandsPrivilegesGlobal(plugin, adminVersion = adminPrivilegesGlobal)) + } + + group("admin", "a") { + setCommand(AdminGroupCommand()) + registerCommands(CommandsAdmin(plugin)) + + group("global", "g") { + registerCommands(adminPrivilegesGlobal) + } + } + + if (!logger.isDebugEnabled) return@group + + group("debug", "d") { + registerCommands(CommandsDebug(plugin)) + } + } + + generateHelpAndSyntaxCommands(parcelsAddress) +}.getDispatcher().also { + RootCommandAddress.debugChildren(it as ModifiableCommandAddress) +} + +private inline fun CommandBuilder.group(name: String, vararg aliases: String, config: CommandBuilder.() -> Unit) { + group(name, *aliases) + config() + parent() +} + +private inline fun CommandBuilder.group(address: ICommandAddress, name: String, vararg aliases: String, config: CommandBuilder.() -> Unit) { + group(address, name, *aliases) + config() + parent() +} + +private fun CommandBuilder.generateHelpAndSyntaxCommands(root: ICommandAddress): CommandBuilder { + generateCommands(root, "help", "syntax") + return this +} + +private fun generateCommands(address: ICommandAddress, vararg names: String) { + val addresses: Queue = LinkedList() + addresses.offer(address) + + while (addresses.isNotEmpty()) { + val cur = addresses.poll() + cur.childrenMainKeys.mapTo(addresses) { cur.getChild(it) } + if (cur.hasCommand()) { + ReflectiveRegistration.generateCommands(cur, names) + } + } +} + +class SpecialCommandAddress : ChildCommandAddress() { + private val speciallyTreatedKeys = mutableListOf() + + // Used to allow /p h:1 syntax, which is the same as what PlotMe uses. + var speciallyParsedIndex: Int? = null; private set + + fun addSpeciallyTreatedKeys(vararg keys: String) { + for (key in keys) { + speciallyTreatedKeys.add(key + ":") + } + } + + // h:1 + @Throws(CommandException::class) + override fun getChild(context: ExecutionContext, buffer: ArgumentBuffer): ChildCommandAddress? { + speciallyParsedIndex = null + + val key = buffer.next() ?: return null + for (specialKey in speciallyTreatedKeys) { + if (key.startsWith(specialKey)) { + val result = getChild(specialKey.substring(0, specialKey.length - 1)) + ?: return null + + val text = key.substring(specialKey.length) + val num = text.toIntOrNull() ?: throw CommandException("$text is not a number") + speciallyParsedIndex = num + + return result + } + } + + return super.getChild(key) + } + +} + +private class AdminGroupCommand : DefaultGroupCommand() { + override fun isVisibleTo(sender: CommandSender) = sender.hasPermAdminManage +} -- cgit v1.2.3