summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/command
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/command')
-rw-r--r--src/main/kotlin/io/dico/parcels2/command/AbstractParcelCommands.kt126
-rw-r--r--src/main/kotlin/io/dico/parcels2/command/CommandsAdmin.kt188
-rw-r--r--src/main/kotlin/io/dico/parcels2/command/CommandsAdminPrivilegesGlobal.kt262
-rw-r--r--src/main/kotlin/io/dico/parcels2/command/CommandsDebug.kt322
-rw-r--r--src/main/kotlin/io/dico/parcels2/command/CommandsGeneral.kt3
-rw-r--r--src/main/kotlin/io/dico/parcels2/command/CommandsPrivilegesGlobal.kt152
-rw-r--r--src/main/kotlin/io/dico/parcels2/command/CommandsPrivilegesLocal.kt286
-rw-r--r--src/main/kotlin/io/dico/parcels2/command/ParcelCommandReceivers.kt136
-rw-r--r--src/main/kotlin/io/dico/parcels2/command/ParcelOptionsInteractCommand.kt112
-rw-r--r--src/main/kotlin/io/dico/parcels2/command/ParcelParameterTypes.kt13
-rw-r--r--src/main/kotlin/io/dico/parcels2/command/ParcelTarget.kt49
-rw-r--r--src/main/kotlin/io/dico/parcels2/command/ParcelsChatHandler.kt46
12 files changed, 864 insertions, 831 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/command/AbstractParcelCommands.kt b/src/main/kotlin/io/dico/parcels2/command/AbstractParcelCommands.kt
index eaa9f57..32f4299 100644
--- a/src/main/kotlin/io/dico/parcels2/command/AbstractParcelCommands.kt
+++ b/src/main/kotlin/io/dico/parcels2/command/AbstractParcelCommands.kt
@@ -1,64 +1,64 @@
-package io.dico.parcels2.command
-
-import io.dico.dicore.command.*
-import io.dico.dicore.command.registration.reflect.ICommandInterceptor
-import io.dico.dicore.command.registration.reflect.ICommandReceiver
-import io.dico.parcels2.*
-import io.dico.parcels2.PlayerProfile.Real
-import io.dico.parcels2.PlayerProfile.Unresolved
-import io.dico.parcels2.util.ext.hasPermAdminManage
-import io.dico.parcels2.util.ext.parcelLimit
-import org.bukkit.entity.Player
-import org.bukkit.plugin.Plugin
-import java.lang.reflect.Method
-
-abstract class AbstractParcelCommands(val plugin: ParcelsPlugin) : ICommandInterceptor {
-
- override fun getReceiver(context: ExecutionContext, target: Method, cmdName: String): ICommandReceiver {
- return getParcelCommandReceiver(plugin.parcelProvider, context, target, cmdName)
- }
-
- override fun getCoroutineContext(context: ExecutionContext?, target: Method?, cmdName: String?): Any {
- return plugin.coroutineContext
- }
-
- protected fun checkConnected(action: String) {
- if (!plugin.storage.isConnected) err("Parcels cannot $action right now because of a database error")
- }
-
- protected suspend fun checkParcelLimit(player: Player, world: ParcelWorld) {
- if (player.hasPermAdminManage) return
- val numOwnedParcels = plugin.storage.getOwnedParcels(PlayerProfile(player)).await()
- .filter { it.worldId.equals(world.id) }.size
-
- val limit = player.parcelLimit
- if (numOwnedParcels >= limit) {
- err("You have enough plots for now")
- }
- }
-
- protected suspend fun toPrivilegeKey(profile: PlayerProfile): PrivilegeKey = when (profile) {
- is Real -> profile
- is Unresolved -> profile.tryResolveSuspendedly(plugin.storage)
- ?: throw CommandException()
- else -> throw CommandException()
- }
-
- protected fun areYouSureMessage(context: ExecutionContext): String {
- val command = (context.route + context.original).joinToString(" ") + " -sure"
- return "Are you sure? You cannot undo this action!\n" +
- "Run \"/$command\" if you want to go through with this."
- }
-
- protected fun Job.reportProgressUpdates(context: ExecutionContext, action: String): Job =
- onProgressUpdate(1000, 1000) { progress, elapsedTime ->
- val alt = context.getFormat(EMessageType.NUMBER)
- val main = context.getFormat(EMessageType.INFORMATIVE)
- context.sendMessage(
- EMessageType.INFORMATIVE, false, "$action progress: $alt%.02f$main%%, $alt%.2f${main}s elapsed"
- .format(progress * 100, elapsedTime / 1000.0)
- )
- }
-}
-
+package io.dico.parcels2.command
+
+import io.dico.dicore.command.*
+import io.dico.dicore.command.registration.reflect.ICommandInterceptor
+import io.dico.dicore.command.registration.reflect.ICommandReceiver
+import io.dico.parcels2.*
+import io.dico.parcels2.PlayerProfile.Real
+import io.dico.parcels2.PlayerProfile.Unresolved
+import io.dico.parcels2.util.ext.hasPermAdminManage
+import io.dico.parcels2.util.ext.parcelLimit
+import org.bukkit.entity.Player
+import org.bukkit.plugin.Plugin
+import java.lang.reflect.Method
+
+abstract class AbstractParcelCommands(val plugin: ParcelsPlugin) : ICommandInterceptor {
+
+ override fun getReceiver(context: ExecutionContext, target: Method, cmdName: String): ICommandReceiver {
+ return getParcelCommandReceiver(plugin.parcelProvider, context, target, cmdName)
+ }
+
+ override fun getCoroutineContext(context: ExecutionContext?, target: Method?, cmdName: String?): Any {
+ return plugin.coroutineContext
+ }
+
+ protected fun checkConnected(action: String) {
+ if (!plugin.storage.isConnected) err("Parcels cannot $action right now because of a database error")
+ }
+
+ protected suspend fun checkParcelLimit(player: Player, world: ParcelWorld) {
+ if (player.hasPermAdminManage) return
+ val numOwnedParcels = plugin.storage.getOwnedParcels(PlayerProfile(player)).await()
+ .filter { it.worldId.equals(world.id) }.size
+
+ val limit = player.parcelLimit
+ if (numOwnedParcels >= limit) {
+ err("You have enough plots for now")
+ }
+ }
+
+ protected suspend fun toPrivilegeKey(profile: PlayerProfile): PrivilegeKey = when (profile) {
+ is Real -> profile
+ is Unresolved -> profile.tryResolveSuspendedly(plugin.storage)
+ ?: throw CommandException()
+ else -> throw CommandException()
+ }
+
+ protected fun areYouSureMessage(context: ExecutionContext): String {
+ val command = (context.route + context.original).joinToString(" ") + " -sure"
+ return "Are you sure? You cannot undo this action!\n" +
+ "Run \"/$command\" if you want to go through with this."
+ }
+
+ protected fun Job.reportProgressUpdates(context: ExecutionContext, action: String): Job =
+ onProgressUpdate(1000, 1000) { progress, elapsedTime ->
+ val alt = context.getFormat(EMessageType.NUMBER)
+ val main = context.getFormat(EMessageType.INFORMATIVE)
+ context.sendMessage(
+ EMessageType.INFORMATIVE, false, "$action progress: $alt%.02f$main%%, $alt%.2f${main}s elapsed"
+ .format(progress * 100, elapsedTime / 1000.0)
+ )
+ }
+}
+
fun err(message: String): Nothing = throw CommandException(message) \ No newline at end of file
diff --git a/src/main/kotlin/io/dico/parcels2/command/CommandsAdmin.kt b/src/main/kotlin/io/dico/parcels2/command/CommandsAdmin.kt
index e700d6d..38adc43 100644
--- a/src/main/kotlin/io/dico/parcels2/command/CommandsAdmin.kt
+++ b/src/main/kotlin/io/dico/parcels2/command/CommandsAdmin.kt
@@ -1,95 +1,95 @@
-package io.dico.parcels2.command
-
-import io.dico.dicore.command.CommandException
-import io.dico.dicore.command.ExecutionContext
-import io.dico.dicore.command.Validate
-import io.dico.dicore.command.annotation.Cmd
-import io.dico.dicore.command.annotation.Flag
-import io.dico.parcels2.*
-import io.dico.parcels2.command.ParcelTarget.TargetKind
-import io.dico.parcels2.defaultimpl.DefaultParcelContainer
-import io.dico.parcels2.util.ext.PERM_ADMIN_MANAGE
-
-class CommandsAdmin(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
-
- @Cmd("setowner")
- @RequireParcelPrivilege(Privilege.ADMIN)
- suspend fun ParcelScope.cmdSetowner(@ProfileKind(ProfileKind.ANY) target: PlayerProfile): Any? {
- val profile = target.resolved(plugin.storage, resolveToFake = true)!!
- parcel.owner = profile
-
- val fakeString = if (profile.isFake) " (fake)" else ""
- return "${profile.notNullName}$fakeString is the new owner of (${parcel.id.idString})"
- }
-
- @Cmd("update_all_owner_signs")
- fun cmdUpdateAllOwnerSigns(context: ExecutionContext): Any? {
- Validate.isAuthorized(context.sender, PERM_ADMIN_MANAGE)
- plugin.jobDispatcher.dispatch {
- fun getParcelCount(world: ParcelWorld) = (world.options.axisLimit * 2 + 1).let { it * it }
- val parcelCount = plugin.parcelProvider.worlds.values.sumBy { getParcelCount(it) }.toDouble()
- var processed = 0
- for (world in plugin.parcelProvider.worlds.values) {
- markSuspensionPoint()
-
- val container = world.container as? DefaultParcelContainer
- if (container == null) {
- processed += getParcelCount(world)
- setProgress(processed / parcelCount)
- continue
- }
-
- for (parcel in container.getAllParcels()) {
- parcel.updateOwnerSign(force = true)
- processed++
- setProgress(processed / parcelCount)
- }
- }
- }.reportProgressUpdates(context, "Updating")
- return null
- }
-
- @Cmd("dispose")
- @RequireParcelPrivilege(Privilege.ADMIN)
- fun ParcelScope.cmdDispose(): Any? {
- parcel.dispose()
- return "Data of (${parcel.id.idString}) has been disposed"
- }
-
- @Cmd("reset")
- @RequireParcelPrivilege(Privilege.ADMIN)
- fun ParcelScope.cmdReset(context: ExecutionContext, @Flag sure: Boolean): Any? {
- Validate.isTrue(!parcel.hasBlockVisitors, "A process is already running in this parcel")
- if (!sure) return areYouSureMessage(context)
-
- parcel.dispose()
- world.blockManager.clearParcel(parcel.id)?.reportProgressUpdates(context, "Reset")
- return "Data of (${parcel.id.idString}) has been disposed"
- }
-
- @Cmd("swap")
- @RequireParcelPrivilege(Privilege.ADMIN)
- fun ParcelScope.cmdSwap(
- context: ExecutionContext,
- @TargetKind(TargetKind.ID) target: ParcelTarget,
- @Flag sure: Boolean
- ): Any? {
- Validate.isTrue(!parcel.hasBlockVisitors, "A process is already running in this parcel")
- if (!sure) return areYouSureMessage(context)
-
- val parcel2 = (target as ParcelTarget.ByID).getParcel()
- ?: throw CommandException("Invalid parcel target")
-
- // Validate.isTrue(parcel2.world == world, "Parcel must be in the same world")
- Validate.isTrue(!parcel2.hasBlockVisitors, "A process is already running in that parcel")
-
- val data = parcel.data
- parcel.copyData(parcel2.data)
- parcel2.copyData(data)
-
- val job = plugin.parcelProvider.swapParcels(parcel.id, parcel2.id)?.reportProgressUpdates(context, "Swap")
- Validate.notNull(job, "A process is already running in some parcel (internal error)")
- return null
- }
-
+package io.dico.parcels2.command
+
+import io.dico.dicore.command.CommandException
+import io.dico.dicore.command.ExecutionContext
+import io.dico.dicore.command.Validate
+import io.dico.dicore.command.annotation.Cmd
+import io.dico.dicore.command.annotation.Flag
+import io.dico.parcels2.*
+import io.dico.parcels2.command.ParcelTarget.TargetKind
+import io.dico.parcels2.defaultimpl.DefaultParcelContainer
+import io.dico.parcels2.util.ext.PERM_ADMIN_MANAGE
+
+class CommandsAdmin(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
+
+ @Cmd("setowner")
+ @RequireParcelPrivilege(Privilege.ADMIN)
+ suspend fun ParcelScope.cmdSetowner(@ProfileKind(ProfileKind.ANY) target: PlayerProfile): Any? {
+ val profile = target.resolved(plugin.storage, resolveToFake = true)!!
+ parcel.owner = profile
+
+ val fakeString = if (profile.isFake) " (fake)" else ""
+ return "${profile.notNullName}$fakeString is the new owner of (${parcel.id.idString})"
+ }
+
+ @Cmd("update_all_owner_signs")
+ fun cmdUpdateAllOwnerSigns(context: ExecutionContext): Any? {
+ Validate.isAuthorized(context.sender, PERM_ADMIN_MANAGE)
+ plugin.jobDispatcher.dispatch {
+ fun getParcelCount(world: ParcelWorld) = (world.options.axisLimit * 2 + 1).let { it * it }
+ val parcelCount = plugin.parcelProvider.worlds.values.sumBy { getParcelCount(it) }.toDouble()
+ var processed = 0
+ for (world in plugin.parcelProvider.worlds.values) {
+ markSuspensionPoint()
+
+ val container = world.container as? DefaultParcelContainer
+ if (container == null) {
+ processed += getParcelCount(world)
+ setProgress(processed / parcelCount)
+ continue
+ }
+
+ for (parcel in container.getAllParcels()) {
+ parcel.updateOwnerSign(force = true)
+ processed++
+ setProgress(processed / parcelCount)
+ }
+ }
+ }.reportProgressUpdates(context, "Updating")
+ return null
+ }
+
+ @Cmd("dispose")
+ @RequireParcelPrivilege(Privilege.ADMIN)
+ fun ParcelScope.cmdDispose(): Any? {
+ parcel.dispose()
+ return "Data of (${parcel.id.idString}) has been disposed"
+ }
+
+ @Cmd("reset")
+ @RequireParcelPrivilege(Privilege.ADMIN)
+ fun ParcelScope.cmdReset(context: ExecutionContext, @Flag sure: Boolean): Any? {
+ Validate.isTrue(!parcel.hasBlockVisitors, "A process is already running in this parcel")
+ if (!sure) return areYouSureMessage(context)
+
+ parcel.dispose()
+ world.blockManager.clearParcel(parcel.id)?.reportProgressUpdates(context, "Reset")
+ return "Data of (${parcel.id.idString}) has been disposed"
+ }
+
+ @Cmd("swap")
+ @RequireParcelPrivilege(Privilege.ADMIN)
+ fun ParcelScope.cmdSwap(
+ context: ExecutionContext,
+ @TargetKind(TargetKind.ID) target: ParcelTarget,
+ @Flag sure: Boolean
+ ): Any? {
+ Validate.isTrue(!parcel.hasBlockVisitors, "A process is already running in this parcel")
+ if (!sure) return areYouSureMessage(context)
+
+ val parcel2 = (target as ParcelTarget.ByID).getParcel()
+ ?: throw CommandException("Invalid parcel target")
+
+ // Validate.isTrue(parcel2.world == world, "Parcel must be in the same world")
+ Validate.isTrue(!parcel2.hasBlockVisitors, "A process is already running in that parcel")
+
+ val data = parcel.data
+ parcel.copyData(parcel2.data)
+ parcel2.copyData(data)
+
+ val job = plugin.parcelProvider.swapParcels(parcel.id, parcel2.id)?.reportProgressUpdates(context, "Swap")
+ Validate.notNull(job, "A process is already running in some parcel (internal error)")
+ return null
+ }
+
} \ No newline at end of file
diff --git a/src/main/kotlin/io/dico/parcels2/command/CommandsAdminPrivilegesGlobal.kt b/src/main/kotlin/io/dico/parcels2/command/CommandsAdminPrivilegesGlobal.kt
index cee3e62..a2bd8d1 100644
--- a/src/main/kotlin/io/dico/parcels2/command/CommandsAdminPrivilegesGlobal.kt
+++ b/src/main/kotlin/io/dico/parcels2/command/CommandsAdminPrivilegesGlobal.kt
@@ -1,132 +1,132 @@
-@file:Suppress("NON_EXHAUSTIVE_WHEN")
-
-package io.dico.parcels2.command
-
-import io.dico.dicore.command.ExecutionContext
-import io.dico.dicore.command.Validate
-import io.dico.dicore.command.annotation.Cmd
-import io.dico.dicore.command.annotation.Desc
-import io.dico.parcels2.*
-import io.dico.parcels2.Privilege.BANNED
-import io.dico.parcels2.Privilege.CAN_BUILD
-import io.dico.parcels2.PrivilegeChangeResult.*
-import io.dico.parcels2.defaultimpl.InfoBuilder
-import io.dico.parcels2.util.ext.PERM_ADMIN_MANAGE
-import org.bukkit.OfflinePlayer
-
-class CommandsAdminPrivilegesGlobal(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
- private val data
- inline get() = plugin.globalPrivileges
-
- private fun checkContext(context: ExecutionContext, owner: OfflinePlayer, changing: Boolean = true): OfflinePlayer {
- if (changing) {
- checkConnected("have privileges changed")
- }
- val sender = context.sender
- if (sender !== owner) {
- Validate.isAuthorized(sender, PERM_ADMIN_MANAGE)
- }
- return owner
- }
-
- @Cmd("list", aliases = ["l"])
- @Desc(
- "List globally declared privileges, players you",
- "allowed to build on or banned from all your parcels",
- shortVersion = "lists globally declared privileges"
- )
- fun cmdList(context: ExecutionContext, owner: OfflinePlayer): Any? {
- checkContext(context, owner, changing = false)
- val map = plugin.globalPrivileges[owner]
- Validate.isTrue(map.hasAnyDeclaredPrivileges(), "This user has not declared any global privileges")
-
- return StringBuilder().apply {
- with(InfoBuilder) {
- appendProfilesWithPrivilege("Globally Allowed", map, null, CAN_BUILD)
- appendProfilesWithPrivilege("Globally Banned", map, null, BANNED)
- }
- }.toString()
- }
-
- @Cmd("entrust")
- @Desc(
- "Allows a player to manage globally",
- shortVersion = "allows a player to manage globally"
- )
- suspend fun cmdEntrust(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
- when (data[checkContext(context, owner)].allowManage(toPrivilegeKey(player))) {
- FAIL_OWNER -> err("The target cannot be the owner themselves")
- FAIL -> err("${player.name} is already allowed to manage globally")
- SUCCESS -> "${player.name} is now allowed to manage globally"
- }
-
- @Cmd("distrust")
- @Desc(
- "Disallows a player to manage globally,",
- "they will still be able to build",
- shortVersion = "disallows a player to manage globally"
- )
- suspend fun cmdDistrust(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
- when (data[checkContext(context, owner)].disallowManage(toPrivilegeKey(player))) {
- FAIL_OWNER -> err("The target cannot be the owner themselves")
- FAIL -> err("${player.name} is not currently allowed to manage globally")
- SUCCESS -> "${player.name} is not allowed to manage globally anymore"
- }
-
- @Cmd("allow", aliases = ["add", "permit"])
- @Desc(
- "Globally allows a player to build on all",
- "the parcels that you own.",
- shortVersion = "globally allows a player to build on your parcels"
- )
- suspend fun cmdAllow(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
- when (data[checkContext(context, owner)].allowBuild(toPrivilegeKey(player))) {
- FAIL_OWNER -> err("The target cannot be the owner themselves")
- FAIL -> err("${player.name} is already allowed globally")
- SUCCESS -> "${player.name} is now allowed to build globally"
- }
-
- @Cmd("disallow", aliases = ["remove", "forbid"])
- @Desc(
- "Globally disallows a player to build on",
- "the parcels that you own.",
- "If the player is allowed to build on specific",
- "parcels, they can still build there.",
- shortVersion = "globally disallows a player to build on your parcels"
- )
- suspend fun cmdDisallow(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
- when (data[checkContext(context, owner)].disallowBuild(toPrivilegeKey(player))) {
- FAIL_OWNER -> err("The target cannot be the owner themselves")
- FAIL -> err("${player.name} is not currently allowed globally")
- SUCCESS -> "${player.name} is not allowed to build globally anymore"
- }
-
- @Cmd("ban", aliases = ["deny"])
- @Desc(
- "Globally bans a player from all the parcels",
- "that you own, making them unable to enter.",
- shortVersion = "globally bans a player from your parcels"
- )
- suspend fun cmdBan(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
- when (data[checkContext(context, owner)].disallowEnter(toPrivilegeKey(player))) {
- FAIL_OWNER -> err("The target cannot be the owner themselves")
- FAIL -> err("${player.name} is already banned globally")
- SUCCESS -> "${player.name} is now banned globally"
- }
-
- @Cmd("unban", aliases = ["undeny"])
- @Desc(
- "Globally unbans a player from all the parcels",
- "that you own, they can enter again.",
- "If the player is banned from specific parcels,",
- "they will still be banned there.",
- shortVersion = "globally unbans a player from your parcels"
- )
- suspend fun cmdUnban(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
- when (data[checkContext(context, owner)].allowEnter(toPrivilegeKey(player))) {
- FAIL_OWNER -> err("The target cannot be the owner themselves")
- FAIL -> err("${player.name} is not currently banned globally")
- SUCCESS -> "${player.name} is not banned globally anymore"
- }
-
+@file:Suppress("NON_EXHAUSTIVE_WHEN")
+
+package io.dico.parcels2.command
+
+import io.dico.dicore.command.ExecutionContext
+import io.dico.dicore.command.Validate
+import io.dico.dicore.command.annotation.Cmd
+import io.dico.dicore.command.annotation.Desc
+import io.dico.parcels2.*
+import io.dico.parcels2.Privilege.BANNED
+import io.dico.parcels2.Privilege.CAN_BUILD
+import io.dico.parcels2.PrivilegeChangeResult.*
+import io.dico.parcels2.defaultimpl.InfoBuilder
+import io.dico.parcels2.util.ext.PERM_ADMIN_MANAGE
+import org.bukkit.OfflinePlayer
+
+class CommandsAdminPrivilegesGlobal(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
+ private val data
+ inline get() = plugin.globalPrivileges
+
+ private fun checkContext(context: ExecutionContext, owner: OfflinePlayer, changing: Boolean = true): OfflinePlayer {
+ if (changing) {
+ checkConnected("have privileges changed")
+ }
+ val sender = context.sender
+ if (sender !== owner) {
+ Validate.isAuthorized(sender, PERM_ADMIN_MANAGE)
+ }
+ return owner
+ }
+
+ @Cmd("list", aliases = ["l"])
+ @Desc(
+ "List globally declared privileges, players you",
+ "allowed to build on or banned from all your parcels",
+ shortVersion = "lists globally declared privileges"
+ )
+ fun cmdList(context: ExecutionContext, owner: OfflinePlayer): Any? {
+ checkContext(context, owner, changing = false)
+ val map = plugin.globalPrivileges[owner]
+ Validate.isTrue(map.hasAnyDeclaredPrivileges(), "This user has not declared any global privileges")
+
+ return StringBuilder().apply {
+ with(InfoBuilder) {
+ appendProfilesWithPrivilege("Globally Allowed", map, null, CAN_BUILD)
+ appendProfilesWithPrivilege("Globally Banned", map, null, BANNED)
+ }
+ }.toString()
+ }
+
+ @Cmd("entrust")
+ @Desc(
+ "Allows a player to manage globally",
+ shortVersion = "allows a player to manage globally"
+ )
+ suspend fun cmdEntrust(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
+ when (data[checkContext(context, owner)].allowManage(toPrivilegeKey(player))) {
+ FAIL_OWNER -> err("The target cannot be the owner themselves")
+ FAIL -> err("${player.name} is already allowed to manage globally")
+ SUCCESS -> "${player.name} is now allowed to manage globally"
+ }
+
+ @Cmd("distrust")
+ @Desc(
+ "Disallows a player to manage globally,",
+ "they will still be able to build",
+ shortVersion = "disallows a player to manage globally"
+ )
+ suspend fun cmdDistrust(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
+ when (data[checkContext(context, owner)].disallowManage(toPrivilegeKey(player))) {
+ FAIL_OWNER -> err("The target cannot be the owner themselves")
+ FAIL -> err("${player.name} is not currently allowed to manage globally")
+ SUCCESS -> "${player.name} is not allowed to manage globally anymore"
+ }
+
+ @Cmd("allow", aliases = ["add", "permit"])
+ @Desc(
+ "Globally allows a player to build on all",
+ "the parcels that you own.",
+ shortVersion = "globally allows a player to build on your parcels"
+ )
+ suspend fun cmdAllow(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
+ when (data[checkContext(context, owner)].allowBuild(toPrivilegeKey(player))) {
+ FAIL_OWNER -> err("The target cannot be the owner themselves")
+ FAIL -> err("${player.name} is already allowed globally")
+ SUCCESS -> "${player.name} is now allowed to build globally"
+ }
+
+ @Cmd("disallow", aliases = ["remove", "forbid"])
+ @Desc(
+ "Globally disallows a player to build on",
+ "the parcels that you own.",
+ "If the player is allowed to build on specific",
+ "parcels, they can still build there.",
+ shortVersion = "globally disallows a player to build on your parcels"
+ )
+ suspend fun cmdDisallow(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
+ when (data[checkContext(context, owner)].disallowBuild(toPrivilegeKey(player))) {
+ FAIL_OWNER -> err("The target cannot be the owner themselves")
+ FAIL -> err("${player.name} is not currently allowed globally")
+ SUCCESS -> "${player.name} is not allowed to build globally anymore"
+ }
+
+ @Cmd("ban", aliases = ["deny"])
+ @Desc(
+ "Globally bans a player from all the parcels",
+ "that you own, making them unable to enter.",
+ shortVersion = "globally bans a player from your parcels"
+ )
+ suspend fun cmdBan(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
+ when (data[checkContext(context, owner)].disallowEnter(toPrivilegeKey(player))) {
+ FAIL_OWNER -> err("The target cannot be the owner themselves")
+ FAIL -> err("${player.name} is already banned globally")
+ SUCCESS -> "${player.name} is now banned globally"
+ }
+
+ @Cmd("unban", aliases = ["undeny"])
+ @Desc(
+ "Globally unbans a player from all the parcels",
+ "that you own, they can enter again.",
+ "If the player is banned from specific parcels,",
+ "they will still be banned there.",
+ shortVersion = "globally unbans a player from your parcels"
+ )
+ suspend fun cmdUnban(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
+ when (data[checkContext(context, owner)].allowEnter(toPrivilegeKey(player))) {
+ FAIL_OWNER -> err("The target cannot be the owner themselves")
+ FAIL -> err("${player.name} is not currently banned globally")
+ SUCCESS -> "${player.name} is not banned globally anymore"
+ }
+
} \ No newline at end of file
diff --git a/src/main/kotlin/io/dico/parcels2/command/CommandsDebug.kt b/src/main/kotlin/io/dico/parcels2/command/CommandsDebug.kt
index e0bde7d..3f166ad 100644
--- a/src/main/kotlin/io/dico/parcels2/command/CommandsDebug.kt
+++ b/src/main/kotlin/io/dico/parcels2/command/CommandsDebug.kt
@@ -1,162 +1,162 @@
-package io.dico.parcels2.command
-
-import io.dico.dicore.Formatting
-import io.dico.dicore.command.*
-import io.dico.dicore.command.IContextFilter.Priority.PERMISSION
-import io.dico.dicore.command.annotation.Cmd
-import io.dico.dicore.command.annotation.PreprocessArgs
-import io.dico.dicore.command.annotation.RequireParameters
-import io.dico.dicore.command.parameter.ArgumentBuffer
-import io.dico.parcels2.*
-import io.dico.parcels2.blockvisitor.RegionTraverser
-import io.dico.parcels2.util.ext.PERM_ADMIN_MANAGE
-import io.dico.parcels2.util.ext.PERM_BAN_BYPASS
-import io.dico.parcels2.util.ext.PERM_BUILD_ANYWHERE
-import kotlinx.coroutines.launch
-import org.bukkit.Bukkit
-import org.bukkit.Material
-import org.bukkit.block.BlockFace
-import org.bukkit.block.data.Directional
-import org.bukkit.command.CommandSender
-import org.bukkit.entity.Player
-import java.util.Random
-
-class CommandsDebug(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
-
- @Cmd("reloadoptions")
- fun reloadOptions() {
- plugin.loadOptions()
- }
-
- @Cmd("tpworld")
- fun tpWorld(sender: Player, worldName: String): String {
- if (worldName == "list") {
- return Bukkit.getWorlds().joinToString("\n- ", "- ", "")
- }
- val world = Bukkit.getWorld(worldName) ?: err("World $worldName is not loaded")
- sender.teleport(world.spawnLocation)
- return "Teleported you to $worldName spawn"
- }
-
- @Cmd("make_mess")
- @RequireParcelPrivilege(Privilege.OWNER)
- fun ParcelScope.cmdMakeMess(context: ExecutionContext) {
- Validate.isTrue(!parcel.hasBlockVisitors, "A process is already running in this parcel")
-
- val server = plugin.server
- val blockDatas = arrayOf(
- server.createBlockData(Material.BLUE_WOOL),
- server.createBlockData(Material.LIME_WOOL),
- server.createBlockData(Material.GLASS),
- server.createBlockData(Material.STONE_SLAB),
- server.createBlockData(Material.STONE),
- server.createBlockData(Material.QUARTZ_BLOCK),
- server.createBlockData(Material.BROWN_CONCRETE)
- )
- val random = Random()
-
- world.blockManager.tryDoBlockOperation(plugin.parcelProvider, parcel.id, traverser = RegionTraverser.upward) { block ->
- block.blockData = blockDatas[random.nextInt(7)]
- }?.onProgressUpdate(1000, 1000) { progress, elapsedTime ->
- context.sendMessage(
- EMessageType.INFORMATIVE, "Mess progress: %.02f%%, %.2fs elapsed"
- .format(progress * 100, elapsedTime / 1000.0)
- )
- }
- }
-
- @Cmd("directionality", aliases = ["dir"])
- fun cmdDirectionality(sender: Player, context: ExecutionContext, material: Material): Any? {
- val senderLoc = sender.location
- val block = senderLoc.add(senderLoc.direction.setY(0).normalize().multiply(2).toLocation(sender.world)).block
-
- val blockData = Bukkit.createBlockData(material)
- if (blockData is Directional) {
- blockData.facing = BlockFace.SOUTH
- }
-
- block.blockData = blockData
- return if (blockData is Directional) "The block is facing south" else "The block is not directional, however it implements " +
- blockData.javaClass.interfaces!!.contentToString()
- }
-
- @Cmd("jobs")
- fun cmdJobs(): Any? {
- val workers = plugin.jobDispatcher.jobs
- println(workers.map { it.coroutine }.joinToString(separator = "\n"))
- return "Task count: ${workers.size}"
- }
-
- @Cmd("complete_jobs")
- fun cmdCompleteJobs(): Any? = cmdJobs().also {
- plugin.launch { plugin.jobDispatcher.completeAllTasks() }
- }
-
- @Cmd("message")
- @PreprocessArgs
- fun cmdMessage(sender: CommandSender, message: String): Any? {
- // testing @PreprocessArgs which merges "hello there" into a single argument
- sender.sendMessage(Formatting.translate(message))
- return null
- }
-
- @Cmd("hasperm")
- fun cmdHasperm(target: Player, permission: String): Any? {
- return target.hasPermission(permission).toString()
- }
-
- @Cmd("permissions")
- fun cmdPermissions(context: ExecutionContext, of: Player, vararg address: String): Any? {
- val target = context.address.dispatcherForTree.getDeepChild(ArgumentBuffer(address))
- Validate.isTrue(target.depth == address.size && target.hasCommand(), "Not found: /${address.joinToString(separator = " ")}")
- return getPermissionsOf(target).joinToString(separator = "\n") { "$it: ${of.hasPermission(it)}" }
- }
-
- @Cmd("privilege")
- @RequireParameters(1)
- suspend fun ParcelScope.cmdPrivilege(target: PlayerProfile, adminPerm: String?): Any? {
- val key = toPrivilegeKey(target)
-
- val perm = when (adminPerm) {
- "none" -> null
- "build" -> PERM_BUILD_ANYWHERE
- "manage", null -> PERM_ADMIN_MANAGE
- "enter" -> PERM_BAN_BYPASS
- else -> err("adminPerm should be build, manager or enter")
- }
-
- val privilege = if (perm == null) {
- parcel.getStoredPrivilege(key)
- } else {
- if (key is PlayerProfile.Star) err("* can't have permissions")
- parcel.getEffectivePrivilege(key.player!!, perm)
- }
-
- return privilege.toString()
- }
-
- private fun getPermissionsOf(address: ICommandAddress) = getPermissionsOf(address, emptyArray(), mutableListOf())
-
- private fun getPermissionsOf(address: ICommandAddress, path: Array<String>, result: MutableList<String>): List<String> {
- val command = address.command ?: return result
-
- var inherited = false
- for (filter in command.contextFilters) {
- when (filter) {
- is PermissionContextFilter -> {
- if (path.isEmpty()) result.add(filter.permission)
- else if (filter.isInheritable) result.add(filter.getInheritedPermission(path))
- }
- is InheritingContextFilter -> {
- if (filter.priority == PERMISSION && address.hasParent() && !inherited) {
- inherited = true
- getPermissionsOf(address.parent, arrayOf(address.mainKey, *path), result)
- }
- }
- }
- }
-
- return result
- }
-
+package io.dico.parcels2.command
+
+import io.dico.dicore.Formatting
+import io.dico.dicore.command.*
+import io.dico.dicore.command.IContextFilter.Priority.PERMISSION
+import io.dico.dicore.command.annotation.Cmd
+import io.dico.dicore.command.annotation.PreprocessArgs
+import io.dico.dicore.command.annotation.RequireParameters
+import io.dico.dicore.command.parameter.ArgumentBuffer
+import io.dico.parcels2.*
+import io.dico.parcels2.blockvisitor.RegionTraverser
+import io.dico.parcels2.util.ext.PERM_ADMIN_MANAGE
+import io.dico.parcels2.util.ext.PERM_BAN_BYPASS
+import io.dico.parcels2.util.ext.PERM_BUILD_ANYWHERE
+import kotlinx.coroutines.launch
+import org.bukkit.Bukkit
+import org.bukkit.Material
+import org.bukkit.block.BlockFace
+import org.bukkit.block.data.Directional
+import org.bukkit.command.CommandSender
+import org.bukkit.entity.Player
+import java.util.Random
+
+class CommandsDebug(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
+
+ @Cmd("reloadoptions")
+ fun reloadOptions() {
+ plugin.loadOptions()
+ }
+
+ @Cmd("tpworld")
+ fun tpWorld(sender: Player, worldName: String): String {
+ if (worldName == "list") {
+ return Bukkit.getWorlds().joinToString("\n- ", "- ", "")
+ }
+ val world = Bukkit.getWorld(worldName) ?: err("World $worldName is not loaded")
+ sender.teleport(world.spawnLocation)
+ return "Teleported you to $worldName spawn"
+ }
+
+ @Cmd("make_mess")
+ @RequireParcelPrivilege(Privilege.OWNER)
+ fun ParcelScope.cmdMakeMess(context: ExecutionContext) {
+ Validate.isTrue(!parcel.hasBlockVisitors, "A process is already running in this parcel")
+
+ val server = plugin.server
+ val blockDatas = arrayOf(
+ server.createBlockData(Material.BLUE_WOOL),
+ server.createBlockData(Material.LIME_WOOL),
+ server.createBlockData(Material.GLASS),
+ server.createBlockData(Material.STONE_SLAB),
+ server.createBlockData(Material.STONE),
+ server.createBlockData(Material.QUARTZ_BLOCK),
+ server.createBlockData(Material.BROWN_CONCRETE)
+ )
+ val random = Random()
+
+ world.blockManager.tryDoBlockOperation(plugin.parcelProvider, parcel.id, traverser = RegionTraverser.upward) { block ->
+ block.blockData = blockDatas[random.nextInt(7)]
+ }?.onProgressUpdate(1000, 1000) { progress, elapsedTime ->
+ context.sendMessage(
+ EMessageType.INFORMATIVE, "Mess progress: %.02f%%, %.2fs elapsed"
+ .format(progress * 100, elapsedTime / 1000.0)
+ )
+ }
+ }
+
+ @Cmd("directionality", aliases = ["dir"])
+ fun cmdDirectionality(sender: Player, context: ExecutionContext, material: Material): Any? {
+ val senderLoc = sender.location
+ val block = senderLoc.add(senderLoc.direction.setY(0).normalize().multiply(2).toLocation(sender.world)).block
+
+ val blockData = Bukkit.createBlockData(material)
+ if (blockData is Directional) {
+ blockData.facing = BlockFace.SOUTH
+ }
+
+ block.blockData = blockData
+ return if (blockData is Directional) "The block is facing south" else "The block is not directional, however it implements " +
+ blockData.javaClass.interfaces!!.contentToString()
+ }
+
+ @Cmd("jobs")
+ fun cmdJobs(): Any? {
+ val workers = plugin.jobDispatcher.jobs
+ println(workers.map { it.coroutine }.joinToString(separator = "\n"))
+ return "Task count: ${workers.size}"
+ }
+
+ @Cmd("complete_jobs")
+ fun cmdCompleteJobs(): Any? = cmdJobs().also {
+ plugin.launch { plugin.jobDispatcher.completeAllTasks() }
+ }
+
+ @Cmd("message")
+ @PreprocessArgs
+ fun cmdMessage(sender: CommandSender, message: String): Any? {
+ // testing @PreprocessArgs which merges "hello there" into a single argument
+ sender.sendMessage(Formatting.translate(message))
+ return null
+ }
+
+ @Cmd("hasperm")
+ fun cmdHasperm(target: Player, permission: String): Any? {
+ return target.hasPermission(permission).toString()
+ }
+
+ @Cmd("permissions")
+ fun cmdPermissions(context: ExecutionContext, of: Player, vararg address: String): Any? {
+ val target = context.address.dispatcherForTree.getDeepChild(ArgumentBuffer(address))
+ Validate.isTrue(target.depth == address.size && target.hasCommand(), "Not found: /${address.joinToString(separator = " ")}")
+ return getPermissionsOf(target).joinToString(separator = "\n") { "$it: ${of.hasPermission(it)}" }
+ }
+
+ @Cmd("privilege")
+ @RequireParameters(1)
+ suspend fun ParcelScope.cmdPrivilege(target: PlayerProfile, adminPerm: String?): Any? {
+ val key = toPrivilegeKey(target)
+
+ val perm = when (adminPerm) {
+ "none" -> null
+ "build" -> PERM_BUILD_ANYWHERE
+ "manage", null -> PERM_ADMIN_MANAGE
+ "enter" -> PERM_BAN_BYPASS
+ else -> err("adminPerm should be build, manager or enter")
+ }
+
+ val privilege = if (perm == null) {
+ parcel.getStoredPrivilege(key)
+ } else {
+ if (key is PlayerProfile.Star) err("* can't have permissions")
+ parcel.getEffectivePrivilege(key.player!!, perm)
+ }
+
+ return privilege.toString()
+ }
+
+ private fun getPermissionsOf(address: ICommandAddress) = getPermissionsOf(address, emptyArray(), mutableListOf())
+
+ private fun getPermissionsOf(address: ICommandAddress, path: Array<String>, result: MutableList<String>): List<String> {
+ val command = address.command ?: return result
+
+ var inherited = false
+ for (filter in command.contextFilters) {
+ when (filter) {
+ is PermissionContextFilter -> {
+ if (path.isEmpty()) result.add(filter.permission)
+ else if (filter.isInheritable) result.add(filter.getInheritedPermission(path))
+ }
+ is InheritingContextFilter -> {
+ if (filter.priority == PERMISSION && address.hasParent() && !inherited) {
+ inherited = true
+ getPermissionsOf(address.parent, arrayOf(address.mainKey, *path), result)
+ }
+ }
+ }
+ }
+
+ return result
+ }
+
} \ No newline at end of file
diff --git a/src/main/kotlin/io/dico/parcels2/command/CommandsGeneral.kt b/src/main/kotlin/io/dico/parcels2/command/CommandsGeneral.kt
index c918b80..9929a4c 100644
--- a/src/main/kotlin/io/dico/parcels2/command/CommandsGeneral.kt
+++ b/src/main/kotlin/io/dico/parcels2/command/CommandsGeneral.kt
@@ -113,6 +113,7 @@ class CommandsGeneral(plugin: ParcelsPlugin, parent: SpecialCommandAddress) : Ab
return "Enjoy your new parcel!"
}
+ /*
@Cmd("unclaim")
@Desc("Unclaims this parcel")
@RequireParcelPrivilege(Privilege.OWNER)
@@ -120,7 +121,7 @@ class CommandsGeneral(plugin: ParcelsPlugin, parent: SpecialCommandAddress) : Ab
checkConnected("be unclaimed")
parcel.dispose()
return "Your parcel has been disposed"
- }
+ }*/
@Cmd("clear")
@RequireParcelPrivilege(Privilege.OWNER)
diff --git a/src/main/kotlin/io/dico/parcels2/command/CommandsPrivilegesGlobal.kt b/src/main/kotlin/io/dico/parcels2/command/CommandsPrivilegesGlobal.kt
index 3b4234c..33ffb8b 100644
--- a/src/main/kotlin/io/dico/parcels2/command/CommandsPrivilegesGlobal.kt
+++ b/src/main/kotlin/io/dico/parcels2/command/CommandsPrivilegesGlobal.kt
@@ -1,77 +1,77 @@
-package io.dico.parcels2.command
-
-import io.dico.dicore.command.ExecutionContext
-import io.dico.dicore.command.annotation.Cmd
-import io.dico.dicore.command.annotation.Desc
-import io.dico.parcels2.ParcelsPlugin
-import io.dico.parcels2.PlayerProfile
-import org.bukkit.entity.Player
-
-class CommandsPrivilegesGlobal(plugin: ParcelsPlugin,
- val adminVersion: CommandsAdminPrivilegesGlobal) : AbstractParcelCommands(plugin) {
- @Cmd("list", aliases = ["l"])
- @Desc(
- "List globally declared privileges, players you",
- "allowed to build on or banned from all your parcels",
- shortVersion = "lists globally declared privileges"
- )
- fun cmdList(sender: Player, context: ExecutionContext) =
- adminVersion.cmdList(context, sender)
-
- @Cmd("entrust")
- @Desc(
- "Allows a player to manage globally",
- shortVersion = "allows a player to manage globally"
- )
- suspend fun cmdEntrust(sender: Player, context: ExecutionContext, player: PlayerProfile) =
- adminVersion.cmdEntrust(context, sender, player)
-
- @Cmd("distrust")
- @Desc(
- "Disallows a player to manage globally,",
- "they will still be able to build",
- shortVersion = "disallows a player to manage globally"
- )
- suspend fun cmdDistrust(sender: Player, context: ExecutionContext, player: PlayerProfile) =
- adminVersion.cmdDistrust(context, sender, player)
-
- @Cmd("allow", aliases = ["add", "permit"])
- @Desc(
- "Globally allows a player to build on all",
- "the parcels that you own.",
- shortVersion = "globally allows a player to build on your parcels"
- )
- suspend fun cmdAllow(sender: Player, context: ExecutionContext, player: PlayerProfile) =
- adminVersion.cmdAllow(context, sender, player)
-
- @Cmd("disallow", aliases = ["remove", "forbid"])
- @Desc(
- "Globally disallows a player to build on",
- "the parcels that you own.",
- "If the player is allowed to build on specific",
- "parcels, they can still build there.",
- shortVersion = "globally disallows a player to build on your parcels"
- )
- suspend fun cmdDisallow(sender: Player, context: ExecutionContext, player: PlayerProfile) =
- adminVersion.cmdDisallow(context, sender, player)
-
- @Cmd("ban", aliases = ["deny"])
- @Desc(
- "Globally bans a player from all the parcels",
- "that you own, making them unable to enter.",
- shortVersion = "globally bans a player from your parcels"
- )
- suspend fun cmdBan(sender: Player, context: ExecutionContext, player: PlayerProfile) =
- adminVersion.cmdBan(context, sender, player)
-
- @Cmd("unban", aliases = ["undeny"])
- @Desc(
- "Globally unbans a player from all the parcels",
- "that you own, they can enter again.",
- "If the player is banned from specific parcels,",
- "they will still be banned there.",
- shortVersion = "globally unbans a player from your parcels"
- )
- suspend fun cmdUnban(sender: Player, context: ExecutionContext, player: PlayerProfile) =
- adminVersion.cmdUnban(context, sender, player)
+package io.dico.parcels2.command
+
+import io.dico.dicore.command.ExecutionContext
+import io.dico.dicore.command.annotation.Cmd
+import io.dico.dicore.command.annotation.Desc
+import io.dico.parcels2.ParcelsPlugin
+import io.dico.parcels2.PlayerProfile
+import org.bukkit.entity.Player
+
+class CommandsPrivilegesGlobal(plugin: ParcelsPlugin,
+ val adminVersion: CommandsAdminPrivilegesGlobal) : AbstractParcelCommands(plugin) {
+ @Cmd("list", aliases = ["l"])
+ @Desc(
+ "List globally declared privileges, players you",
+ "allowed to build on or banned from all your parcels",
+ shortVersion = "lists globally declared privileges"
+ )
+ fun cmdList(sender: Player, context: ExecutionContext) =
+ adminVersion.cmdList(context, sender)
+
+ @Cmd("entrust")
+ @Desc(
+ "Allows a player to manage globally",
+ shortVersion = "allows a player to manage globally"
+ )
+ suspend fun cmdEntrust(sender: Player, context: ExecutionContext, player: PlayerProfile) =
+ adminVersion.cmdEntrust(context, sender, player)
+
+ @Cmd("distrust")
+ @Desc(
+ "Disallows a player to manage globally,",
+ "they will still be able to build",
+ shortVersion = "disallows a player to manage globally"
+ )
+ suspend fun cmdDistrust(sender: Player, context: ExecutionContext, player: PlayerProfile) =
+ adminVersion.cmdDistrust(context, sender, player)
+
+ @Cmd("allow", aliases = ["add", "permit"])
+ @Desc(
+ "Globally allows a player to build on all",
+ "the parcels that you own.",
+ shortVersion = "globally allows a player to build on your parcels"
+ )
+ suspend fun cmdAllow(sender: Player, context: ExecutionContext, player: PlayerProfile) =
+ adminVersion.cmdAllow(context, sender, player)
+
+ @Cmd("disallow", aliases = ["remove", "forbid"])
+ @Desc(
+ "Globally disallows a player to build on",
+ "the parcels that you own.",
+ "If the player is allowed to build on specific",
+ "parcels, they can still build there.",
+ shortVersion = "globally disallows a player to build on your parcels"
+ )
+ suspend fun cmdDisallow(sender: Player, context: ExecutionContext, player: PlayerProfile) =
+ adminVersion.cmdDisallow(context, sender, player)
+
+ @Cmd("ban", aliases = ["deny"])
+ @Desc(
+ "Globally bans a player from all the parcels",
+ "that you own, making them unable to enter.",
+ shortVersion = "globally bans a player from your parcels"
+ )
+ suspend fun cmdBan(sender: Player, context: ExecutionContext, player: PlayerProfile) =
+ adminVersion.cmdBan(context, sender, player)
+
+ @Cmd("unban", aliases = ["undeny"])
+ @Desc(
+ "Globally unbans a player from all the parcels",
+ "that you own, they can enter again.",
+ "If the player is banned from specific parcels,",
+ "they will still be banned there.",
+ shortVersion = "globally unbans a player from your parcels"
+ )
+ suspend fun cmdUnban(sender: Player, context: ExecutionContext, player: PlayerProfile) =
+ adminVersion.cmdUnban(context, sender, player)
} \ No newline at end of file
diff --git a/src/main/kotlin/io/dico/parcels2/command/CommandsPrivilegesLocal.kt b/src/main/kotlin/io/dico/parcels2/command/CommandsPrivilegesLocal.kt
index 21910b1..e3aba22 100644
--- a/src/main/kotlin/io/dico/parcels2/command/CommandsPrivilegesLocal.kt
+++ b/src/main/kotlin/io/dico/parcels2/command/CommandsPrivilegesLocal.kt
@@ -1,144 +1,144 @@
-package io.dico.parcels2.command
-
-import io.dico.dicore.command.Validate
-import io.dico.dicore.command.annotation.Cmd
-import io.dico.dicore.command.annotation.Desc
-import io.dico.parcels2.*
-import io.dico.parcels2.PrivilegeChangeResult.*
-import io.dico.parcels2.util.ext.PERM_ADMIN_MANAGE
-import io.dico.parcels2.util.ext.hasPermAdminManage
-import org.bukkit.entity.Player
-
-class CommandsPrivilegesLocal(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
-
- private fun ParcelScope.checkPrivilege(sender: Player, key: PrivilegeKey) {
- val senderPrivilege = parcel.getEffectivePrivilege(sender, PERM_ADMIN_MANAGE)
- val targetPrivilege = parcel.getStoredPrivilege(key)
- Validate.isTrue(senderPrivilege > targetPrivilege, "You may not change the privilege of ${key.notNullName}")
- }
-
- private fun ParcelScope.checkOwned(sender: Player) {
- Validate.isTrue(parcel.owner != null || sender.hasPermAdminManage, "This parcel is unowned")
- }
-
- @Cmd("entrust")
- @Desc(
- "Allows a player to manage this parcel",
- shortVersion = "allows a player to manage this parcel"
- )
- @RequireParcelPrivilege(Privilege.OWNER)
- suspend fun ParcelScope.cmdEntrust(sender: Player, player: PlayerProfile): Any? {
- checkConnected("have privileges changed")
- checkOwned(sender)
-
- val key = toPrivilegeKey(player)
- return when (parcel.allowManage(key)) {
- FAIL_OWNER -> err("The target already owns the parcel")
- FAIL -> err("${player.name} is already allowed to manage this parcel")
- SUCCESS -> "${player.name} is now allowed to manage this parcel"
- }
- }
-
- @Cmd("distrust")
- @Desc(
- "Disallows a player to manage this parcel,",
- "they will still be able to build",
- shortVersion = "disallows a player to manage this parcel"
- )
- @RequireParcelPrivilege(Privilege.OWNER)
- suspend fun ParcelScope.cmdDistrust(sender: Player, player: PlayerProfile): Any? {
- checkConnected("have privileges changed")
- checkOwned(sender)
-
- val key = toPrivilegeKey(player)
- return when (parcel.disallowManage(key)) {
- FAIL_OWNER -> err("The target owns the parcel and can't be distrusted")
- FAIL -> err("${player.name} is not currently allowed to manage this parcel")
- SUCCESS -> "${player.name} is not allowed to manage this parcel anymore"
- }
- }
-
- @Cmd("allow", aliases = ["add", "permit"])
- @Desc(
- "Allows a player to build on this parcel",
- shortVersion = "allows a player to build on this parcel"
- )
- @RequireParcelPrivilege(Privilege.CAN_MANAGE)
- suspend fun ParcelScope.cmdAllow(sender: Player, player: PlayerProfile): Any? {
- checkConnected("have privileges changed")
- checkOwned(sender)
-
- val key = toPrivilegeKey(player)
- checkPrivilege(sender, key)
-
- return when (parcel.allowBuild(key)) {
- FAIL_OWNER -> err("The target already owns the parcel")
- FAIL -> err("${player.name} is already allowed to build on this parcel")
- SUCCESS -> "${player.name} is now allowed to build on this parcel"
- }
- }
-
- @Cmd("disallow", aliases = ["remove", "forbid"])
- @Desc(
- "Disallows a player to build on this parcel,",
- "they won't be allowed to anymore",
- shortVersion = "disallows a player to build on this parcel"
- )
- @RequireParcelPrivilege(Privilege.CAN_MANAGE)
- suspend fun ParcelScope.cmdDisallow(sender: Player, player: PlayerProfile): Any? {
- checkConnected("have privileges changed")
- checkOwned(sender)
-
- val key = toPrivilegeKey(player)
- checkPrivilege(sender, key)
-
- return when (parcel.disallowBuild(key)) {
- FAIL_OWNER -> err("The target owns the parcel")
- FAIL -> err("${player.name} is not currently allowed to build on this parcel")
- SUCCESS -> "${player.name} is not allowed to build on this parcel anymore"
- }
- }
-
- @Cmd("ban", aliases = ["deny"])
- @Desc(
- "Bans a player from this parcel,",
- "making them unable to enter",
- shortVersion = "bans a player from this parcel"
- )
- @RequireParcelPrivilege(Privilege.CAN_MANAGE)
- suspend fun ParcelScope.cmdBan(sender: Player, player: PlayerProfile): Any? {
- checkConnected("have privileges changed")
- checkOwned(sender)
-
- val key = toPrivilegeKey(player)
- checkPrivilege(sender, key)
-
- return when (parcel.disallowEnter(key)) {
- FAIL_OWNER -> err("The target owns the parcel")
- FAIL -> err("${player.name} is already banned from this parcel")
- SUCCESS -> "${player.name} is now banned from this parcel"
- }
- }
-
- @Cmd("unban", aliases = ["undeny"])
- @Desc(
- "Unbans a player from this parcel,",
- "they will be able to enter it again",
- shortVersion = "unbans a player from this parcel"
- )
- @RequireParcelPrivilege(Privilege.CAN_MANAGE)
- suspend fun ParcelScope.cmdUnban(sender: Player, player: PlayerProfile): Any? {
- checkConnected("have privileges changed")
- checkOwned(sender)
-
- val key = toPrivilegeKey(player)
- checkPrivilege(sender, key)
-
- return when (parcel.allowEnter(key)) {
- FAIL_OWNER -> err("The target owns the parcel")
- FAIL -> err("${player.name} is not currently banned from this parcel")
- SUCCESS -> "${player.name} is not banned from this parcel anymore"
- }
- }
-
+package io.dico.parcels2.command
+
+import io.dico.dicore.command.Validate
+import io.dico.dicore.command.annotation.Cmd
+import io.dico.dicore.command.annotation.Desc
+import io.dico.parcels2.*
+import io.dico.parcels2.PrivilegeChangeResult.*
+import io.dico.parcels2.util.ext.PERM_ADMIN_MANAGE
+import io.dico.parcels2.util.ext.hasPermAdminManage
+import org.bukkit.entity.Player
+
+class CommandsPrivilegesLocal(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
+
+ private fun ParcelScope.checkPrivilege(sender: Player, key: PrivilegeKey) {
+ val senderPrivilege = parcel.getEffectivePrivilege(sender, PERM_ADMIN_MANAGE)
+ val targetPrivilege = parcel.getStoredPrivilege(key)
+ Validate.isTrue(senderPrivilege > targetPrivilege, "You may not change the privilege of ${key.notNullName}")
+ }
+
+ private fun ParcelScope.checkOwned(sender: Player) {
+ Validate.isTrue(parcel.owner != null || sender.hasPermAdminManage, "This parcel is unowned")
+ }
+
+ @Cmd("entrust")
+ @Desc(
+ "Allows a player to manage this parcel",
+ shortVersion = "allows a player to manage this parcel"
+ )
+ @RequireParcelPrivilege(Privilege.OWNER)
+ suspend fun ParcelScope.cmdEntrust(sender: Player, player: PlayerProfile): Any? {
+ checkConnected("have privileges changed")
+ checkOwned(sender)
+
+ val key = toPrivilegeKey(player)
+ return when (parcel.allowManage(key)) {
+ FAIL_OWNER -> err("The target already owns the parcel")
+ FAIL -> err("${player.name} is already allowed to manage this parcel")
+ SUCCESS -> "${player.name} is now allowed to manage this parcel"
+ }
+ }
+
+ @Cmd("distrust")
+ @Desc(
+ "Disallows a player to manage this parcel,",
+ "they will still be able to build",
+ shortVersion = "disallows a player to manage this parcel"
+ )
+ @RequireParcelPrivilege(Privilege.OWNER)
+ suspend fun ParcelScope.cmdDistrust(sender: Player, player: PlayerProfile): Any? {
+ checkConnected("have privileges changed")
+ checkOwned(sender)
+
+ val key = toPrivilegeKey(player)
+ return when (parcel.disallowManage(key)) {
+ FAIL_OWNER -> err("The target owns the parcel and can't be distrusted")
+ FAIL -> err("${player.name} is not currently allowed to manage this parcel")
+ SUCCESS -> "${player.name} is not allowed to manage this parcel anymore"
+ }
+ }
+
+ @Cmd("allow", aliases = ["add", "permit"])
+ @Desc(
+ "Allows a player to build on this parcel",
+ shortVersion = "allows a player to build on this parcel"
+ )
+ @RequireParcelPrivilege(Privilege.CAN_MANAGE)
+ suspend fun ParcelScope.cmdAllow(sender: Player, player: PlayerProfile): Any? {
+ checkConnected("have privileges changed")
+ checkOwned(sender)
+
+ val key = toPrivilegeKey(player)
+ checkPrivilege(sender, key)
+
+ return when (parcel.allowBuild(key)) {
+ FAIL_OWNER -> err("The target already owns the parcel")
+ FAIL -> err("${player.name} is already allowed to build on this parcel")
+ SUCCESS -> "${player.name} is now allowed to build on this parcel"
+ }
+ }
+
+ @Cmd("disallow", aliases = ["remove", "forbid"])
+ @Desc(
+ "Disallows a player to build on this parcel,",
+ "they won't be allowed to anymore",
+ shortVersion = "disallows a player to build on this parcel"
+ )
+ @RequireParcelPrivilege(Privilege.CAN_MANAGE)
+ suspend fun ParcelScope.cmdDisallow(sender: Player, player: PlayerProfile): Any? {
+ checkConnected("have privileges changed")
+ checkOwned(sender)
+
+ val key = toPrivilegeKey(player)
+ checkPrivilege(sender, key)
+
+ return when (parcel.disallowBuild(key)) {
+ FAIL_OWNER -> err("The target owns the parcel")
+ FAIL -> err("${player.name} is not currently allowed to build on this parcel")
+ SUCCESS -> "${player.name} is not allowed to build on this parcel anymore"
+ }
+ }
+
+ @Cmd("ban", aliases = ["deny"])
+ @Desc(
+ "Bans a player from this parcel,",
+ "making them unable to enter",
+ shortVersion = "bans a player from this parcel"
+ )
+ @RequireParcelPrivilege(Privilege.CAN_MANAGE)
+ suspend fun ParcelScope.cmdBan(sender: Player, player: PlayerProfile): Any? {
+ checkConnected("have privileges changed")
+ checkOwned(sender)
+
+ val key = toPrivilegeKey(player)
+ checkPrivilege(sender, key)
+
+ return when (parcel.disallowEnter(key)) {
+ FAIL_OWNER -> err("The target owns the parcel")
+ FAIL -> err("${player.name} is already banned from this parcel")
+ SUCCESS -> "${player.name} is now banned from this parcel"
+ }
+ }
+
+ @Cmd("unban", aliases = ["undeny"])
+ @Desc(
+ "Unbans a player from this parcel,",
+ "they will be able to enter it again",
+ shortVersion = "unbans a player from this parcel"
+ )
+ @RequireParcelPrivilege(Privilege.CAN_MANAGE)
+ suspend fun ParcelScope.cmdUnban(sender: Player, player: PlayerProfile): Any? {
+ checkConnected("have privileges changed")
+ checkOwned(sender)
+
+ val key = toPrivilegeKey(player)
+ checkPrivilege(sender, key)
+
+ return when (parcel.allowEnter(key)) {
+ FAIL_OWNER -> err("The target owns the parcel")
+ FAIL -> err("${player.name} is not currently banned from this parcel")
+ SUCCESS -> "${player.name} is not banned from this parcel anymore"
+ }
+ }
+
} \ No newline at end of file
diff --git a/src/main/kotlin/io/dico/parcels2/command/ParcelCommandReceivers.kt b/src/main/kotlin/io/dico/parcels2/command/ParcelCommandReceivers.kt
index 15548b4..e41fd37 100644
--- a/src/main/kotlin/io/dico/parcels2/command/ParcelCommandReceivers.kt
+++ b/src/main/kotlin/io/dico/parcels2/command/ParcelCommandReceivers.kt
@@ -1,68 +1,68 @@
-package io.dico.parcels2.command
-
-import io.dico.dicore.command.CommandException
-import io.dico.dicore.command.ExecutionContext
-import io.dico.dicore.command.registration.reflect.ICommandReceiver
-import io.dico.dicore.command.Validate
-import io.dico.parcels2.*
-import io.dico.parcels2.Privilege.*
-import io.dico.parcels2.util.ext.hasPermAdminManage
-import io.dico.parcels2.util.ext.uuid
-import org.bukkit.entity.Player
-import java.lang.reflect.Method
-import kotlin.reflect.full.extensionReceiverParameter
-import kotlin.reflect.full.findAnnotation
-import kotlin.reflect.jvm.jvmErasure
-import kotlin.reflect.jvm.kotlinFunction
-
-@Target(AnnotationTarget.FUNCTION)
-@Retention(AnnotationRetention.RUNTIME)
-annotation class RequireParcelPrivilege(val privilege: Privilege)
-
-/*
-@Target(AnnotationTarget.FUNCTION)
-@Retention(AnnotationRetention.RUNTIME)
-annotation class SuspensionTimeout(val millis: Int)
-*/
-
-open class WorldScope(val world: ParcelWorld) : ICommandReceiver
-open class ParcelScope(val parcel: Parcel) : WorldScope(parcel.world) {
- fun checkCanManage(player: Player, action: String) = Validate.isTrue(parcel.canManage(player), "You must own this parcel to $action")
-}
-
-fun getParcelCommandReceiver(parcelProvider: ParcelProvider, context: ExecutionContext, method: Method, cmdName: String): ICommandReceiver {
- val player = context.sender as Player
- val function = method.kotlinFunction!!
- val receiverType = function.extensionReceiverParameter!!.type
- val require = function.findAnnotation<RequireParcelPrivilege>()
-
- return when (receiverType.jvmErasure) {
- ParcelScope::class -> ParcelScope(parcelProvider.getParcelRequired(player, require?.privilege))
- WorldScope::class -> WorldScope(parcelProvider.getWorldRequired(player, require?.privilege == ADMIN))
- else -> throw InternalError("Invalid command receiver type")
- }
-}
-
-fun ParcelProvider.getWorldRequired(player: Player, admin: Boolean = false): ParcelWorld {
- if (admin) Validate.isTrue(player.hasPermAdminManage, "You must have admin rights to use that command")
- return getWorld(player.world)
- ?: throw CommandException("You must be in a parcel world to use that command")
-}
-
-fun ParcelProvider.getParcelRequired(player: Player, privilege: Privilege? = null): Parcel {
- val parcel = getWorldRequired(player, admin = privilege == ADMIN).getParcelAt(player)
- ?: throw CommandException("You must be in a parcel to use that command")
-
- if (!player.hasPermAdminManage) {
- @Suppress("NON_EXHAUSTIVE_WHEN")
- when (privilege) {
- OWNER ->
- Validate.isTrue(parcel.isOwner(player.uuid), "You must own this parcel to use that command")
- CAN_MANAGE ->
- Validate.isTrue(parcel.canManage(player), "You must have management privileges on this parcel to use that command")
- }
- }
-
- return parcel
-}
-
+package io.dico.parcels2.command
+
+import io.dico.dicore.command.CommandException
+import io.dico.dicore.command.ExecutionContext
+import io.dico.dicore.command.registration.reflect.ICommandReceiver
+import io.dico.dicore.command.Validate
+import io.dico.parcels2.*
+import io.dico.parcels2.Privilege.*
+import io.dico.parcels2.util.ext.hasPermAdminManage
+import io.dico.parcels2.util.ext.uuid
+import org.bukkit.entity.Player
+import java.lang.reflect.Method
+import kotlin.reflect.full.extensionReceiverParameter
+import kotlin.reflect.full.findAnnotation
+import kotlin.reflect.jvm.jvmErasure
+import kotlin.reflect.jvm.kotlinFunction
+
+@Target(AnnotationTarget.FUNCTION)
+@Retention(AnnotationRetention.RUNTIME)
+annotation class RequireParcelPrivilege(val privilege: Privilege)
+
+/*
+@Target(AnnotationTarget.FUNCTION)
+@Retention(AnnotationRetention.RUNTIME)
+annotation class SuspensionTimeout(val millis: Int)
+*/
+
+open class WorldScope(val world: ParcelWorld) : ICommandReceiver
+open class ParcelScope(val parcel: Parcel) : WorldScope(parcel.world) {
+ fun checkCanManage(player: Player, action: String) = Validate.isTrue(parcel.canManage(player), "You must own this parcel to $action")
+}
+
+fun getParcelCommandReceiver(parcelProvider: ParcelProvider, context: ExecutionContext, method: Method, cmdName: String): ICommandReceiver {
+ val player = context.sender as Player
+ val function = method.kotlinFunction!!
+ val receiverType = function.extensionReceiverParameter!!.type
+ val require = function.findAnnotation<RequireParcelPrivilege>()
+
+ return when (receiverType.jvmErasure) {
+ ParcelScope::class -> ParcelScope(parcelProvider.getParcelRequired(player, require?.privilege))
+ WorldScope::class -> WorldScope(parcelProvider.getWorldRequired(player, require?.privilege == ADMIN))
+ else -> throw InternalError("Invalid command receiver type")
+ }
+}
+
+fun ParcelProvider.getWorldRequired(player: Player, admin: Boolean = false): ParcelWorld {
+ if (admin) Validate.isTrue(player.hasPermAdminManage, "You must have admin rights to use that command")
+ return getWorld(player.world)
+ ?: throw CommandException("You must be in a parcel world to use that command")
+}
+
+fun ParcelProvider.getParcelRequired(player: Player, privilege: Privilege? = null): Parcel {
+ val parcel = getWorldRequired(player, admin = privilege == ADMIN).getParcelAt(player)
+ ?: throw CommandException("You must be in a parcel to use that command")
+
+ if (!player.hasPermAdminManage) {
+ @Suppress("NON_EXHAUSTIVE_WHEN")
+ when (privilege) {
+ OWNER ->
+ Validate.isTrue(parcel.isOwner(player.uuid), "You must own this parcel to use that command")
+ CAN_MANAGE ->
+ Validate.isTrue(parcel.canManage(player), "You must have management privileges on this parcel to use that command")
+ }
+ }
+
+ return parcel
+}
+
diff --git a/src/main/kotlin/io/dico/parcels2/command/ParcelOptionsInteractCommand.kt b/src/main/kotlin/io/dico/parcels2/command/ParcelOptionsInteractCommand.kt
index 23087dc..fbe4333 100644
--- a/src/main/kotlin/io/dico/parcels2/command/ParcelOptionsInteractCommand.kt
+++ b/src/main/kotlin/io/dico/parcels2/command/ParcelOptionsInteractCommand.kt
@@ -1,56 +1,56 @@
-package io.dico.parcels2.command
-
-import io.dico.dicore.command.*
-import io.dico.dicore.command.parameter.type.ParameterTypes
-import io.dico.parcels2.Interactables
-import io.dico.parcels2.ParcelsPlugin
-import io.dico.parcels2.Privilege
-import org.bukkit.command.CommandSender
-import org.bukkit.entity.Player
-
-class ParcelOptionsInteractCommand(val plugin: ParcelsPlugin) : Command() {
-
- init {
- setShortDescription("View and/or change the setting")
- setDescription(shortDescription)
- addContextFilter(IContextFilter.PLAYER_ONLY)
- addContextFilter(IContextFilter.INHERIT_PERMISSIONS)
- addParameter("allowed", "new setting", ParameterTypes.BOOLEAN)
- requiredParameters(0)
- }
-
- override fun execute(sender: CommandSender, context: ExecutionContext): String? {
- if (!plugin.storage.isConnected) err("Parcels cannot have their options changed right now because of a database error")
-
- val interactableClass = Interactables[context.address.mainKey]
- val allowed: Boolean? = context.get("allowed")
-
- val parcel = plugin.parcelProvider.getParcelRequired(sender as Player,
- if (allowed == null) Privilege.DEFAULT else Privilege.CAN_MANAGE)
-
- if (allowed == null) {
- val setting = parcel.interactableConfig.isInteractable(interactableClass)
- val default = setting == interactableClass.interactableByDefault
-
- val canColor = context.address.chatHandler.getChatFormatForType(EMessageType.BAD_NEWS)
- val cannotColor = context.address.chatHandler.getChatFormatForType(EMessageType.GOOD_NEWS)
- val resetColor = context.address.chatHandler.getChatFormatForType(EMessageType.RESULT)
-
- val settingString = (if (setting) "${canColor}can" else "${cannotColor}cannot") + resetColor
- val defaultString = if (default) " (default)" else ""
-
- return "Players $settingString interact with ${interactableClass.name} on this parcel$defaultString"
- }
-
- val change = parcel.interactableConfig.setInteractable(interactableClass, allowed)
-
- val interactableClassName = interactableClass.name
- return when {
- allowed && change -> "Other players can now interact with $interactableClassName"
- allowed && !change -> err("Other players could already interact with $interactableClassName")
- change -> "Other players can not interact with $interactableClassName anymore"
- else -> err("Other players were not allowed to interact with $interactableClassName")
- }
- }
-
-}
+package io.dico.parcels2.command
+
+import io.dico.dicore.command.*
+import io.dico.dicore.command.parameter.type.ParameterTypes
+import io.dico.parcels2.Interactables
+import io.dico.parcels2.ParcelsPlugin
+import io.dico.parcels2.Privilege
+import org.bukkit.command.CommandSender
+import org.bukkit.entity.Player
+
+class ParcelOptionsInteractCommand(val plugin: ParcelsPlugin) : Command() {
+
+ init {
+ setShortDescription("View and/or change the setting")
+ setDescription(shortDescription)
+ addContextFilter(IContextFilter.PLAYER_ONLY)
+ addContextFilter(IContextFilter.INHERIT_PERMISSIONS)
+ addParameter("allowed", "new setting", ParameterTypes.BOOLEAN)
+ requiredParameters(0)
+ }
+
+ override fun execute(sender: CommandSender, context: ExecutionContext): String? {
+ if (!plugin.storage.isConnected) err("Parcels cannot have their options changed right now because of a database error")
+
+ val interactableClass = Interactables[context.address.mainKey]
+ val allowed: Boolean? = context.get("allowed")
+
+ val parcel = plugin.parcelProvider.getParcelRequired(sender as Player,
+ if (allowed == null) Privilege.DEFAULT else Privilege.CAN_MANAGE)
+
+ if (allowed == null) {
+ val setting = parcel.interactableConfig.isInteractable(interactableClass)
+ val default = setting == interactableClass.interactableByDefault
+
+ val canColor = context.address.chatHandler.getChatFormatForType(EMessageType.BAD_NEWS)
+ val cannotColor = context.address.chatHandler.getChatFormatForType(EMessageType.GOOD_NEWS)
+ val resetColor = context.address.chatHandler.getChatFormatForType(EMessageType.RESULT)
+
+ val settingString = (if (setting) "${canColor}can" else "${cannotColor}cannot") + resetColor
+ val defaultString = if (default) " (default)" else ""
+
+ return "Players $settingString interact with ${interactableClass.name} on this parcel$defaultString"
+ }
+
+ val change = parcel.interactableConfig.setInteractable(interactableClass, allowed)
+
+ val interactableClassName = interactableClass.name
+ return when {
+ allowed && change -> "Other players can now interact with $interactableClassName"
+ allowed && !change -> err("Other players could already interact with $interactableClassName")
+ change -> "Other players can not interact with $interactableClassName anymore"
+ else -> err("Other players were not allowed to interact with $interactableClassName")
+ }
+ }
+
+}
diff --git a/src/main/kotlin/io/dico/parcels2/command/ParcelParameterTypes.kt b/src/main/kotlin/io/dico/parcels2/command/ParcelParameterTypes.kt
index c7083a1..1b20f72 100644
--- a/src/main/kotlin/io/dico/parcels2/command/ParcelParameterTypes.kt
+++ b/src/main/kotlin/io/dico/parcels2/command/ParcelParameterTypes.kt
@@ -6,7 +6,6 @@ import io.dico.dicore.command.parameter.Parameter
import io.dico.dicore.command.parameter.type.ParameterConfig
import io.dico.dicore.command.parameter.type.ParameterType
import io.dico.parcels2.*
-import io.dico.parcels2.command.ProfileKind.Companion.ANY
import io.dico.parcels2.command.ProfileKind.Companion.FAKE
import io.dico.parcels2.command.ProfileKind.Companion.REAL
import org.bukkit.Location
@@ -53,6 +52,7 @@ annotation class ProfileKind(val kind: Int) {
const val REAL = 1
const val FAKE = 2
const val ANY = REAL or FAKE
+ const val ALLOW_INVALID = 4
override fun toParameterInfo(annotation: ProfileKind): Int {
return annotation.kind
@@ -62,13 +62,20 @@ annotation class ProfileKind(val kind: Int) {
class ProfileParameterType : ParameterType<PlayerProfile, Int>(PlayerProfile::class.java, ProfileKind) {
- override fun parse(parameter: Parameter<PlayerProfile, Int>, sender: CommandSender, buffer: ArgumentBuffer): PlayerProfile {
+ override fun parse(parameter: Parameter<PlayerProfile, Int>, sender: CommandSender, buffer: ArgumentBuffer): PlayerProfile? {
val info = parameter.paramInfo ?: REAL
val allowReal = (info and REAL) != 0
val allowFake = (info and FAKE) != 0
val input = buffer.next()!!
- return PlayerProfile.byName(input, allowReal, allowFake)
+
+ val profile = PlayerProfile.byName(input, allowReal, allowFake)
+
+ if (profile == null && (info and ProfileKind.ALLOW_INVALID) == 0) {
+ invalidInput(parameter, "\'$input\' is not a valid player name")
+ }
+
+ return profile
}
override fun complete(
diff --git a/src/main/kotlin/io/dico/parcels2/command/ParcelTarget.kt b/src/main/kotlin/io/dico/parcels2/command/ParcelTarget.kt
index 8891912..9ba3c25 100644
--- a/src/main/kotlin/io/dico/parcels2/command/ParcelTarget.kt
+++ b/src/main/kotlin/io/dico/parcels2/command/ParcelTarget.kt
@@ -25,7 +25,8 @@ sealed class ParcelTarget(val world: ParcelWorld, val parsedKind: Int, val isDef
abstract suspend fun getParcelSuspend(storage: Storage): Parcel?
- class ByID(world: ParcelWorld, val id: Vec2i?, parsedKind: Int, isDefault: Boolean) : ParcelTarget(world, parsedKind, isDefault) {
+ class ByID(world: ParcelWorld, val id: Vec2i?, parsedKind: Int, isDefault: Boolean) :
+ ParcelTarget(world, parsedKind, isDefault) {
override suspend fun getParcelSuspend(storage: Storage): Parcel? = getParcel()
fun getParcel() = id?.let { world.getParcelById(it) }
val isPath: Boolean get() = id == null
@@ -78,7 +79,8 @@ sealed class ParcelTarget(val world: ParcelWorld, val parsedKind: Int, val isDef
const val DEFAULT_KIND = REAL
- const val PREFER_OWNED_FOR_DEFAULT = 8 // if the kind can be ID and OWNER_REAL, prefer OWNER_REAL for default
+ const val PREFER_OWNED_FOR_DEFAULT =
+ 8 // if the kind can be ID and OWNER_REAL, prefer OWNER_REAL for default
// instead of parcel that the player is in
override fun toParameterInfo(annotation: TargetKind): Int {
@@ -90,7 +92,11 @@ sealed class ParcelTarget(val world: ParcelWorld, val parsedKind: Int, val isDef
class PType(val parcelProvider: ParcelProvider, val parcelAddress: SpecialCommandAddress? = null) :
ParameterType<ParcelTarget, Int>(ParcelTarget::class.java, TargetKind) {
- override fun parse(parameter: Parameter<ParcelTarget, Int>, sender: CommandSender, buffer: ArgumentBuffer): ParcelTarget {
+ override fun parse(
+ parameter: Parameter<ParcelTarget, Int>,
+ sender: CommandSender,
+ buffer: ArgumentBuffer
+ ): ParcelTarget {
var input = buffer.next()!!
val worldString = input.substringBefore("/", missingDelimiterValue = "")
input = input.substringAfter("/")
@@ -100,18 +106,26 @@ sealed class ParcelTarget(val world: ParcelWorld, val parsedKind: Int, val isDef
parcelProvider.getWorld(player.world)
?: invalidInput(parameter, "You cannot omit the world if you're not in a parcel world")
} else {
- parcelProvider.getWorld(worldString) ?: invalidInput(parameter, "$worldString is not a parcel world")
+ parcelProvider.getWorld(worldString)
+ ?: invalidInput(parameter, "$worldString is not a parcel world")
}
val kind = parameter.paramInfo ?: DEFAULT_KIND
if (input.contains(',')) {
- if (kind and ID == 0) invalidInput(parameter, "You must specify a parcel by OWNER, that is, an owner and index")
+ if (kind and ID == 0) invalidInput(parameter,
+ "You must specify a parcel by OWNER, that is, an owner and index")
return ByID(world, getId(parameter, input), kind, false)
}
- if (kind and OWNER == 0) invalidInput(parameter, "You must specify a parcel by ID, that is, the x and z component separated by a comma")
+ if (kind and OWNER == 0) invalidInput(parameter,
+ "You must specify a parcel by ID, that is, the x and z component separated by a comma")
val (owner, index) = getHomeIndex(parameter, kind, sender, input)
- return ByOwner(world, owner, index, kind, false, onResolveFailure = { invalidInput(parameter, "The player $input does not exist") })
+ return ByOwner(world,
+ owner,
+ index,
+ kind,
+ false,
+ onResolveFailure = { invalidInput(parameter, "The player $input does not exist") })
}
private fun getId(parameter: Parameter<*, *>, input: String): Vec2i {
@@ -124,7 +138,12 @@ sealed class ParcelTarget(val world: ParcelWorld, val parsedKind: Int, val isDef
return Vec2i(x, z)
}
- private fun getHomeIndex(parameter: Parameter<*, *>, kind: Int, sender: CommandSender, input: String): Pair<PlayerProfile, Int> {
+ private fun getHomeIndex(
+ parameter: Parameter<*, *>,
+ kind: Int,
+ sender: CommandSender,
+ input: String
+ ): Pair<PlayerProfile, Int> {
val splitIdx = input.indexOf(':')
val ownerString: String
val index: Int?
@@ -155,10 +174,11 @@ sealed class ParcelTarget(val world: ParcelWorld, val parsedKind: Int, val isDef
?: invalidInput(parameter, "The home index must be an integer, $indexString is not an integer")
}
- val owner = if (ownerString.isEmpty())
+ val owner = (if (ownerString.isEmpty())
PlayerProfile(requirePlayer(sender, parameter, "the player"))
else
- PlayerProfile.byName(ownerString, allowReal = kind and OWNER_REAL != 0, allowFake = kind and OWNER_FAKE != 0)
+ PlayerProfile.byName(ownerString, allowReal = kind and OWNER_REAL != 0, allowFake = kind and OWNER_FAKE != 0))
+ ?: invalidInput(parameter, "\'$ownerString\' is not a valid player name")
return owner to (index ?: 0)
}
@@ -168,7 +188,11 @@ sealed class ParcelTarget(val world: ParcelWorld, val parsedKind: Int, val isDef
return sender
}
- override fun getDefaultValue(parameter: Parameter<ParcelTarget, Int>, sender: CommandSender, buffer: ArgumentBuffer): ParcelTarget? {
+ override fun getDefaultValue(
+ parameter: Parameter<ParcelTarget, Int>,
+ sender: CommandSender,
+ buffer: ArgumentBuffer
+ ): ParcelTarget? {
val kind = parameter.paramInfo ?: DEFAULT_KIND
val useLocation = when {
kind and REAL == REAL -> kind and PREFER_OWNED_FOR_DEFAULT == 0
@@ -178,7 +202,8 @@ sealed class ParcelTarget(val world: ParcelWorld, val parsedKind: Int, val isDef
}
val player = requirePlayer(sender, parameter, "the parcel")
- val world = parcelProvider.getWorld(player.world) ?: invalidInput(parameter, "You must be in a parcel world to omit the parcel")
+ val world = parcelProvider.getWorld(player.world) ?: invalidInput(parameter,
+ "You must be in a parcel world to omit the parcel")
if (useLocation) {
val id = player.location.let { world.getParcelIdAt(it.x.floor(), it.z.floor())?.pos }
return ByID(world, id, kind, true)
diff --git a/src/main/kotlin/io/dico/parcels2/command/ParcelsChatHandler.kt b/src/main/kotlin/io/dico/parcels2/command/ParcelsChatHandler.kt
index b616f77..52f1104 100644
--- a/src/main/kotlin/io/dico/parcels2/command/ParcelsChatHandler.kt
+++ b/src/main/kotlin/io/dico/parcels2/command/ParcelsChatHandler.kt
@@ -1,24 +1,24 @@
-package io.dico.parcels2.command
-
-import io.dico.dicore.Formatting
-import io.dico.dicore.command.EMessageType
-import io.dico.dicore.command.ExecutionContext
-import io.dico.dicore.command.chat.AbstractChatHandler
-import io.dico.parcels2.util.ext.plus
-
-class ParcelsChatHandler : AbstractChatHandler() {
-
- override fun getMessagePrefixForType(type: EMessageType?): String {
- return Formatting.RED + "[Parcels] "
- }
-
- override fun createMessage(context: ExecutionContext, type: EMessageType, message: String?): String? {
- if (message.isNullOrEmpty()) return null
- var result = getChatFormatForType(type) + message
- if (context.address.mainKey != "info") {
- result = getMessagePrefixForType(type) + result
- }
- return result
- }
-
+package io.dico.parcels2.command
+
+import io.dico.dicore.Formatting
+import io.dico.dicore.command.EMessageType
+import io.dico.dicore.command.ExecutionContext
+import io.dico.dicore.command.chat.AbstractChatHandler
+import io.dico.parcels2.util.ext.plus
+
+class ParcelsChatHandler : AbstractChatHandler() {
+
+ override fun getMessagePrefixForType(type: EMessageType?): String {
+ return Formatting.RED + "[Parcels] "
+ }
+
+ override fun createMessage(context: ExecutionContext, type: EMessageType, message: String?): String? {
+ if (message.isNullOrEmpty()) return null
+ var result = getChatFormatForType(type) + message
+ if (context.address.mainKey != "info") {
+ result = getMessagePrefixForType(type) + result
+ }
+ return result
+ }
+
} \ No newline at end of file