summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/Privileges.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/Privileges.kt')
-rw-r--r--src/main/kotlin/io/dico/parcels2/Privileges.kt32
1 files changed, 13 insertions, 19 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/Privileges.kt b/src/main/kotlin/io/dico/parcels2/Privileges.kt
index 11a1f84..1aad3f6 100644
--- a/src/main/kotlin/io/dico/parcels2/Privileges.kt
+++ b/src/main/kotlin/io/dico/parcels2/Privileges.kt
@@ -15,6 +15,13 @@ enum class Privilege(
OWNER(-1, transient = true),
ADMIN(-1, transient = true);
+ fun isDistanceGrEq(other: Privilege): Boolean =
+ when { // used for example when disallowBuild is called and CAN_MANAGE is the privilege.
+ other > DEFAULT -> this >= other
+ other == DEFAULT -> this == other
+ else -> this <= other
+ }
+
fun requireNonTransient(): Privilege {
if (transient) {
throw IllegalArgumentException("Transient privilege $this is invalid")
@@ -29,13 +36,7 @@ enum class Privilege(
*/
companion object {
- fun getByNumber(number: Int) = safeGetByNumber(number)
- ?: throw IllegalArgumentException(
- if (number == -1) "Transient privileges are not stored"
- else "Privilege with number $number doesn't exist"
- )
-
- fun safeGetByNumber(id: Int) =
+ fun getByNumber(id: Int) =
when (id) {
1 -> BANNED
2 -> DEFAULT
@@ -62,18 +63,10 @@ interface Privileges {
fun privilege(key: PrivilegeKey): Privilege
fun privilege(player: OfflinePlayer) = privilege(player.privilegeKey)
-
fun setPrivilege(key: PrivilegeKey, privilege: Privilege): Boolean
fun setPrivilege(player: OfflinePlayer, privilege: Privilege) = setPrivilege(player.privilegeKey, privilege)
-
fun changePrivilege(key: PrivilegeKey, expect: Privilege, update: Privilege): Boolean =
- (when { // if CAN_BUILD is expected, CAN_MANAGE is valid.
- expect > DEFAULT -> privilege(key) >= expect
- expect == DEFAULT -> privilege(key) == expect
- else -> privilege(key) <= expect
- })
- && setPrivilege(key, update)
-
+ privilege(key).isDistanceGrEq(expect) && setPrivilege(key, update)
fun hasPrivilegeToManage(key: PrivilegeKey) = privilege(key) >= CAN_MANAGE
fun allowManage(key: PrivilegeKey) = setPrivilege(key, CAN_MANAGE)
@@ -88,8 +81,8 @@ interface Privileges {
fun unban(key: PrivilegeKey) = changePrivilege(key, BANNED, DEFAULT)
/* OfflinePlayer overloads */
- fun hasPrivilegeToManage(player: OfflinePlayer) = hasPrivilegeToManage(player.privilegeKey)
+ fun hasPrivilegeToManage(player: OfflinePlayer) = hasPrivilegeToManage(player.privilegeKey)
fun allowManage(player: OfflinePlayer) = allowManage(player.privilegeKey)
fun disallowManage(player: OfflinePlayer) = disallowManage(player.privilegeKey)
@@ -102,8 +95,8 @@ interface Privileges {
fun unban(player: OfflinePlayer) = unban(player.privilegeKey)
}
-inline val OfflinePlayer.privilegeKey: PrivilegeKey
- get() = PlayerProfile.nameless(this)
+val OfflinePlayer.privilegeKey: PrivilegeKey
+ inline get() = PlayerProfile.nameless(this)
open class PrivilegesHolder(override var map: MutablePrivilegeMap = MutablePrivilegeMap()) : Privileges {
override var privilegeOfStar: Privilege = DEFAULT
@@ -131,4 +124,5 @@ interface GlobalPrivileges : Privileges {
interface GlobalPrivilegesManager {
operator fun get(owner: PlayerProfile): GlobalPrivileges
+ operator fun get(owner: OfflinePlayer): GlobalPrivileges = get(owner.privilegeKey)
}