Archived
0

Add permission info

This commit is contained in:
Dico Karssiens
2019-01-06 12:55:21 +00:00
parent 8a7bb2b334
commit 78e8496d5a
3 changed files with 211 additions and 138 deletions

View File

@@ -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);

71
permissions.md Normal file
View File

@@ -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

View File

@@ -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
}