diff options
author | Dico Karssiens <dico.karssiens@gmail.com> | 2019-01-06 12:55:21 +0000 |
---|---|---|
committer | Dico Karssiens <dico.karssiens@gmail.com> | 2019-01-06 12:55:21 +0000 |
commit | 78e8496d5a20a8e62ea7f46fa85608aec2ac5a55 (patch) | |
tree | 366996dbc4146f498d3feb672c82f4fce9979372 | |
parent | 8a7bb2b3348ce7e8906e99ac4230885e814dc4f1 (diff) |
Add permission info
-rw-r--r-- | dicore3/command/src/main/java/io/dico/dicore/command/RootCommandAddress.java | 2 | ||||
-rw-r--r-- | permissions.md | 71 | ||||
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/command/ParcelCommandBuilder.kt | 276 |
3 files changed, 211 insertions, 138 deletions
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<String> 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<ICommandAddress> = 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<String>()
-
- // 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<ICommandAddress> = 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<String>() + + // 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 +} |