summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/Parcel.kt
diff options
context:
space:
mode:
authorDico200 <dico.karssiens@gmail.com>2018-07-27 23:20:44 +0100
committerDico200 <dico.karssiens@gmail.com>2018-07-27 23:20:44 +0100
commit2a726e1b618b38e635b249d7d09000ec2ea9ac17 (patch)
treec370942595e36ffce24e0873c710c06110973a17 /src/main/kotlin/io/dico/parcels2/Parcel.kt
parenta9c19ff5cfbf6d99d46cc38d0e294275cdc7f61e (diff)
Work on commands a bit more
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/Parcel.kt')
-rw-r--r--src/main/kotlin/io/dico/parcels2/Parcel.kt56
1 files changed, 38 insertions, 18 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/Parcel.kt b/src/main/kotlin/io/dico/parcels2/Parcel.kt
index 4df60b1..0bdaafd 100644
--- a/src/main/kotlin/io/dico/parcels2/Parcel.kt
+++ b/src/main/kotlin/io/dico/parcels2/Parcel.kt
@@ -3,19 +3,41 @@ package io.dico.parcels2
import io.dico.parcels2.math.Vec2i
import io.dico.parcels2.util.getPlayerName
import io.dico.parcels2.util.hasBuildAnywhere
+import io.dico.parcels2.util.isValid
+import io.dico.parcels2.util.uuid
import org.bukkit.Bukkit
+import org.bukkit.OfflinePlayer
import org.bukkit.entity.Player
import java.util.*
-interface ParcelData {
- var owner: ParcelOwner?
+interface AddedData {
val added: Map<UUID, AddedStatus>
fun getAddedStatus(uuid: UUID): AddedStatus
fun setAddedStatus(uuid: UUID, status: AddedStatus): Boolean
- fun isBanned(uuid: UUID): Boolean
- fun isAllowed(uuid: UUID): Boolean
- fun canBuild(player: Player): Boolean
+
+ fun compareAndSetAddedStatus(uuid: UUID, expect: AddedStatus, status: AddedStatus): Boolean =
+ (getAddedStatus(uuid) == expect).also { if (it) setAddedStatus(uuid, status) }
+
+ fun isAllowed(uuid: UUID) = getAddedStatus(uuid) == AddedStatus.ALLOWED
+ fun allow(uuid: UUID) = setAddedStatus(uuid, AddedStatus.ALLOWED)
+ fun disallow(uuid: UUID) = compareAndSetAddedStatus(uuid, AddedStatus.ALLOWED, AddedStatus.DEFAULT)
+ fun isBanned(uuid: UUID) = getAddedStatus(uuid) == AddedStatus.BANNED
+ fun ban(uuid: UUID) = setAddedStatus(uuid, AddedStatus.BANNED)
+ fun unban(uuid: UUID) = compareAndSetAddedStatus(uuid, AddedStatus.BANNED, AddedStatus.DEFAULT)
+
+ fun isAllowed(player: OfflinePlayer) = isAllowed(player.uuid)
+ fun allow(player: OfflinePlayer) = allow(player.uuid)
+ fun disallow(player: OfflinePlayer) = disallow(player.uuid)
+ fun isBanned(player: OfflinePlayer) = isBanned(player.uuid)
+ fun ban(player: OfflinePlayer) = ban(player.uuid)
+ fun unban(player: OfflinePlayer) = unban(player.uuid)
+}
+
+interface ParcelData : AddedData {
+ var owner: ParcelOwner?
+
+ fun canBuild(player: OfflinePlayer, checkAdmin: Boolean = true, checkGlobal: Boolean = true): Boolean
var allowInteractInputs: Boolean
var allowInteractInventory: Boolean
@@ -23,7 +45,6 @@ interface ParcelData {
fun isOwner(uuid: UUID): Boolean {
return owner?.uuid == uuid
}
-
}
/**
@@ -58,7 +79,7 @@ class Parcel(val world: ParcelWorld, val pos: Vec2i) : ParcelData {
override fun getAddedStatus(uuid: UUID) = data.getAddedStatus(uuid)
override fun isBanned(uuid: UUID) = data.isBanned(uuid)
override fun isAllowed(uuid: UUID) = data.isAllowed(uuid)
- override fun canBuild(player: Player) = data.canBuild(player)
+ override fun canBuild(player: OfflinePlayer, checkAdmin: Boolean, checkGlobal: Boolean) = data.canBuild(player)
override var owner: ParcelOwner?
get() = data.owner
@@ -94,20 +115,19 @@ class Parcel(val world: ParcelWorld, val pos: Vec2i) : ParcelData {
var hasBlockVisitors: Boolean = false; private set
}
-class ParcelDataHolder : ParcelData {
+open class AddedDataHolder : AddedData {
override var added = mutableMapOf<UUID, AddedStatus>()
- override var owner: ParcelOwner? = null
-
override fun getAddedStatus(uuid: UUID): AddedStatus = added.getOrDefault(uuid, AddedStatus.DEFAULT)
override fun setAddedStatus(uuid: UUID, status: AddedStatus): Boolean = status.takeIf { it != AddedStatus.DEFAULT }
?.let { added.put(uuid, it) != it }
?: added.remove(uuid) != null
+}
- override fun isBanned(uuid: UUID) = getAddedStatus(uuid) == AddedStatus.BANNED
- override fun isAllowed(uuid: UUID) = getAddedStatus(uuid) == AddedStatus.ALLOWED
- override fun canBuild(player: Player) = isAllowed(player.uniqueId)
- || owner?.matches(player, allowNameMatch = false) ?: false
- || player.hasBuildAnywhere
+class ParcelDataHolder : AddedDataHolder(), ParcelData {
+ override var owner: ParcelOwner? = null
+ override fun canBuild(player: OfflinePlayer, checkAdmin: Boolean, checkGlobal: Boolean) = isAllowed(player.uniqueId)
+ || owner.let { it != null && it.matches(player, allowNameMatch = false) }
+ || (checkAdmin && player is Player && player.hasBuildAnywhere)
override var allowInteractInputs = true
override var allowInteractInventory = true
@@ -144,14 +164,14 @@ class ParcelOwner(val uuid: UUID? = null,
if (name != null) this.name = name
else {
- val offlinePlayer = Bukkit.getOfflinePlayer(uuid).takeIf { it.isOnline() || it.hasPlayedBefore() }
+ val offlinePlayer = Bukkit.getOfflinePlayer(uuid).takeIf { it.isValid }
this.name = offlinePlayer?.name
}
}
val playerName get() = getPlayerName(uuid, name)
- fun matches(player: Player, allowNameMatch: Boolean = false): Boolean {
+ fun matches(player: OfflinePlayer, allowNameMatch: Boolean = false): Boolean {
return uuid?.let { it == player.uniqueId } ?: false
|| (allowNameMatch && name?.let { it == player.name } ?: false)
}
@@ -162,5 +182,5 @@ class ParcelOwner(val uuid: UUID? = null,
@Suppress("DEPRECATION")
val offlinePlayer
get() = (uuid?.let { Bukkit.getOfflinePlayer(it) } ?: Bukkit.getOfflinePlayer(name))
- ?.takeIf { it.isOnline() || it.hasPlayedBefore() }
+ ?.takeIf { it.isValid }
}