Work on some commands
This commit is contained in:
@@ -15,9 +15,7 @@ import org.slf4j.LoggerFactory
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
val logger = LoggerFactory.getLogger("ParcelsPlugin")
|
val logger = LoggerFactory.getLogger("ParcelsPlugin")
|
||||||
|
|
||||||
private inline val plogger get() = logger
|
private inline val plogger get() = logger
|
||||||
const val debugging = true
|
|
||||||
|
|
||||||
class ParcelsPlugin : JavaPlugin() {
|
class ParcelsPlugin : JavaPlugin() {
|
||||||
lateinit var optionsFile: File; private set
|
lateinit var optionsFile: File; private set
|
||||||
@@ -31,6 +29,7 @@ class ParcelsPlugin : JavaPlugin() {
|
|||||||
private var cmdDispatcher: ICommandDispatcher? = null
|
private var cmdDispatcher: ICommandDispatcher? = null
|
||||||
|
|
||||||
override fun onEnable() {
|
override fun onEnable() {
|
||||||
|
plogger.info("Debug enabled: ${plogger.isDebugEnabled}")
|
||||||
if (!init()) {
|
if (!init()) {
|
||||||
Bukkit.getPluginManager().disablePlugin(this)
|
Bukkit.getPluginManager().disablePlugin(this)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package io.dico.parcels2.command
|
||||||
|
|
||||||
|
import io.dico.dicore.command.CommandException
|
||||||
|
import io.dico.dicore.command.ExecutionContext
|
||||||
|
import io.dico.dicore.command.ICommandReceiver
|
||||||
|
import io.dico.parcels2.ParcelOwner
|
||||||
|
import io.dico.parcels2.ParcelsPlugin
|
||||||
|
import io.dico.parcels2.util.hasAdminManage
|
||||||
|
import io.dico.parcels2.util.parcelLimit
|
||||||
|
import io.dico.parcels2.util.uuid
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
import org.bukkit.plugin.Plugin
|
||||||
|
import java.lang.reflect.Method
|
||||||
|
|
||||||
|
abstract class AbstractParcelCommands(val plugin: ParcelsPlugin): ICommandReceiver.Factory {
|
||||||
|
|
||||||
|
override fun getPlugin(): Plugin = plugin
|
||||||
|
override fun getReceiver(context: ExecutionContext, target: Method, cmdName: String): ICommandReceiver {
|
||||||
|
return getParcelCommandReceiver(plugin.worlds, context, target, cmdName)
|
||||||
|
}
|
||||||
|
|
||||||
|
protected inline val worlds get() = plugin.worlds
|
||||||
|
|
||||||
|
protected fun error(message: String): Nothing {
|
||||||
|
throw CommandException(message)
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun checkConnected(action: String) {
|
||||||
|
if (!plugin.storage.isConnected) error("Parcels cannot $action right now because of a database error")
|
||||||
|
}
|
||||||
|
|
||||||
|
protected suspend fun checkParcelLimit(player: Player) {
|
||||||
|
if (player.hasAdminManage) return
|
||||||
|
val numOwnedParcels = plugin.storage.getNumParcels(ParcelOwner(uuid = player.uuid)).await()
|
||||||
|
|
||||||
|
val limit = player.parcelLimit
|
||||||
|
if (numOwnedParcels >= limit) {
|
||||||
|
error("You have enough plots for now")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,17 +1,18 @@
|
|||||||
package io.dico.parcels2.command
|
package io.dico.parcels2.command
|
||||||
|
|
||||||
import io.dico.dicore.command.*
|
import io.dico.dicore.command.CommandException
|
||||||
|
import io.dico.dicore.command.ExecutionContext
|
||||||
|
import io.dico.dicore.command.ICommandReceiver
|
||||||
|
import io.dico.dicore.command.Validate
|
||||||
import io.dico.parcels2.Parcel
|
import io.dico.parcels2.Parcel
|
||||||
import io.dico.parcels2.ParcelWorld
|
import io.dico.parcels2.ParcelWorld
|
||||||
import io.dico.parcels2.Worlds
|
import io.dico.parcels2.Worlds
|
||||||
import io.dico.parcels2.logger
|
|
||||||
import io.dico.parcels2.util.hasAdminManage
|
import io.dico.parcels2.util.hasAdminManage
|
||||||
import io.dico.parcels2.util.uuid
|
import io.dico.parcels2.util.uuid
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
import java.lang.reflect.Method
|
import java.lang.reflect.Method
|
||||||
import kotlin.reflect.full.extensionReceiverParameter
|
import kotlin.reflect.full.extensionReceiverParameter
|
||||||
import kotlin.reflect.full.findAnnotation
|
import kotlin.reflect.full.findAnnotation
|
||||||
import kotlin.reflect.jvm.javaType
|
|
||||||
import kotlin.reflect.jvm.jvmErasure
|
import kotlin.reflect.jvm.jvmErasure
|
||||||
import kotlin.reflect.jvm.kotlinFunction
|
import kotlin.reflect.jvm.kotlinFunction
|
||||||
|
|
||||||
@@ -24,7 +25,10 @@ annotation class ParcelRequire(val admin: Boolean = false, val owner: Boolean =
|
|||||||
annotation class SuspensionTimeout(val millis: Int)
|
annotation class SuspensionTimeout(val millis: Int)
|
||||||
|
|
||||||
open class WorldScope(val world: ParcelWorld) : ICommandReceiver
|
open class WorldScope(val world: ParcelWorld) : ICommandReceiver
|
||||||
open class ParcelScope(val parcel: Parcel) : WorldScope(parcel.world)
|
open class ParcelScope(val parcel: Parcel) : WorldScope(parcel.world) {
|
||||||
|
fun checkCanManage(player: Player, action: String) = Validate.isTrue(player.hasAdminManage || parcel.isOwner(player.uuid),
|
||||||
|
"You must own this parcel to $action")
|
||||||
|
}
|
||||||
|
|
||||||
fun getParcelCommandReceiver(worlds: Worlds, context: ExecutionContext, method: Method, cmdName: String): ICommandReceiver {
|
fun getParcelCommandReceiver(worlds: Worlds, context: ExecutionContext, method: Method, cmdName: String): ICommandReceiver {
|
||||||
val player = context.sender as Player
|
val player = context.sender as Player
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package io.dico.parcels2.command
|
||||||
|
|
||||||
|
import io.dico.dicore.command.annotation.Cmd
|
||||||
|
import io.dico.dicore.command.annotation.Desc
|
||||||
|
import io.dico.parcels2.ParcelsPlugin
|
||||||
|
import org.bukkit.OfflinePlayer
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
|
||||||
|
class ParcelAddCommands(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
|
||||||
|
|
||||||
|
@Cmd("allow", aliases = ["add", "permit"])
|
||||||
|
@Desc("Allows a player to build on this parcel",
|
||||||
|
shortVersion = "allows a player to build on this parcel")
|
||||||
|
@ParcelRequire(owner = true)
|
||||||
|
fun ParcelScope.cmdAllow(sender: Player, player: OfflinePlayer): Any? {
|
||||||
|
TODO()
|
||||||
|
}
|
||||||
|
|
||||||
|
@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")
|
||||||
|
@ParcelRequire(owner = true)
|
||||||
|
fun ParcelScope.cmdDisallow(sender: Player, player: OfflinePlayer): Any? {
|
||||||
|
TODO()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Cmd("ban", aliases = ["deny"])
|
||||||
|
@Desc("Bans a player from this parcel,",
|
||||||
|
"making them unable to enter",
|
||||||
|
shortVersion = "bans a player from this parcel")
|
||||||
|
@ParcelRequire(owner = true)
|
||||||
|
fun ParcelScope.cmdBan(sender: Player, player: OfflinePlayer): Any? {
|
||||||
|
TODO()
|
||||||
|
}
|
||||||
|
|
||||||
|
@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")
|
||||||
|
@ParcelRequire(owner = true)
|
||||||
|
fun ParcelScope.cmdUnban(sender: Player, player: OfflinePlayer): Any? {
|
||||||
|
TODO()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@ package io.dico.parcels2.command
|
|||||||
import io.dico.dicore.command.CommandBuilder
|
import io.dico.dicore.command.CommandBuilder
|
||||||
import io.dico.dicore.command.ICommandDispatcher
|
import io.dico.dicore.command.ICommandDispatcher
|
||||||
import io.dico.parcels2.ParcelsPlugin
|
import io.dico.parcels2.ParcelsPlugin
|
||||||
import io.dico.parcels2.debugging
|
import io.dico.parcels2.logger
|
||||||
|
|
||||||
@Suppress("UsePropertyAccessSyntax")
|
@Suppress("UsePropertyAccessSyntax")
|
||||||
fun getParcelCommands(plugin: ParcelsPlugin): ICommandDispatcher {
|
fun getParcelCommands(plugin: ParcelsPlugin): ICommandDispatcher {
|
||||||
@@ -11,16 +11,25 @@ fun getParcelCommands(plugin: ParcelsPlugin): ICommandDispatcher {
|
|||||||
return CommandBuilder()
|
return CommandBuilder()
|
||||||
.addParameterType(false, ParcelParameterType(plugin.worlds))
|
.addParameterType(false, ParcelParameterType(plugin.worlds))
|
||||||
.addParameterType(true, ParcelHomeParameterType(plugin.worlds))
|
.addParameterType(true, ParcelHomeParameterType(plugin.worlds))
|
||||||
|
|
||||||
.group("parcel", "plot", "plots", "p")
|
.group("parcel", "plot", "plots", "p")
|
||||||
.registerCommands(ParcelCommands(plugin))
|
.registerCommands(ParcelCommands(plugin))
|
||||||
|
.registerCommands(ParcelAddCommands(plugin))
|
||||||
|
|
||||||
|
.group("option")
|
||||||
|
.apply { ParcelOptionCommands.setGroupDescription(this) }
|
||||||
|
.registerCommands(ParcelOptionCommands(plugin))
|
||||||
|
.parent()
|
||||||
|
|
||||||
.putDebugCommands(plugin)
|
.putDebugCommands(plugin)
|
||||||
|
|
||||||
.parent()
|
.parent()
|
||||||
.getDispatcher()
|
.getDispatcher()
|
||||||
//@formatter:on
|
//@formatter:on
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun CommandBuilder.putDebugCommands(plugin: ParcelsPlugin): CommandBuilder {
|
private fun CommandBuilder.putDebugCommands(plugin: ParcelsPlugin): CommandBuilder {
|
||||||
if (!debugging) return this
|
if (!logger.isDebugEnabled) return this
|
||||||
//@formatter:off
|
//@formatter:off
|
||||||
return group("debug", "d")
|
return group("debug", "d")
|
||||||
.registerCommands(DebugCommands(plugin))
|
.registerCommands(DebugCommands(plugin))
|
||||||
|
|||||||
@@ -1,47 +1,27 @@
|
|||||||
package io.dico.parcels2.command
|
package io.dico.parcels2.command
|
||||||
|
|
||||||
import io.dico.dicore.command.CommandException
|
|
||||||
import io.dico.dicore.command.ExecutionContext
|
|
||||||
import io.dico.dicore.command.ICommandReceiver
|
|
||||||
import io.dico.dicore.command.annotation.Cmd
|
import io.dico.dicore.command.annotation.Cmd
|
||||||
import io.dico.dicore.command.annotation.Desc
|
import io.dico.dicore.command.annotation.Desc
|
||||||
import io.dico.dicore.command.annotation.RequireParameters
|
import io.dico.dicore.command.annotation.RequireParameters
|
||||||
import io.dico.parcels2.ParcelOwner
|
import io.dico.parcels2.ParcelOwner
|
||||||
import io.dico.parcels2.ParcelsPlugin
|
import io.dico.parcels2.ParcelsPlugin
|
||||||
import io.dico.parcels2.command.NamedParcelDefaultValue.FIRST_OWNED
|
import io.dico.parcels2.command.NamedParcelDefaultValue.FIRST_OWNED
|
||||||
import io.dico.parcels2.logger
|
|
||||||
import io.dico.parcels2.storage.getParcelBySerializedValue
|
import io.dico.parcels2.storage.getParcelBySerializedValue
|
||||||
|
import io.dico.parcels2.util.hasAdminManage
|
||||||
import io.dico.parcels2.util.hasParcelHomeOthers
|
import io.dico.parcels2.util.hasParcelHomeOthers
|
||||||
import io.dico.parcels2.util.parcelLimit
|
|
||||||
import io.dico.parcels2.util.uuid
|
import io.dico.parcels2.util.uuid
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
import org.bukkit.plugin.Plugin
|
|
||||||
import java.lang.reflect.Method
|
|
||||||
|
|
||||||
//@Suppress("unused")
|
//@Suppress("unused")
|
||||||
class ParcelCommands(val plugin: ParcelsPlugin) : ICommandReceiver.Factory {
|
class ParcelCommands(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
|
||||||
private inline val worlds get() = plugin.worlds
|
|
||||||
|
|
||||||
override fun getPlugin(): Plugin = plugin
|
|
||||||
override fun getReceiver(context: ExecutionContext, target: Method, cmdName: String): ICommandReceiver {
|
|
||||||
return getParcelCommandReceiver(plugin.worlds, context, target, cmdName)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun error(message: String): Nothing {
|
|
||||||
throw CommandException(message)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Cmd("auto")
|
@Cmd("auto")
|
||||||
@Desc("Finds the unclaimed parcel nearest to origin,",
|
@Desc("Finds the unclaimed parcel nearest to origin,",
|
||||||
"and gives it to you",
|
"and gives it to you",
|
||||||
shortVersion = "sets you up with a fresh, unclaimed parcel")
|
shortVersion = "sets you up with a fresh, unclaimed parcel")
|
||||||
suspend fun WorldScope.cmdAuto(player: Player): Any? {
|
suspend fun WorldScope.cmdAuto(player: Player): Any? {
|
||||||
val numOwnedParcels = plugin.storage.getNumParcels(ParcelOwner(uuid = player.uuid)).await()
|
checkConnected("be claimed")
|
||||||
|
checkParcelLimit(player)
|
||||||
val limit = player.parcelLimit
|
|
||||||
if (numOwnedParcels >= limit) {
|
|
||||||
error("You have enough plots for now")
|
|
||||||
}
|
|
||||||
|
|
||||||
val parcel = world.nextEmptyParcel()
|
val parcel = world.nextEmptyParcel()
|
||||||
?: error("This world is full, please ask an admin to upsize it")
|
?: error("This world is full, please ask an admin to upsize it")
|
||||||
@@ -86,8 +66,16 @@ class ParcelCommands(val plugin: ParcelsPlugin) : ICommandReceiver.Factory {
|
|||||||
@Cmd("claim")
|
@Cmd("claim")
|
||||||
@Desc("If this parcel is unowned, makes you the owner",
|
@Desc("If this parcel is unowned, makes you the owner",
|
||||||
shortVersion = "claims this parcel")
|
shortVersion = "claims this parcel")
|
||||||
fun ParcelScope.cmdClaim(player: Player) {
|
suspend fun ParcelScope.cmdClaim(player: Player): Any? {
|
||||||
|
checkConnected("be claimed")
|
||||||
|
parcel.owner.takeIf { !player.hasAdminManage }?.let {
|
||||||
|
error(if (it.matches(player)) "You already own this parcel" else "This parcel is not available")
|
||||||
|
}
|
||||||
|
|
||||||
|
checkParcelLimit(player)
|
||||||
|
parcel.owner = ParcelOwner(uuid = player.uuid, name = player.name)
|
||||||
|
return "Enjoy your new parcel!"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
package io.dico.parcels2.command
|
||||||
|
|
||||||
|
import io.dico.dicore.command.CommandBuilder
|
||||||
|
import io.dico.dicore.command.Validate
|
||||||
|
import io.dico.dicore.command.annotation.Cmd
|
||||||
|
import io.dico.dicore.command.annotation.Desc
|
||||||
|
import io.dico.dicore.command.annotation.RequireParameters
|
||||||
|
import io.dico.parcels2.Parcel
|
||||||
|
import io.dico.parcels2.ParcelsPlugin
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
import kotlin.reflect.KMutableProperty
|
||||||
|
|
||||||
|
class ParcelOptionCommands(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
|
||||||
|
@Cmd("inputs")
|
||||||
|
@Desc("Sets whether players who are not allowed to",
|
||||||
|
"build here can use levers, buttons,",
|
||||||
|
"pressure plates, tripwire or redstone ore",
|
||||||
|
shortVersion = "allows using inputs")
|
||||||
|
@RequireParameters(0)
|
||||||
|
fun ParcelScope.cmdInputs(player: Player, enabled: Boolean?): Any? {
|
||||||
|
return runOptionCommand(player, Parcel::allowInteractInputs, enabled, "using levers, buttons, etc.")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Cmd("inventory")
|
||||||
|
@Desc("Sets whether players who are not allowed to",
|
||||||
|
"build here can interact with inventories",
|
||||||
|
shortVersion = "allows editing inventories")
|
||||||
|
fun ParcelScope.cmdInventory(player: Player, enabled: Boolean?): Any? {
|
||||||
|
return runOptionCommand(player, Parcel::allowInteractInventory, enabled, "interaction with inventories")
|
||||||
|
}
|
||||||
|
|
||||||
|
private inline val Boolean.enabledWord get() = if (this) "enabled" else "disabled"
|
||||||
|
private fun ParcelScope.runOptionCommand(player: Player,
|
||||||
|
property: KMutableProperty<Boolean>,
|
||||||
|
enabled: Boolean?,
|
||||||
|
desc: String): Any? {
|
||||||
|
checkConnected("have their options changed")
|
||||||
|
val current = property.getter.call(parcel)
|
||||||
|
if (enabled == null) {
|
||||||
|
val word = if (current) "" else "not "
|
||||||
|
return "This parcel does ${word}allow $desc"
|
||||||
|
}
|
||||||
|
|
||||||
|
checkCanManage(player, "change its options")
|
||||||
|
Validate.isTrue(current != enabled, "That option was already ${enabled.enabledWord}")
|
||||||
|
property.setter.call(parcel, enabled)
|
||||||
|
return "That option is now ${enabled.enabledWord}"
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val descShort = "changes interaction options for this parcel"
|
||||||
|
private val desc = arrayOf("Sets whether players who are not allowed to", "build here can interact with certain things.")
|
||||||
|
|
||||||
|
fun setGroupDescription(builder: CommandBuilder) {
|
||||||
|
builder.setGroupDescription(descShort, *desc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user