summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/Privilege.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/Privilege.kt')
-rw-r--r--src/main/kotlin/io/dico/parcels2/Privilege.kt122
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)
-}