diff options
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/Privileges.kt')
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/Privileges.kt | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/Privileges.kt b/src/main/kotlin/io/dico/parcels2/Privileges.kt new file mode 100644 index 0000000..632f1a4 --- /dev/null +++ b/src/main/kotlin/io/dico/parcels2/Privileges.kt @@ -0,0 +1,64 @@ +package io.dico.parcels2 + +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 + +interface Privileges : RawPrivileges { + val keyOfOwner: PlayerProfile.Real? + + fun getStoredPrivilege(key: PrivilegeKey): Privilege { + return if (key == keyOfOwner) Privilege.OWNER + else getRawStoredPrivilege(key) + } + + override var privilegeOfStar: Privilege + get() = getStoredPrivilege(PlayerProfile.Star) + set(value) { + setRawStoredPrivilege(PlayerProfile.Star, value) + } +} + +val OfflinePlayer.privilegeKey: PrivilegeKey + inline get() = PlayerProfile.nameless(this) + +fun Privileges.getEffectivePrivilege(player: OfflinePlayer, adminPerm: String): Privilege = + if (player is Player && player.hasPermission(adminPerm)) Privilege.ADMIN + else getStoredPrivilege(player.privilegeKey) + +fun Privileges.canManage(player: OfflinePlayer) = getEffectivePrivilege(player, PERM_ADMIN_MANAGE) >= Privilege.CAN_MANAGE +fun Privileges.canManageFast(player: OfflinePlayer) = getStoredPrivilege(player.privilegeKey) >= Privilege.CAN_MANAGE +fun Privileges.canBuild(player: OfflinePlayer) = getEffectivePrivilege(player, PERM_BUILD_ANYWHERE) >= Privilege.CAN_BUILD +fun Privileges.canBuildFast(player: OfflinePlayer) = getStoredPrivilege(player.privilegeKey) >= Privilege.CAN_BUILD +fun Privileges.canEnter(player: OfflinePlayer) = getEffectivePrivilege(player, PERM_BAN_BYPASS) >= Privilege.DEFAULT +fun Privileges.canEnterFast(player: OfflinePlayer) = getStoredPrivilege(player.privilegeKey) >= Privilege.DEFAULT + +enum class PrivilegeChangeResult { + SUCCESS, FAIL, FAIL_OWNER +} + +fun Privileges.changePrivilege(key: PrivilegeKey, positive: Boolean, update: Privilege): PrivilegeChangeResult = + when { + key == keyOfOwner -> FAIL_OWNER + getRawStoredPrivilege(key).isChangeInDirection(positive, update) && setRawStoredPrivilege(key, update) -> SUCCESS + else -> FAIL + } + +fun Privileges.allowManage(key: PrivilegeKey) = changePrivilege(key, true, Privilege.CAN_MANAGE) +fun Privileges.disallowManage(key: PrivilegeKey) = changePrivilege(key, false, Privilege.CAN_BUILD) +fun Privileges.allowBuild(key: PrivilegeKey) = changePrivilege(key, true, Privilege.CAN_BUILD) +fun Privileges.disallowBuild(key: PrivilegeKey) = changePrivilege(key, false, Privilege.DEFAULT) +fun Privileges.allowEnter(key: PrivilegeKey) = changePrivilege(key, true, Privilege.DEFAULT) +fun Privileges.disallowEnter(key: PrivilegeKey) = changePrivilege(key, false, Privilege.BANNED) + +interface GlobalPrivileges : RawPrivileges, Privileges { + override val keyOfOwner: PlayerProfile.Real +} + +interface GlobalPrivilegesManager { + operator fun get(owner: PlayerProfile.Real): GlobalPrivileges + operator fun get(owner: OfflinePlayer): GlobalPrivileges = get(owner.privilegeKey) +} |