Archived
0

Work on some commands

This commit is contained in:
Dico200
2018-07-27 18:29:00 +01:00
parent cb3fb4771a
commit a9c19ff5cf
7 changed files with 181 additions and 33 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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