From 0f196f59c6a4cb76ab8409da62ff1f35505f94a8 Mon Sep 17 00:00:00 2001 From: Dico Karssiens Date: Sun, 11 Nov 2018 14:06:45 +0000 Subject: Changes I made before breaking my local repository. Hoping this works. --- src/main/kotlin/io/dico/parcels2/Privilege.kt | 250 +++++++++++++------------- 1 file changed, 125 insertions(+), 125 deletions(-) (limited to 'src/main/kotlin/io/dico/parcels2/Privilege.kt') diff --git a/src/main/kotlin/io/dico/parcels2/Privilege.kt b/src/main/kotlin/io/dico/parcels2/Privilege.kt index 135d7c1..892ed4c 100644 --- a/src/main/kotlin/io/dico/parcels2/Privilege.kt +++ b/src/main/kotlin/io/dico/parcels2/Privilege.kt @@ -1,125 +1,125 @@ -package io.dico.parcels2 - -import io.dico.parcels2.Privilege.DEFAULT -import java.util.Collections - -typealias PrivilegeKey = PlayerProfile.Real -typealias PrivilegeMap = Map -typealias MutablePrivilegeMap = MutableMap - -@Suppress("FunctionName") -fun MutablePrivilegeMap(): MutablePrivilegeMap = hashMapOf() - -@Suppress("UNCHECKED_CAST") -val EmptyPrivilegeMap = Collections.emptyMap() as MutablePrivilegeMap - -enum class Privilege( - val number: Int, - val transient: Boolean = false -) { - BANNED(1), - DEFAULT(2), - CAN_BUILD(3), - CAN_MANAGE(4), - - OWNER(-1, transient = true), - ADMIN(-1, transient = true); - - fun implies(other: Privilege): Boolean = - when { - other > DEFAULT -> this >= other - other == DEFAULT -> this == other - else -> this <= other - } - - fun isChangeInDirection(positiveDirection: Boolean, update: Privilege): Boolean = - if (positiveDirection) update > this - else update < this - - fun requireNonTransient(): Privilege { - if (transient) { - throw IllegalArgumentException("Transient privilege $this is invalid") - } - return this - } - - companion object { - fun getByNumber(id: Int) = - when (id) { - 1 -> BANNED - 2 -> DEFAULT - 3 -> CAN_BUILD - 4 -> CAN_MANAGE - else -> null - } - } -} - -interface RawPrivileges { - val privilegeMap: PrivilegeMap - var privilegeOfStar: Privilege - - fun getRawStoredPrivilege(key: PrivilegeKey): Privilege - fun setRawStoredPrivilege(key: PrivilegeKey, privilege: Privilege): Boolean - fun hasAnyDeclaredPrivileges(): Boolean -} - -open class PrivilegesHolder(override var privilegeMap: MutablePrivilegeMap = EmptyPrivilegeMap) : RawPrivileges { - private var _privilegeOfStar: Privilege = DEFAULT - - override /*open*/ var privilegeOfStar: Privilege - get() = _privilegeOfStar - set(value) = run { _privilegeOfStar = value } - - protected val isEmpty - inline get() = privilegeMap === EmptyPrivilegeMap - - override fun getRawStoredPrivilege(key: PrivilegeKey) = - if (key.isStar) _privilegeOfStar - else privilegeMap.getOrDefault(key, _privilegeOfStar) - - override fun setRawStoredPrivilege(key: PrivilegeKey, privilege: Privilege): Boolean { - privilege.requireNonTransient() - - if (key.isStar) { - 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 - } - - override fun hasAnyDeclaredPrivileges(): Boolean { - return privilegeMap.isNotEmpty() || privilegeOfStar != DEFAULT - } - - fun copyPrivilegesFrom(other: PrivilegesHolder) { - privilegeMap = other.privilegeMap - privilegeOfStar = other.privilegeOfStar - } - -} - -private fun MutableMap.put(key: K, value: V, override: Boolean) { - if (override) this[key] = value - else putIfAbsent(key, value) -} - -fun RawPrivileges.filterProfilesWithPrivilegeTo(map: MutableMap, privilege: Privilege) { - if (privilegeOfStar.implies(privilege)) { - map.putIfAbsent(PlayerProfile.Star, privilegeOfStar) - } - - for ((profile, declaredPrivilege) in privilegeMap) { - if (declaredPrivilege.implies(privilege)) { - map.putIfAbsent(profile, declaredPrivilege) - } - } -} +package io.dico.parcels2 + +import io.dico.parcels2.Privilege.DEFAULT +import java.util.Collections + +typealias PrivilegeKey = PlayerProfile.Real +typealias PrivilegeMap = Map +typealias MutablePrivilegeMap = MutableMap + +@Suppress("FunctionName") +fun MutablePrivilegeMap(): MutablePrivilegeMap = hashMapOf() + +@Suppress("UNCHECKED_CAST") +val EmptyPrivilegeMap = Collections.emptyMap() as MutablePrivilegeMap + +enum class Privilege( + val number: Int, + val transient: Boolean = false +) { + BANNED(1), + DEFAULT(2), + CAN_BUILD(3), + CAN_MANAGE(4), + + OWNER(-1, transient = true), + ADMIN(-1, transient = true); + + fun implies(other: Privilege): Boolean = + when { + other > DEFAULT -> this >= other + other == DEFAULT -> this == other + else -> this <= other + } + + fun isChangeInDirection(positiveDirection: Boolean, update: Privilege): Boolean = + if (positiveDirection) update > this + else update < this + + fun requireNonTransient(): Privilege { + if (transient) { + throw IllegalArgumentException("Transient privilege $this is invalid") + } + return this + } + + companion object { + fun getByNumber(id: Int) = + when (id) { + 1 -> BANNED + 2 -> DEFAULT + 3 -> CAN_BUILD + 4 -> CAN_MANAGE + else -> null + } + } +} + +interface RawPrivileges { + val privilegeMap: PrivilegeMap + var privilegeOfStar: Privilege + + fun getRawStoredPrivilege(key: PrivilegeKey): Privilege + fun setRawStoredPrivilege(key: PrivilegeKey, privilege: Privilege): Boolean + fun hasAnyDeclaredPrivileges(): Boolean +} + +open class PrivilegesHolder(override var privilegeMap: MutablePrivilegeMap = EmptyPrivilegeMap) : RawPrivileges { + private var _privilegeOfStar: Privilege = DEFAULT + + override /*open*/ var privilegeOfStar: Privilege + get() = _privilegeOfStar + set(value) = run { _privilegeOfStar = value } + + protected val isEmpty + inline get() = privilegeMap === EmptyPrivilegeMap + + override fun getRawStoredPrivilege(key: PrivilegeKey) = + if (key.isStar) _privilegeOfStar + else privilegeMap.getOrDefault(key, _privilegeOfStar) + + override fun setRawStoredPrivilege(key: PrivilegeKey, privilege: Privilege): Boolean { + privilege.requireNonTransient() + + if (key.isStar) { + 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 + } + + override fun hasAnyDeclaredPrivileges(): Boolean { + return privilegeMap.isNotEmpty() || privilegeOfStar != DEFAULT + } + + fun copyPrivilegesFrom(other: PrivilegesHolder) { + privilegeMap = other.privilegeMap + privilegeOfStar = other.privilegeOfStar + } + +} + +private fun MutableMap.put(key: K, value: V, override: Boolean) { + if (override) this[key] = value + else putIfAbsent(key, value) +} + +fun RawPrivileges.filterProfilesWithPrivilegeTo(map: MutableMap, privilege: Privilege) { + if (privilegeOfStar.implies(privilege)) { + map.putIfAbsent(PlayerProfile.Star, privilegeOfStar) + } + + for ((profile, declaredPrivilege) in privilegeMap) { + if (declaredPrivilege.implies(privilege)) { + map.putIfAbsent(profile, declaredPrivilege) + } + } +} -- cgit v1.2.3