diff options
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/defaultimpl/GlobalPrivilegesManagerImpl.kt')
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/defaultimpl/GlobalPrivilegesManagerImpl.kt | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/defaultimpl/GlobalPrivilegesManagerImpl.kt b/src/main/kotlin/io/dico/parcels2/defaultimpl/GlobalPrivilegesManagerImpl.kt new file mode 100644 index 0000000..239fe0a --- /dev/null +++ b/src/main/kotlin/io/dico/parcels2/defaultimpl/GlobalPrivilegesManagerImpl.kt @@ -0,0 +1,38 @@ +@file:Suppress("UNCHECKED_CAST") + +package io.dico.parcels2.defaultimpl + +import io.dico.parcels2.* +import io.dico.parcels2.util.ext.alsoIfTrue +import java.util.Collections + +class GlobalPrivilegesManagerImpl(val plugin: ParcelsPlugin) : GlobalPrivilegesManager { + private val map = mutableMapOf<PlayerProfile, GlobalPrivileges>() + + override fun get(owner: PlayerProfile): GlobalPrivileges { + return map[owner] ?: GlobalPrivilegesImpl(owner).also { map[owner] = it } + } + + private inner class GlobalPrivilegesImpl(override val owner: PlayerProfile, + data: MutablePrivilegeMap = emptyData) + : PrivilegesHolder(data), GlobalPrivileges { + + private inline var data get() = map; set(value) = run { map = value } + private inline val isEmpty get() = data === emptyData + + override fun setPrivilege(key: PrivilegeKey, privilege: Privilege): Boolean { + if (isEmpty) { + if (privilege == Privilege.DEFAULT) return false + data = mutableMapOf() + } + return super.set(key, privilege).alsoIfTrue { + plugin.storage.setGlobalPrivilege(owner, key, privilege) + } + } + } + + private companion object { + val emptyData = Collections.emptyMap<Any, Any>() as MutablePrivilegeMap + } + +}
\ No newline at end of file |