diff options
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/command/ParcelCommandReceivers.kt')
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/command/ParcelCommandReceivers.kt | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/command/ParcelCommandReceivers.kt b/src/main/kotlin/io/dico/parcels2/command/ParcelCommandReceivers.kt index 488148d..443adfb 100644 --- a/src/main/kotlin/io/dico/parcels2/command/ParcelCommandReceivers.kt +++ b/src/main/kotlin/io/dico/parcels2/command/ParcelCommandReceivers.kt @@ -7,7 +7,9 @@ import io.dico.dicore.command.Validate import io.dico.parcels2.Parcel import io.dico.parcels2.ParcelProvider import io.dico.parcels2.ParcelWorld -import io.dico.parcels2.util.ext.hasAdminManage +import io.dico.parcels2.Privilege +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 @@ -18,44 +20,55 @@ import kotlin.reflect.jvm.kotlinFunction @Target(AnnotationTarget.FUNCTION) @Retention(AnnotationRetention.RUNTIME) -annotation class ParcelRequire(val admin: Boolean = false, val owner: Boolean = false) +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(player.hasAdminManage || parcel.isOwner(player.uuid), - "You must own this parcel to $action") + fun checkCanManage(player: Player, action: String) = Validate.isTrue( + player.hasPermAdminManage || parcel.hasPrivilegeToManage(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<ParcelRequire>() - val admin = require?.admin == true - val owner = require?.owner == true + val require = function.findAnnotation<RequireParcelPrivilege>() return when (receiverType.jvmErasure) { - ParcelScope::class -> ParcelScope(parcelProvider.getParcelRequired(player, admin, owner)) - WorldScope::class -> WorldScope(parcelProvider.getWorldRequired(player, admin)) + 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.hasAdminManage, "You must have admin rights to use that command") + 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, admin: Boolean = false, own: Boolean = false): Parcel { - val parcel = getWorldRequired(player, admin = admin).getParcelAt(player) +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 (own) Validate.isTrue(parcel.isOwner(player.uuid) || player.hasAdminManage, - "You must own this 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.hasPrivilegeToManage(player), "You must have management privileges on this parcel to use that command") + } + } + return parcel } |