diff options
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/Privilege.kt')
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/Privilege.kt | 122 |
1 files changed, 35 insertions, 87 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/Privilege.kt b/src/main/kotlin/io/dico/parcels2/Privilege.kt index 72878a9..bc16f77 100644 --- a/src/main/kotlin/io/dico/parcels2/Privilege.kt +++ b/src/main/kotlin/io/dico/parcels2/Privilege.kt @@ -1,12 +1,17 @@ package io.dico.parcels2 -import io.dico.parcels2.Privilege.* -import io.dico.parcels2.PrivilegeChangeResult.* -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 org.bukkit.OfflinePlayer -import org.bukkit.entity.Player +import io.dico.parcels2.Privilege.DEFAULT +import java.util.Collections + +typealias PrivilegeKey = PlayerProfile.Real +typealias PrivilegeMap = Map<PrivilegeKey, Privilege> +typealias MutablePrivilegeMap = MutableMap<PrivilegeKey, Privilege> + +@Suppress("FunctionName") +fun MutablePrivilegeMap(): MutablePrivilegeMap = hashMapOf() + +@Suppress("UNCHECKED_CAST") +val EmptyPrivilegeMap = Collections.emptyMap<Any, Any>() as MutablePrivilegeMap enum class Privilege( val number: Int, @@ -21,7 +26,7 @@ enum class Privilege( ADMIN(-1, transient = true); fun isDistanceGrEq(other: Privilege): Boolean = - when { // used for example when disallowBuild is called and CAN_MANAGE is the privilege. + when { other > DEFAULT -> this >= other other == DEFAULT -> this == other else -> this <= other @@ -38,12 +43,6 @@ enum class Privilege( return this } - /* - fun canEnter() = this >= BANNED - fun canBuild() = this >= CAN_BUILD - fun canManage() = this >= CAN_MANAGE - */ - companion object { fun getByNumber(id: Int) = when (id) { @@ -56,95 +55,44 @@ enum class Privilege( } } -typealias PrivilegeKey = PlayerProfile.Real -typealias MutablePrivilegeMap = MutableMap<PrivilegeKey, Privilege> -typealias PrivilegeMap = Map<PrivilegeKey, Privilege> - -@Suppress("FunctionName") -fun MutablePrivilegeMap(): MutablePrivilegeMap = hashMapOf() - -interface PrivilegesMinimal { +interface RawPrivileges { val privilegeMap: PrivilegeMap + var privilegeOfStar: Privilege - fun getStoredPrivilege(key: PrivilegeKey): Privilege - fun setStoredPrivilege(key: PrivilegeKey, privilege: Privilege): Boolean -} - -interface Privileges : PrivilegesMinimal { - val keyOfOwner: PlayerProfile.Real? - - fun privilege(player: OfflinePlayer): Privilege { - val key = player.privilegeKey - return if (key == keyOfOwner) OWNER - else getStoredPrivilege(key) - } - - fun privilege(player: OfflinePlayer, adminPerm: String): Privilege = - if (player is Player && player.hasPermission(adminPerm)) ADMIN - else { - val key = player.privilegeKey - if (key == keyOfOwner) OWNER - else getStoredPrivilege(key) - } - - fun changePrivilege(key: PrivilegeKey, positive: Boolean, update: Privilege): PrivilegeChangeResult = - if (key == keyOfOwner) FAIL_OWNER - else if (getStoredPrivilege(key).isChangeInDirection(positive, update) - && setStoredPrivilege(key, update) - ) SUCCESS - else FAIL - - fun canManage(player: OfflinePlayer) = privilege(player, PERM_ADMIN_MANAGE) >= CAN_MANAGE - fun allowManage(player: OfflinePlayer) = changePrivilege(player.privilegeKey, true, CAN_MANAGE) - fun disallowManage(player: OfflinePlayer) = changePrivilege(player.privilegeKey, false, CAN_BUILD) - - fun canBuild(player: OfflinePlayer) = privilege(player, PERM_BUILD_ANYWHERE) >= CAN_BUILD - fun allowBuild(player: OfflinePlayer) = changePrivilege(player.privilegeKey, true, CAN_BUILD) - fun disallowBuild(player: OfflinePlayer) = changePrivilege(player.privilegeKey, false, DEFAULT) - - fun canEnter(player: OfflinePlayer) = privilege(player, PERM_BAN_BYPASS) >= DEFAULT - fun ban(player: OfflinePlayer) = changePrivilege(player.privilegeKey, false, BANNED) - fun unban(player: OfflinePlayer) = changePrivilege(player.privilegeKey, true, DEFAULT) - - /** - * same as [canBuild] but doesn't perform a permission check for admin perms - */ - fun canBuildFast(player: OfflinePlayer) = player.privilegeKey.let { if (it == keyOfOwner) OWNER else getStoredPrivilege(it)} >= CAN_BUILD + fun getRawStoredPrivilege(key: PrivilegeKey): Privilege + fun setRawStoredPrivilege(key: PrivilegeKey, privilege: Privilege): Boolean } -enum class PrivilegeChangeResult { - SUCCESS, FAIL, FAIL_OWNER -} +open class PrivilegesHolder(override var privilegeMap: MutablePrivilegeMap = EmptyPrivilegeMap) : RawPrivileges { + private var _privilegeOfStar: Privilege = DEFAULT -val OfflinePlayer.privilegeKey: PrivilegeKey - inline get() = PlayerProfile.nameless(this) + override var privilegeOfStar: Privilege + get() = _privilegeOfStar + set(value) = run { _privilegeOfStar = value } -open class PrivilegesHolder(override var privilegeMap: MutablePrivilegeMap = MutablePrivilegeMap()) : PrivilegesMinimal { - private var privilegeOfStar: Privilege = DEFAULT + protected val isEmpty + inline get() = privilegeMap === EmptyPrivilegeMap - override fun getStoredPrivilege(key: PrivilegeKey) = - if (key.isStar) privilegeOfStar - else privilegeMap.getOrDefault(key, privilegeOfStar) + override fun getRawStoredPrivilege(key: PrivilegeKey) = + if (key.isStar) _privilegeOfStar + else privilegeMap.getOrDefault(key, _privilegeOfStar) - override fun setStoredPrivilege(key: PrivilegeKey, privilege: Privilege): Boolean { + override fun setRawStoredPrivilege(key: PrivilegeKey, privilege: Privilege): Boolean { privilege.requireNonTransient() if (key.isStar) { - if (privilegeOfStar == privilege) return false - privilegeOfStar = privilege + if (_privilegeOfStar == privilege) return false + _privilegeOfStar = privilege return true } + if (isEmpty) { + if (privilege == DEFAULT) return false + privilegeMap = MutablePrivilegeMap() + } + return if (privilege == DEFAULT) privilegeMap.remove(key) != null else privilegeMap.put(key, privilege) != privilege } } -interface GlobalPrivileges : Privileges { - override val keyOfOwner: PlayerProfile.Real -} - -interface GlobalPrivilegesManager { - operator fun get(owner: PlayerProfile.Real): GlobalPrivileges - operator fun get(owner: OfflinePlayer): GlobalPrivileges = get(owner.privilegeKey) -} |