summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDico200 <dico.karssiens@gmail.com>2018-07-31 16:00:07 +0100
committerDico200 <dico.karssiens@gmail.com>2018-07-31 16:00:07 +0100
commit1ec6dd136b678a312d5865ef1fdfd994d58796d3 (patch)
treea120356e8a3029c40fbefe8274226077528b986b
parent4b34c708d2fac7c4ed1cceb8e86b4f86faf0dfb2 (diff)
work on global added data
-rw-r--r--src/main/kotlin/io/dico/parcels2/GlobalAddedData.kt48
-rw-r--r--src/main/kotlin/io/dico/parcels2/Parcel.kt4
-rw-r--r--src/main/kotlin/io/dico/parcels2/ParcelsPlugin.kt9
-rw-r--r--src/main/kotlin/io/dico/parcels2/storage/Backing.kt6
-rw-r--r--src/main/kotlin/io/dico/parcels2/storage/ExposedBacking.kt4
-rw-r--r--src/main/kotlin/io/dico/parcels2/storage/Storage.kt10
6 files changed, 66 insertions, 15 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/GlobalAddedData.kt b/src/main/kotlin/io/dico/parcels2/GlobalAddedData.kt
index f94bdd3..eb00c52 100644
--- a/src/main/kotlin/io/dico/parcels2/GlobalAddedData.kt
+++ b/src/main/kotlin/io/dico/parcels2/GlobalAddedData.kt
@@ -1,19 +1,63 @@
package io.dico.parcels2
+import io.dico.parcels2.util.uuid
+import kotlinx.coroutines.experimental.CompletableDeferred
+import kotlinx.coroutines.experimental.Deferred
import org.bukkit.OfflinePlayer
import java.util.*
+interface GlobalAddedData : AddedData {
+ val uuid: UUID
+}
+
class GlobalAddedDataManager(val plugin: ParcelsPlugin) {
+ private val map = mutableMapOf<UUID, GlobalAddedData?>()
+ operator fun get(player: OfflinePlayer) = get(player.uuid)
- operator fun get(player: OfflinePlayer): AddedData {
+ operator fun get(uuid: UUID): GlobalAddedData? {
+
+ }
+
+ fun getDeferred(uuid: UUID): Deferred<AddedData> {
+ get(uuid)?.let { return CompletableDeferred(it) }
+
+ }
+ private suspend fun getAsync(uuid: UUID): GlobalAddedData {
+ val data = plugin.storage.readGlobalAddedData(ParcelOwner(uuid = uuid)).await()
+ ?: return GlobalAddedDataImpl(uuid)
+ val result = GlobalAddedDataImpl(uuid, data)
+ map[uuid] = result
+ return result
}
- operator fun get(uuid: UUID): AddedData {
+ private inner class GlobalAddedDataImpl(override val uuid: UUID,
+ data: MutableMap<UUID, AddedStatus> = emptyData)
+ : AddedDataHolder(data), GlobalAddedData {
+
+ private inline var data get() = added; set(value) = run { added = value }
+ private inline val isEmpty get() = data === emptyData
+
+ override fun setAddedStatus(uuid: UUID, status: AddedStatus): Boolean {
+ if (isEmpty) {
+ if (status == AddedStatus.DEFAULT) return false
+ data = mutableMapOf()
+ }
+ return super.setAddedStatus(uuid, status).also {
+ if (it) plugin.storage.setGlobalAddedStatus(ParcelOwner(uuid = this.uuid), uuid, status)
+ }
+ }
}
+ private companion object {
+ val emptyData = mapOf<UUID, AddedStatus>() as MutableMap<UUID, AddedStatus>
+ }
}
+
+
+
+
diff --git a/src/main/kotlin/io/dico/parcels2/Parcel.kt b/src/main/kotlin/io/dico/parcels2/Parcel.kt
index e86667b..1d323dd 100644
--- a/src/main/kotlin/io/dico/parcels2/Parcel.kt
+++ b/src/main/kotlin/io/dico/parcels2/Parcel.kt
@@ -117,8 +117,8 @@ class Parcel(val world: ParcelWorld, val pos: Vec2i) : ParcelData {
var hasBlockVisitors: Boolean = false; private set
}
-open class AddedDataHolder : AddedData {
- override var added = mutableMapOf<UUID, AddedStatus>()
+open class AddedDataHolder(override var added: MutableMap<UUID, AddedStatus>
+ = mutableMapOf<UUID, AddedStatus>()) : AddedData {
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 }
diff --git a/src/main/kotlin/io/dico/parcels2/ParcelsPlugin.kt b/src/main/kotlin/io/dico/parcels2/ParcelsPlugin.kt
index cc06f85..53a2d15 100644
--- a/src/main/kotlin/io/dico/parcels2/ParcelsPlugin.kt
+++ b/src/main/kotlin/io/dico/parcels2/ParcelsPlugin.kt
@@ -11,7 +11,6 @@ import io.dico.parcels2.listener.ParcelListeners
import io.dico.parcels2.storage.Storage
import io.dico.parcels2.storage.yamlObjectMapper
import io.dico.parcels2.util.tryCreate
-import kotlinx.coroutines.experimental.asCoroutineDispatcher
import org.bukkit.Bukkit
import org.bukkit.plugin.java.JavaPlugin
import org.slf4j.LoggerFactory
@@ -33,6 +32,14 @@ class ParcelsPlugin : JavaPlugin() {
private var cmdDispatcher: ICommandDispatcher? = null
val worktimeLimiter: WorktimeLimiter by lazy { TickWorktimeLimiter(this, options.tickWorktime) }
+ val mainThreadDispatcher = object : Executor {
+ private val mainThread = Thread.currentThread()
+ override fun execute(command: Runnable) {
+ if (Thread.currentThread() === mainThread) command.run()
+ else server.scheduler.runTask(this@ParcelsPlugin, command)
+ }
+ }
+
override fun onEnable() {
plogger.info("Debug enabled: ${plogger.isDebugEnabled}")
if (!init()) {
diff --git a/src/main/kotlin/io/dico/parcels2/storage/Backing.kt b/src/main/kotlin/io/dico/parcels2/storage/Backing.kt
index 31b6574..7f00976 100644
--- a/src/main/kotlin/io/dico/parcels2/storage/Backing.kt
+++ b/src/main/kotlin/io/dico/parcels2/storage/Backing.kt
@@ -1,6 +1,6 @@
package io.dico.parcels2.storage
-import io.dico.parcels2.AddedData
+import io.dico.parcels2.AddedStatus
import io.dico.parcels2.Parcel
import io.dico.parcels2.ParcelData
import io.dico.parcels2.ParcelOwner
@@ -44,8 +44,8 @@ interface Backing {
suspend fun setParcelAllowsInteractInputs(parcel: Parcel, value: Boolean)
- suspend fun readGlobalPlayerStateData(owner: ParcelOwner): AddedData?
+ suspend fun readGlobalAddedData(owner: ParcelOwner): MutableMap<UUID, AddedStatus>
- suspend fun setGlobalPlayerState(owner: ParcelOwner, player: UUID, state: Boolean?)
+ suspend fun setGlobalAddedStatus(owner: ParcelOwner, player: UUID, status: AddedStatus)
} \ No newline at end of file
diff --git a/src/main/kotlin/io/dico/parcels2/storage/ExposedBacking.kt b/src/main/kotlin/io/dico/parcels2/storage/ExposedBacking.kt
index cbcb6f4..1a8a252 100644
--- a/src/main/kotlin/io/dico/parcels2/storage/ExposedBacking.kt
+++ b/src/main/kotlin/io/dico/parcels2/storage/ExposedBacking.kt
@@ -275,11 +275,11 @@ class ExposedBacking(private val dataSourceFactory: () -> DataSource) : Backing
}
}
- override suspend fun readGlobalPlayerStateData(owner: ParcelOwner): AddedData? {
+ override suspend fun readGlobalAddedData(owner: ParcelOwner): AddedData? {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
- override suspend fun setGlobalPlayerState(owner: ParcelOwner, player: UUID, state: Boolean?) {
+ override suspend fun setGlobalAddedStatus(owner: ParcelOwner, player: UUID, status: Boolean?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
diff --git a/src/main/kotlin/io/dico/parcels2/storage/Storage.kt b/src/main/kotlin/io/dico/parcels2/storage/Storage.kt
index cb3c3d0..2323571 100644
--- a/src/main/kotlin/io/dico/parcels2/storage/Storage.kt
+++ b/src/main/kotlin/io/dico/parcels2/storage/Storage.kt
@@ -1,6 +1,6 @@
package io.dico.parcels2.storage
-import io.dico.parcels2.AddedData
+import io.dico.parcels2.AddedStatus
import io.dico.parcels2.Parcel
import io.dico.parcels2.ParcelData
import io.dico.parcels2.ParcelOwner
@@ -44,9 +44,9 @@ interface Storage {
fun setParcelAllowsInteractInputs(parcel: Parcel, value: Boolean): Job
- fun readGlobalPlayerStateData(owner: ParcelOwner): Deferred<AddedData?>
+ fun readGlobalAddedData(owner: ParcelOwner): Deferred<MutableMap<UUID, AddedStatus>?>
- fun setGlobalPlayerState(owner: ParcelOwner, player: UUID, state: Boolean?): Job
+ fun setGlobalAddedStatus(owner: ParcelOwner, player: UUID, status: AddedStatus): Job
}
class StorageWithCoroutineBacking internal constructor(val backing: Backing) : Storage {
@@ -94,7 +94,7 @@ class StorageWithCoroutineBacking internal constructor(val backing: Backing) : S
override fun setParcelAllowsInteractInputs(parcel: Parcel, value: Boolean) = job { backing.setParcelAllowsInteractInputs(parcel, value) }
- override fun readGlobalPlayerStateData(owner: ParcelOwner): Deferred<AddedData?> = defer { backing.readGlobalPlayerStateData(owner) }
+ override fun readGlobalAddedData(owner: ParcelOwner): Deferred<MutableMap<UUID, AddedStatus>?> = defer { backing.readGlobalAddedData(owner) }
- override fun setGlobalPlayerState(owner: ParcelOwner, player: UUID, state: Boolean?) = job { backing.setGlobalPlayerState(owner, player, state) }
+ override fun setGlobalAddedStatus(owner: ParcelOwner, player: UUID, status: AddedStatus) = job { backing.setGlobalAddedStatus(owner, player, status) }
}