summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDico200 <dico.karssiens@gmail.com>2018-07-28 00:31:55 +0100
committerDico200 <dico.karssiens@gmail.com>2018-07-28 00:31:55 +0100
commit547ffcb0ba8407838e0ec9241406206b38885ad2 (patch)
treea20c194c185d29e8b7a3b455e01eb837d82255ef
parent2c1aee89f6bbc696f55a0952bf26c295611e5e3a (diff)
Look at some DB stuff
-rw-r--r--src/main/kotlin/io/dico/parcels2/Parcel.kt12
-rw-r--r--src/main/kotlin/io/dico/parcels2/ParcelWorld.kt4
-rw-r--r--src/main/kotlin/io/dico/parcels2/WorldGenerator.kt8
-rw-r--r--src/main/kotlin/io/dico/parcels2/listener/ParcelEntityTracker.kt3
-rw-r--r--src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt4
-rw-r--r--src/main/kotlin/io/dico/parcels2/storage/Backing.kt8
-rw-r--r--src/main/kotlin/io/dico/parcels2/storage/ExposedBacking.kt88
-rw-r--r--src/main/kotlin/io/dico/parcels2/storage/SerializableTypes.kt2
-rw-r--r--src/main/kotlin/io/dico/parcels2/storage/Storage.kt20
-rw-r--r--src/main/kotlin/io/dico/parcels2/util/NumberExtensions.kt (renamed from src/main/kotlin/io/dico/parcels2/math/NumberExtensions.kt)2
-rw-r--r--src/main/kotlin/io/dico/parcels2/util/Vec2i.kt (renamed from src/main/kotlin/io/dico/parcels2/math/Vec2i.kt)2
11 files changed, 99 insertions, 54 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/Parcel.kt b/src/main/kotlin/io/dico/parcels2/Parcel.kt
index 0bdaafd..61c0862 100644
--- a/src/main/kotlin/io/dico/parcels2/Parcel.kt
+++ b/src/main/kotlin/io/dico/parcels2/Parcel.kt
@@ -1,6 +1,6 @@
package io.dico.parcels2
-import io.dico.parcels2.math.Vec2i
+import io.dico.parcels2.util.Vec2i
import io.dico.parcels2.util.getPlayerName
import io.dico.parcels2.util.hasBuildAnywhere
import io.dico.parcels2.util.isValid
@@ -8,6 +8,7 @@ import io.dico.parcels2.util.uuid
import org.bukkit.Bukkit
import org.bukkit.OfflinePlayer
import org.bukkit.entity.Player
+import org.joda.time.DateTime
import java.util.*
interface AddedData {
@@ -148,12 +149,13 @@ enum class AddedStatus {
@Suppress("UsePropertyAccessSyntax")
class ParcelOwner(val uuid: UUID? = null,
- name: String? = null) {
+ name: String? = null,
+ val since: DateTime? = null) {
companion object {
- fun create(uuid: UUID?, name: String?): ParcelOwner? {
- return uuid?.let { ParcelOwner(uuid, name) }
- ?: name?.let { ParcelOwner(uuid, name) }
+ fun create(uuid: UUID?, name: String?, time: DateTime? = null): ParcelOwner? {
+ return uuid?.let { ParcelOwner(uuid, name, time) }
+ ?: name?.let { ParcelOwner(uuid, name, time) }
}
}
diff --git a/src/main/kotlin/io/dico/parcels2/ParcelWorld.kt b/src/main/kotlin/io/dico/parcels2/ParcelWorld.kt
index 2868556..a2e8155 100644
--- a/src/main/kotlin/io/dico/parcels2/ParcelWorld.kt
+++ b/src/main/kotlin/io/dico/parcels2/ParcelWorld.kt
@@ -1,11 +1,11 @@
package io.dico.parcels2
-import io.dico.parcels2.math.Vec2i
-import io.dico.parcels2.math.floor
import io.dico.parcels2.storage.SerializableParcel
import io.dico.parcels2.storage.SerializableWorld
import io.dico.parcels2.storage.Storage
+import io.dico.parcels2.util.Vec2i
import io.dico.parcels2.util.doAwait
+import io.dico.parcels2.util.floor
import kotlinx.coroutines.experimental.launch
import org.bukkit.Bukkit
import org.bukkit.Location
diff --git a/src/main/kotlin/io/dico/parcels2/WorldGenerator.kt b/src/main/kotlin/io/dico/parcels2/WorldGenerator.kt
index e9fdcc1..15fbde6 100644
--- a/src/main/kotlin/io/dico/parcels2/WorldGenerator.kt
+++ b/src/main/kotlin/io/dico/parcels2/WorldGenerator.kt
@@ -1,9 +1,9 @@
package io.dico.parcels2
-import io.dico.parcels2.math.Vec2i
-import io.dico.parcels2.math.clamp
-import io.dico.parcels2.math.even
-import io.dico.parcels2.math.umod
+import io.dico.parcels2.util.Vec2i
+import io.dico.parcels2.util.clamp
+import io.dico.parcels2.util.even
+import io.dico.parcels2.util.umod
import org.bukkit.*
import org.bukkit.Bukkit.createBlockData
import org.bukkit.block.Biome
diff --git a/src/main/kotlin/io/dico/parcels2/listener/ParcelEntityTracker.kt b/src/main/kotlin/io/dico/parcels2/listener/ParcelEntityTracker.kt
index 22a5486..2f64ab1 100644
--- a/src/main/kotlin/io/dico/parcels2/listener/ParcelEntityTracker.kt
+++ b/src/main/kotlin/io/dico/parcels2/listener/ParcelEntityTracker.kt
@@ -40,8 +40,9 @@ class ParcelEntityTracker(val worlds: Worlds) {
}
}
+ @Suppress("RedundantLambdaArrow")
fun swapParcels(parcel1: Parcel, parcel2: Parcel) {
- map.editLoop {
+ map.editLoop { ->
if (value === parcel1) {
value = parcel2
} else if (value === parcel2) {
diff --git a/src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt b/src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt
index 0ad7953..d535d46 100644
--- a/src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt
+++ b/src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt
@@ -110,7 +110,7 @@ class ParcelListeners(val worlds: Worlds, val entityTracker: ParcelEntityTracker
private inline val Long.columnX get() = and(0xFFFF_FFFFL).toInt()
private inline val Long.columnZ get() = ushr(32).and(0xFFFF_FFFFL).toInt()
- private inline fun TLongCollection.forEachInline(block: (Long) -> Unit) = iterator().let { while (it.hasNext()) block(it.next()) }
+ private inline fun TLongCollection.troveForEach(block: (Long) -> Unit) = iterator().let { while (it.hasNext()) block(it.next()) }
//@formatter:on
private fun checkPistonMovement(event: BlockPistonEvent, blocks: List<Block>) {
val world = worlds.getWorld(event.block.world) ?: return
@@ -122,7 +122,7 @@ class ParcelListeners(val worlds: Worlds, val entityTracker: ParcelEntityTracker
it.getRelative(direction).let { columns.add(Column(it.x, it.z)) }
}
- columns.forEachInline {
+ columns.troveForEach {
val ppa = world.parcelAt(it.columnX, it.columnZ)
if (ppa.isNullOr { hasBlockVisitors }) {
event.isCancelled = true
diff --git a/src/main/kotlin/io/dico/parcels2/storage/Backing.kt b/src/main/kotlin/io/dico/parcels2/storage/Backing.kt
index 252c602..31b6574 100644
--- a/src/main/kotlin/io/dico/parcels2/storage/Backing.kt
+++ b/src/main/kotlin/io/dico/parcels2/storage/Backing.kt
@@ -1,5 +1,6 @@
package io.dico.parcels2.storage
+import io.dico.parcels2.AddedData
import io.dico.parcels2.Parcel
import io.dico.parcels2.ParcelData
import io.dico.parcels2.ParcelOwner
@@ -23,6 +24,8 @@ interface Backing {
*/
suspend fun ProducerScope<Pair<Parcel, ParcelData?>>.produceParcelData(parcels: Sequence<Parcel>)
+ suspend fun ProducerScope<Pair<SerializableParcel, ParcelData?>>.produceAllParcelData()
+
suspend fun readParcelData(parcelFor: Parcel): ParcelData?
suspend fun getOwnedParcels(user: ParcelOwner): List<SerializableParcel>
@@ -40,4 +43,9 @@ interface Backing {
suspend fun setParcelAllowsInteractInputs(parcel: Parcel, value: Boolean)
+
+ suspend fun readGlobalPlayerStateData(owner: ParcelOwner): AddedData?
+
+ suspend fun setGlobalPlayerState(owner: ParcelOwner, player: UUID, state: Boolean?)
+
} \ 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 ce6b45b..a78cab8 100644
--- a/src/main/kotlin/io/dico/parcels2/storage/ExposedBacking.kt
+++ b/src/main/kotlin/io/dico/parcels2/storage/ExposedBacking.kt
@@ -2,14 +2,14 @@ package io.dico.parcels2.storage
import com.zaxxer.hikari.HikariDataSource
import io.dico.parcels2.*
-import io.dico.parcels2.math.Vec2i
-import io.dico.parcels2.util.synchronized
+import io.dico.parcels2.util.Vec2i
import io.dico.parcels2.util.toByteArray
import io.dico.parcels2.util.toUUID
import kotlinx.coroutines.experimental.channels.ProducerScope
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.SchemaUtils.create
import org.jetbrains.exposed.sql.transactions.transaction
+import org.joda.time.DateTime
import java.util.*
import javax.sql.DataSource
@@ -29,6 +29,7 @@ object ParcelsT : Table("parcels") {
.references(WorldsT.id)
val owner_uuid = binary("owner_uuid", 16).nullable()
val owner_name = varchar("owner_name", 16).nullable()
+ val claim_time = datetime("claim_time").nullable()
}
object AddedLocalT : Table("parcels_added_local") {
@@ -148,30 +149,18 @@ class ExposedBacking(private val dataSourceFactory: () -> DataSource) : Backing
channel.close()
}
- override suspend fun readParcelData(parcelFor: Parcel): ParcelData? = transaction {
- val row = getParcelRow(parcelFor) ?: return@transaction null
-
- ParcelDataHolder().apply {
-
- owner = ParcelOwner.create(
- uuid = row[ParcelsT.owner_uuid]?.toUUID(),
- name = row[ParcelsT.owner_name]
- )
-
- val parcelId = row[ParcelsT.id]
- AddedLocalT.select { AddedLocalT.parcel_id eq parcelId }.forEach {
- val uuid = it[AddedLocalT.player_uuid].toUUID()!!
- val status = if (it[AddedLocalT.allowed_flag]) AddedStatus.ALLOWED else AddedStatus.BANNED
- setAddedStatus(uuid, status)
- }
-
- ParcelOptionsT.select { ParcelOptionsT.parcel_id eq parcelId }.firstOrNull()?.let {
- allowInteractInputs = it[ParcelOptionsT.interact_inputs]
- allowInteractInventory = it[ParcelOptionsT.interact_inventory]
- }
-
+ override suspend fun ProducerScope<Pair<SerializableParcel, ParcelData?>>.produceAllParcelData() {
+ ParcelsT.selectAll().forEach { row ->
+ val parcel = rowToSerializableParcel(row) ?: return@forEach
+ val data = rowToParcelData(row)
+ channel.send(parcel to data)
}
+ channel.close()
+ }
+ override suspend fun readParcelData(parcelFor: Parcel): ParcelData? = transaction {
+ val row = getParcelRow(parcelFor) ?: return@transaction null
+ rowToParcelData(row)
}
// TODO order by some new column
@@ -186,16 +175,8 @@ class ExposedBacking(private val dataSourceFactory: () -> DataSource) : Backing
where = { ParcelsT.owner_name eq name }
}
- ParcelsT.select(where)
- .map { parcelRow ->
- val worldId = parcelRow[ParcelsT.world_id]
- val worldRow = WorldsT.select({ WorldsT.id eq worldId }).firstOrNull()
- ?: return@map null
-
- val world = SerializableWorld(worldRow[WorldsT.name], worldRow[WorldsT.uid].toUUID())
- SerializableParcel(world, Vec2i(parcelRow[ParcelsT.px], parcelRow[ParcelsT.pz]))
- }
- .filterNotNull()
+ ParcelsT.select(where).orderBy(ParcelsT.claim_time, isAsc = true)
+ .mapNotNull(::rowToSerializableParcel)
.toList()
}
@@ -237,6 +218,7 @@ class ExposedBacking(private val dataSourceFactory: () -> DataSource) : Backing
override suspend fun setParcelOwner(parcelFor: Parcel, owner: ParcelOwner?) = transaction {
val binaryUuid = owner?.uuid?.toByteArray()
val name = owner?.name
+ val time = owner?.let { DateTime.now() }
val id = if (owner == null)
getParcelId(parcelFor) ?: return@transaction
@@ -246,6 +228,7 @@ class ExposedBacking(private val dataSourceFactory: () -> DataSource) : Backing
ParcelsT.update({ ParcelsT.id eq id }) {
it[ParcelsT.owner_uuid] = binaryUuid
it[ParcelsT.owner_name] = name
+ it[ParcelsT.claim_time] = time
}
}
@@ -282,6 +265,43 @@ class ExposedBacking(private val dataSourceFactory: () -> DataSource) : Backing
}
}
+ override suspend fun readGlobalPlayerStateData(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?) {
+ TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+ }
+
+ private fun rowToSerializableParcel(row: ResultRow): SerializableParcel? {
+ val worldId = row[ParcelsT.world_id]
+ val worldRow = WorldsT.select { WorldsT.id eq worldId }.firstOrNull()
+ ?: return null
+
+ val world = SerializableWorld(worldRow[WorldsT.name], worldRow[WorldsT.uid].toUUID())
+ return SerializableParcel(world, Vec2i(row[ParcelsT.px], row[ParcelsT.pz]))
+ }
+
+ private fun rowToParcelData(row: ResultRow) = ParcelDataHolder().apply {
+ owner = ParcelOwner.create(
+ uuid = row[ParcelsT.owner_uuid]?.toUUID(),
+ name = row[ParcelsT.owner_name],
+ time = row[ParcelsT.claim_time]
+ )
+
+ val parcelId = row[ParcelsT.id]
+ AddedLocalT.select { AddedLocalT.parcel_id eq parcelId }.forEach {
+ val uuid = it[AddedLocalT.player_uuid].toUUID()!!
+ val status = if (it[AddedLocalT.allowed_flag]) AddedStatus.ALLOWED else AddedStatus.BANNED
+ setAddedStatus(uuid, status)
+ }
+
+ ParcelOptionsT.select { ParcelOptionsT.parcel_id eq parcelId }.firstOrNull()?.let {
+ allowInteractInputs = it[ParcelOptionsT.interact_inputs]
+ allowInteractInventory = it[ParcelOptionsT.interact_inventory]
+ }
+ }
+
}
diff --git a/src/main/kotlin/io/dico/parcels2/storage/SerializableTypes.kt b/src/main/kotlin/io/dico/parcels2/storage/SerializableTypes.kt
index 4c25aeb..8d8d938 100644
--- a/src/main/kotlin/io/dico/parcels2/storage/SerializableTypes.kt
+++ b/src/main/kotlin/io/dico/parcels2/storage/SerializableTypes.kt
@@ -3,7 +3,7 @@ package io.dico.parcels2.storage
import io.dico.parcels2.Parcel
import io.dico.parcels2.ParcelWorld
import io.dico.parcels2.Worlds
-import io.dico.parcels2.math.Vec2i
+import io.dico.parcels2.util.Vec2i
import org.bukkit.Bukkit
import org.bukkit.World
import java.util.*
diff --git a/src/main/kotlin/io/dico/parcels2/storage/Storage.kt b/src/main/kotlin/io/dico/parcels2/storage/Storage.kt
index 7af6bc5..cb3c3d0 100644
--- a/src/main/kotlin/io/dico/parcels2/storage/Storage.kt
+++ b/src/main/kotlin/io/dico/parcels2/storage/Storage.kt
@@ -1,5 +1,6 @@
package io.dico.parcels2.storage
+import io.dico.parcels2.AddedData
import io.dico.parcels2.Parcel
import io.dico.parcels2.ParcelData
import io.dico.parcels2.ParcelOwner
@@ -25,6 +26,8 @@ interface Storage {
fun readParcelData(parcelsFor: Sequence<Parcel>, channelCapacity: Int): ReceiveChannel<Pair<Parcel, ParcelData?>>
+ fun readAllParcelData(channelCapacity: Int): ReceiveChannel<Pair<SerializableParcel, ParcelData?>>
+
fun getOwnedParcels(user: ParcelOwner): Deferred<List<SerializableParcel>>
fun getNumParcels(user: ParcelOwner): Deferred<Int>
@@ -40,6 +43,10 @@ interface Storage {
fun setParcelAllowsInteractInputs(parcel: Parcel, value: Boolean): Job
+
+ fun readGlobalPlayerStateData(owner: ParcelOwner): Deferred<AddedData?>
+
+ fun setGlobalPlayerState(owner: ParcelOwner, player: UUID, state: Boolean?): Job
}
class StorageWithCoroutineBacking internal constructor(val backing: Backing) : Storage {
@@ -66,9 +73,11 @@ class StorageWithCoroutineBacking internal constructor(val backing: Backing) : S
override fun readParcelData(parcelFor: Parcel) = defer { backing.readParcelData(parcelFor) }
- override fun readParcelData(parcelsFor: Sequence<Parcel>, channelCapacity: Int) = produce(asyncDispatcher, capacity = channelCapacity) {
- with(backing) { produceParcelData(parcelsFor) }
- }
+ override fun readParcelData(parcelsFor: Sequence<Parcel>, channelCapacity: Int) =
+ produce(asyncDispatcher, capacity = channelCapacity) { with(backing) { produceParcelData(parcelsFor) } }
+
+ override fun readAllParcelData(channelCapacity: Int): ReceiveChannel<Pair<SerializableParcel, ParcelData?>> =
+ produce(asyncDispatcher, capacity = channelCapacity) { with(backing) { produceAllParcelData() } }
override fun getOwnedParcels(user: ParcelOwner) = defer { backing.getOwnedParcels(user) }
@@ -83,4 +92,9 @@ class StorageWithCoroutineBacking internal constructor(val backing: Backing) : S
override fun setParcelAllowsInteractInventory(parcel: Parcel, value: Boolean) = job { backing.setParcelAllowsInteractInventory(parcel, value) }
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 setGlobalPlayerState(owner: ParcelOwner, player: UUID, state: Boolean?) = job { backing.setGlobalPlayerState(owner, player, state) }
}
diff --git a/src/main/kotlin/io/dico/parcels2/math/NumberExtensions.kt b/src/main/kotlin/io/dico/parcels2/util/NumberExtensions.kt
index 985fd2e..214a797 100644
--- a/src/main/kotlin/io/dico/parcels2/math/NumberExtensions.kt
+++ b/src/main/kotlin/io/dico/parcels2/util/NumberExtensions.kt
@@ -1,4 +1,4 @@
-package io.dico.parcels2.math
+package io.dico.parcels2.util
fun Double.floor(): Int {
val down = toInt()
diff --git a/src/main/kotlin/io/dico/parcels2/math/Vec2i.kt b/src/main/kotlin/io/dico/parcels2/util/Vec2i.kt
index bff0326..933c18b 100644
--- a/src/main/kotlin/io/dico/parcels2/math/Vec2i.kt
+++ b/src/main/kotlin/io/dico/parcels2/util/Vec2i.kt
@@ -1,4 +1,4 @@
-package io.dico.parcels2.math
+package io.dico.parcels2.util
data class Vec2i(
val x: Int,