Restructuring, split URL config value for PostgreSQL and Redis into specific config values, and other config improvements #39
No files matched your search
+2
-2
@@ -56,14 +56,14 @@ dependencies {
|
||||
compileOnly("org.purpurmc.purpur:purpur-api:1.19.4-R0.1-SNAPSHOT") // Declare Purpur API version to be packaged.
|
||||
compileOnly("net.luckperms:api:5.5") // Import the LuckPerms API.
|
||||
|
||||
implementation("io.lettuce:lettuce-core:7.2.0.RELEASE") // Import the Lettuce API for keydb.
|
||||
implementation("io.lettuce:lettuce-core:7.5.1.RELEASE") // Import the Lettuce API for keydb.
|
||||
|
||||
implementation("org.flywaydb:flyway-core:12.3.0")
|
||||
implementation("org.flywaydb:flyway-database-postgresql:12.3.0")
|
||||
implementation("org.postgresql:postgresql:42.7.9")
|
||||
implementation("com.github.jasync-sql:jasync-postgresql:2.2.4") // Import the jasync Postgres API.
|
||||
|
||||
implementation("it.unimi.dsi:fastutil-core:8.5.16")
|
||||
implementation("it.unimi.dsi:fastutil-core:8.5.18")
|
||||
|
||||
implementation("org.jetbrains.kotlin:kotlin-stdlib") // Import the Kotlin standard library.
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2")
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
package net.trueog.diamondbankog
|
||||
|
||||
interface Config {
|
||||
var prefix: String
|
||||
var postgresUrl: String
|
||||
var postgresUser: String
|
||||
var postgresPassword: String
|
||||
var redisUrl: String
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog
|
||||
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.mm
|
||||
@@ -7,9 +7,26 @@ import net.kyori.adventure.text.minimessage.tag.standard.StandardTags
|
||||
import net.luckperms.api.LuckPerms
|
||||
import net.trueog.diamondbankog.api.DiamondBankAPIJava
|
||||
import net.trueog.diamondbankog.api.DiamondBankAPIKotlin
|
||||
import net.trueog.diamondbankog.commands.*
|
||||
import net.trueog.diamondbankog.commands.AutoCompress
|
||||
import net.trueog.diamondbankog.commands.AutoDeposit
|
||||
import net.trueog.diamondbankog.api.EventManager
|
||||
import net.trueog.diamondbankog.autocompress.command.AutoCompress
|
||||
import net.trueog.diamondbankog.autodeposit.command.AutoDeposit
|
||||
import net.trueog.diamondbankog.balance.BalanceManager
|
||||
import net.trueog.diamondbankog.balance.CachingBalanceManager
|
||||
import net.trueog.diamondbankog.balance.command.Balance
|
||||
import net.trueog.diamondbankog.balance.command.Balancetop
|
||||
import net.trueog.diamondbankog.balance.command.SetBankBalance
|
||||
import net.trueog.diamondbankog.balance.shard.Shard
|
||||
import net.trueog.diamondbankog.config.Config
|
||||
import net.trueog.diamondbankog.config.YamlConfig
|
||||
import net.trueog.diamondbankog.config.command.DiamondBankReload
|
||||
import net.trueog.diamondbankog.economy.command.DisableEconomy
|
||||
import net.trueog.diamondbankog.economy.command.EnableEconomy
|
||||
import net.trueog.diamondbankog.persistence.Redis
|
||||
import net.trueog.diamondbankog.transaction.TransactionLock
|
||||
import net.trueog.diamondbankog.transaction.command.Compress
|
||||
import net.trueog.diamondbankog.transaction.command.Deposit
|
||||
import net.trueog.diamondbankog.transaction.command.Pay
|
||||
import net.trueog.diamondbankog.transaction.command.Withdraw
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.plugin.ServicePriority
|
||||
import org.bukkit.plugin.java.JavaPlugin
|
||||
@@ -19,7 +36,7 @@ internal open class DiamondBankOG : JavaPlugin() {
|
||||
val scope = CoroutineScope(Dispatchers.Default + SupervisorJob())
|
||||
|
||||
lateinit var plugin: DiamondBankOG
|
||||
lateinit var config: YamlConfig
|
||||
lateinit var config: Config
|
||||
lateinit var eventManager: EventManager
|
||||
lateinit var balanceManager: BalanceManager
|
||||
lateinit var redis: Redis
|
||||
|
||||
@@ -2,8 +2,6 @@ package net.trueog.diamondbankog
|
||||
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.launch
|
||||
import net.trueog.diamondbankog.AutoCompress.compress
|
||||
import net.trueog.diamondbankog.AutoDeposit.deposit
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.balanceManager
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
|
||||
@@ -11,11 +9,14 @@ import net.trueog.diamondbankog.DiamondBankOG.Companion.mm
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.redis
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.scope
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.transactionLock
|
||||
import net.trueog.diamondbankog.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countTotal
|
||||
import net.trueog.diamondbankog.InventoryExtensions.isLocked
|
||||
import net.trueog.diamondbankog.MainThreadBlock.runOnMainThread
|
||||
import net.trueog.diamondbankog.PostgreSQL.ShardType
|
||||
import net.trueog.diamondbankog.autocompress.AutoCompress.compress
|
||||
import net.trueog.diamondbankog.autodeposit.AutoDeposit.deposit
|
||||
import net.trueog.diamondbankog.balance.shard.Shard
|
||||
import net.trueog.diamondbankog.balance.shard.ShardType
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.isLocked
|
||||
import net.trueog.diamondbankog.util.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countTotal
|
||||
import net.trueog.diamondbankog.util.MainThreadBlock.runOnMainThread
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.NamespacedKey
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
package net.trueog.diamondbankog
|
||||
|
||||
import java.util.*
|
||||
|
||||
data class PlayerBalanceChangedEvent(val uuid: UUID, val playerShards: PostgreSQL.PlayerShards)
|
||||
+1
-2
@@ -1,6 +1,5 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog
|
||||
|
||||
import net.trueog.diamondbankog.DiamondBankOG
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.mm
|
||||
import org.bukkit.command.Command
|
||||
@@ -1,59 +0,0 @@
|
||||
package net.trueog.diamondbankog
|
||||
|
||||
import java.io.File
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.plugin
|
||||
import org.bukkit.configuration.file.YamlConfiguration
|
||||
|
||||
internal class YamlConfig private constructor() : Config {
|
||||
override lateinit var prefix: String
|
||||
override lateinit var postgresUrl: String
|
||||
override lateinit var postgresUser: String
|
||||
override lateinit var postgresPassword: String
|
||||
override lateinit var redisUrl: String
|
||||
|
||||
companion object : ConfigFactory {
|
||||
override fun create(): YamlConfig? {
|
||||
val config = YamlConfig()
|
||||
plugin.saveDefaultConfig()
|
||||
val file = File(plugin.dataFolder, "config.yml")
|
||||
val yamlConfig = YamlConfiguration.loadConfiguration(file)
|
||||
|
||||
try {
|
||||
config.prefix = yamlConfig.get("prefix") as String
|
||||
} catch (_: Exception) {
|
||||
plugin.logger.severe("Failed to parse config option \"prefix\" as a string")
|
||||
return null
|
||||
}
|
||||
|
||||
try {
|
||||
config.postgresUrl = yamlConfig.get("postgresUrl") as String
|
||||
} catch (_: Exception) {
|
||||
plugin.logger.severe("Failed to parse config option \"postgresUrl\" as a string")
|
||||
return null
|
||||
}
|
||||
|
||||
try {
|
||||
config.postgresUser = yamlConfig.get("postgresUser") as String
|
||||
} catch (_: Exception) {
|
||||
plugin.logger.severe("Failed to parse config option \"postgresUser\" as a string")
|
||||
return null
|
||||
}
|
||||
|
||||
try {
|
||||
config.postgresPassword = yamlConfig.get("postgresPassword") as String
|
||||
} catch (_: Exception) {
|
||||
plugin.logger.severe("Failed to parse config option \"postgresPassword\" as a string")
|
||||
return null
|
||||
}
|
||||
|
||||
try {
|
||||
config.redisUrl = yamlConfig.get("redisUrl") as String
|
||||
} catch (_: Exception) {
|
||||
plugin.logger.severe("Failed to parse config option \"redisUrl\" as a string")
|
||||
return null
|
||||
}
|
||||
|
||||
return config
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,21 +3,20 @@ package net.trueog.diamondbankog.api
|
||||
import java.util.*
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import net.trueog.diamondbankog.CommonOperations
|
||||
import net.trueog.diamondbankog.DiamondBankException
|
||||
import net.trueog.diamondbankog.DiamondBankException.*
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.balanceManager
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.eventManager
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.transactionLock
|
||||
import net.trueog.diamondbankog.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.InventoryExtensions.lock
|
||||
import net.trueog.diamondbankog.InventoryExtensions.unlock
|
||||
import net.trueog.diamondbankog.InventorySnapshot
|
||||
import net.trueog.diamondbankog.MainThreadBlock.runOnMainThread
|
||||
import net.trueog.diamondbankog.PlayerBalanceChangedListener
|
||||
import net.trueog.diamondbankog.PostgreSQL.PlayerShards
|
||||
import net.trueog.diamondbankog.PostgreSQL.ShardType
|
||||
import net.trueog.diamondbankog.balance.shard.PlayerShards
|
||||
import net.trueog.diamondbankog.balance.shard.ShardType
|
||||
import net.trueog.diamondbankog.transaction.CommonOperations
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.lock
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.unlock
|
||||
import net.trueog.diamondbankog.transaction.InventorySnapshot
|
||||
import net.trueog.diamondbankog.util.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.util.MainThreadBlock.runOnMainThread
|
||||
import org.bukkit.Bukkit
|
||||
|
||||
@OptIn(DelicateCoroutinesApi::class)
|
||||
|
||||
@@ -2,20 +2,19 @@ package net.trueog.diamondbankog.api
|
||||
|
||||
import java.util.*
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import net.trueog.diamondbankog.CommonOperations
|
||||
import net.trueog.diamondbankog.DiamondBankException.*
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.balanceManager
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.eventManager
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.transactionLock
|
||||
import net.trueog.diamondbankog.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.InventoryExtensions.lock
|
||||
import net.trueog.diamondbankog.InventoryExtensions.unlock
|
||||
import net.trueog.diamondbankog.InventorySnapshot
|
||||
import net.trueog.diamondbankog.MainThreadBlock.runOnMainThread
|
||||
import net.trueog.diamondbankog.PlayerBalanceChangedListener
|
||||
import net.trueog.diamondbankog.PostgreSQL.PlayerShards
|
||||
import net.trueog.diamondbankog.PostgreSQL.ShardType
|
||||
import net.trueog.diamondbankog.balance.shard.PlayerShards
|
||||
import net.trueog.diamondbankog.balance.shard.ShardType
|
||||
import net.trueog.diamondbankog.transaction.CommonOperations
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.lock
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.unlock
|
||||
import net.trueog.diamondbankog.transaction.InventorySnapshot
|
||||
import net.trueog.diamondbankog.util.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.util.MainThreadBlock.runOnMainThread
|
||||
import org.bukkit.Bukkit
|
||||
|
||||
@OptIn(DelicateCoroutinesApi::class)
|
||||
|
||||
+3
-2
@@ -1,12 +1,13 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.api
|
||||
|
||||
import java.util.*
|
||||
import java.util.concurrent.CopyOnWriteArrayList
|
||||
import net.trueog.diamondbankog.balance.shard.PlayerShards
|
||||
|
||||
internal class EventManager {
|
||||
private var listeners = CopyOnWriteArrayList<PlayerBalanceChangedListener>()
|
||||
|
||||
fun sendUpdate(uuid: UUID, playerShards: PostgreSQL.PlayerShards) {
|
||||
fun sendUpdate(uuid: UUID, playerShards: PlayerShards) {
|
||||
listeners.forEach { it.onUpdate(PlayerBalanceChangedEvent(uuid, playerShards)) }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
package net.trueog.diamondbankog.api
|
||||
|
||||
import java.util.*
|
||||
import net.trueog.diamondbankog.balance.shard.PlayerShards
|
||||
|
||||
data class PlayerBalanceChangedEvent(val uuid: UUID, val playerShards: PlayerShards)
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.api
|
||||
|
||||
interface PlayerBalanceChangedListener {
|
||||
fun onUpdate(event: PlayerBalanceChangedEvent)
|
||||
+16
-12
@@ -1,17 +1,20 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.autocompress
|
||||
|
||||
import kotlin.math.abs
|
||||
import kotlinx.coroutines.launch
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.balanceManager
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.mm
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.scope
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.transactionLock
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countDiamondBlocks
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countDiamonds
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countShards
|
||||
import net.trueog.diamondbankog.InventoryExtensions.lock
|
||||
import net.trueog.diamondbankog.InventoryExtensions.unlock
|
||||
import net.trueog.diamondbankog.MainThreadBlock.runOnMainThread
|
||||
import net.trueog.diamondbankog.balance.shard.Shard
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.lock
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.unlock
|
||||
import net.trueog.diamondbankog.transaction.InventorySnapshot
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countDiamondBlocks
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countDiamonds
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countShards
|
||||
import net.trueog.diamondbankog.util.MainThreadBlock
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.inventory.ItemStack
|
||||
@@ -32,10 +35,11 @@ internal object AutoCompress {
|
||||
}
|
||||
|
||||
transactionLock.withLockSuspend(player.uniqueId) {
|
||||
val inventorySnapshot = runOnMainThread {
|
||||
player.inventory.lock()
|
||||
InventorySnapshot.from(player.inventory, DiamondBankOG.balanceManager)
|
||||
}
|
||||
val inventorySnapshot =
|
||||
MainThreadBlock.runOnMainThread {
|
||||
player.inventory.lock()
|
||||
InventorySnapshot.from(player.inventory, balanceManager)
|
||||
}
|
||||
|
||||
val shardsInInventory = inventorySnapshot.countShards().toInt()
|
||||
val diamondsInInventory = inventorySnapshot.countDiamonds().toInt()
|
||||
@@ -161,7 +165,7 @@ internal object AutoCompress {
|
||||
}
|
||||
}
|
||||
|
||||
runOnMainThread {
|
||||
MainThreadBlock.runOnMainThread {
|
||||
inventorySnapshot.restoreTo(player.inventory)
|
||||
player.inventory.unlock()
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog.autocompress.command
|
||||
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
|
||||
+4
-3
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.autodeposit
|
||||
|
||||
import kotlinx.coroutines.launch
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.balanceManager
|
||||
@@ -6,7 +6,8 @@ import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.mm
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.scope
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.transactionLock
|
||||
import net.trueog.diamondbankog.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.balance.shard.Shard
|
||||
import net.trueog.diamondbankog.util.ErrorHandler
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.entity.Item
|
||||
import org.bukkit.entity.Player
|
||||
@@ -41,7 +42,7 @@ internal object AutoDeposit {
|
||||
scope.launch {
|
||||
transactionLock.withLockSuspend(player.uniqueId) {
|
||||
balanceManager.addToBankShards(player.uniqueId, shards).getOrElse {
|
||||
handleError(it)
|
||||
ErrorHandler.handleError(it)
|
||||
player.sendMessage(
|
||||
mm.deserialize(
|
||||
"${config.prefix}<reset>: <red>A severe error has occurred. Please notify a staff member."
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog.autodeposit.command
|
||||
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
|
||||
+3
-3
@@ -1,8 +1,8 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.balance
|
||||
|
||||
import java.util.*
|
||||
import net.trueog.diamondbankog.PostgreSQL.PlayerShards
|
||||
import net.trueog.diamondbankog.PostgreSQL.ShardType
|
||||
import net.trueog.diamondbankog.balance.shard.PlayerShards
|
||||
import net.trueog.diamondbankog.balance.shard.ShardType
|
||||
|
||||
interface BalanceManager {
|
||||
suspend fun setPlayerShards(uuid: UUID, shards: Long, type: ShardType): Result<Unit>
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.balance
|
||||
|
||||
interface BalanceManagerFactory {
|
||||
fun create(): BalanceManager?
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.balance
|
||||
|
||||
import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap
|
||||
import java.util.*
|
||||
@@ -6,7 +6,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock
|
||||
import kotlin.concurrent.read
|
||||
import kotlin.concurrent.write
|
||||
import net.trueog.diamondbankog.DiamondBankException.InvalidArgumentException
|
||||
import net.trueog.diamondbankog.PostgreSQL.ShardType
|
||||
import net.trueog.diamondbankog.balance.shard.ShardType
|
||||
|
||||
internal class Cache {
|
||||
val bankBalanceCache = Object2LongOpenHashMap<UUID>().apply { defaultReturnValue(-1L) }
|
||||
+25
-22
@@ -1,14 +1,17 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.balance
|
||||
|
||||
import java.util.*
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
import java.util.concurrent.atomic.AtomicInteger
|
||||
import net.trueog.diamondbankog.DiamondBankException.EconomyDisabledException
|
||||
import net.trueog.diamondbankog.DiamondBankException.InvalidArgumentException
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.debug
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
|
||||
import net.trueog.diamondbankog.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.PostgreSQL.PlayerShards
|
||||
import net.trueog.diamondbankog.PostgreSQL.ShardType
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.plugin
|
||||
import net.trueog.diamondbankog.balance.shard.PlayerShards
|
||||
import net.trueog.diamondbankog.balance.shard.ShardType
|
||||
import net.trueog.diamondbankog.persistence.PostgreSQL
|
||||
import net.trueog.diamondbankog.util.ErrorHandler.handleError
|
||||
|
||||
internal class CachingBalanceManager private constructor() : BalanceManager {
|
||||
val cache = Cache()
|
||||
@@ -81,15 +84,15 @@ internal class CachingBalanceManager private constructor() : BalanceManager {
|
||||
|
||||
override suspend fun getShardTypeShards(uuid: UUID, type: ShardType): Result<Long> {
|
||||
if ((beingModified[uuid to type]?.get() ?: 0) > 0) {
|
||||
if (DiamondBankOG.debug) {
|
||||
DiamondBankOG.plugin.logger.info("Cache miss (being modified) for $uuid!")
|
||||
if (debug) {
|
||||
plugin.logger.info("Cache miss (being modified) for $uuid!")
|
||||
}
|
||||
return postgreSQL.getShardTypeShards(uuid, type)
|
||||
}
|
||||
val cacheBalance = cache.getBalance(uuid, type)
|
||||
if (cacheBalance == -1L) {
|
||||
if (DiamondBankOG.debug) {
|
||||
DiamondBankOG.plugin.logger.info("Cache miss for $uuid!")
|
||||
if (debug) {
|
||||
plugin.logger.info("Cache miss for $uuid!")
|
||||
}
|
||||
increment(uuid, type)
|
||||
val dbBalance =
|
||||
@@ -99,8 +102,8 @@ internal class CachingBalanceManager private constructor() : BalanceManager {
|
||||
cache.setBalance(uuid, dbBalance, type)
|
||||
decrement(uuid, type)
|
||||
return Result.success(dbBalance)
|
||||
} else if (DiamondBankOG.debug) {
|
||||
DiamondBankOG.plugin.logger.info("Cache hit for $uuid!")
|
||||
} else if (debug) {
|
||||
plugin.logger.info("Cache hit for $uuid!")
|
||||
}
|
||||
return Result.success(cacheBalance)
|
||||
}
|
||||
@@ -108,15 +111,15 @@ internal class CachingBalanceManager private constructor() : BalanceManager {
|
||||
override suspend fun getTotalShards(uuid: UUID): Result<Long> {
|
||||
val anyBeingModified = beingModified.any { it.key.first == uuid && it.value.get() > 0 }
|
||||
if (anyBeingModified) {
|
||||
if (DiamondBankOG.debug) {
|
||||
DiamondBankOG.plugin.logger.info("Cache miss (being modified) for $uuid!")
|
||||
if (debug) {
|
||||
plugin.logger.info("Cache miss (being modified) for $uuid!")
|
||||
}
|
||||
return postgreSQL.getTotalShards(uuid)
|
||||
}
|
||||
val cacheBalance = cache.getBalance(uuid, ShardType.TOTAL)
|
||||
if (cacheBalance == -1L) {
|
||||
if (DiamondBankOG.debug) {
|
||||
DiamondBankOG.plugin.logger.info("Cache miss for $uuid!")
|
||||
if (debug) {
|
||||
plugin.logger.info("Cache miss for $uuid!")
|
||||
}
|
||||
increment(uuid, ShardType.TOTAL)
|
||||
val dbBalance =
|
||||
@@ -126,8 +129,8 @@ internal class CachingBalanceManager private constructor() : BalanceManager {
|
||||
cache.setBalance(uuid, dbBalance, ShardType.TOTAL)
|
||||
decrement(uuid, ShardType.TOTAL)
|
||||
return Result.success(dbBalance)
|
||||
} else if (DiamondBankOG.debug) {
|
||||
DiamondBankOG.plugin.logger.info("Cache hit for $uuid!")
|
||||
} else if (debug) {
|
||||
plugin.logger.info("Cache hit for $uuid!")
|
||||
}
|
||||
return Result.success(cacheBalance)
|
||||
}
|
||||
@@ -135,8 +138,8 @@ internal class CachingBalanceManager private constructor() : BalanceManager {
|
||||
override suspend fun getAllShards(uuid: UUID): Result<PlayerShards> {
|
||||
val anyBeingModified = beingModified.any { it.key.first == uuid && it.value.get() > 0 }
|
||||
if (anyBeingModified) {
|
||||
if (DiamondBankOG.debug) {
|
||||
DiamondBankOG.plugin.logger.info("Cache miss (being modified) for $uuid!")
|
||||
if (debug) {
|
||||
plugin.logger.info("Cache miss (being modified) for $uuid!")
|
||||
}
|
||||
return postgreSQL.getAllShards(uuid)
|
||||
}
|
||||
@@ -144,8 +147,8 @@ internal class CachingBalanceManager private constructor() : BalanceManager {
|
||||
val cacheInventoryBalance = cache.getBalance(uuid, ShardType.INVENTORY)
|
||||
val cacheEnderChestBalance = cache.getBalance(uuid, ShardType.ENDER_CHEST)
|
||||
if (cacheBankBalance == -1L || cacheInventoryBalance == -1L || cacheEnderChestBalance == -1L) {
|
||||
if (DiamondBankOG.debug) {
|
||||
DiamondBankOG.plugin.logger.info("Cache miss for $uuid!")
|
||||
if (debug) {
|
||||
plugin.logger.info("Cache miss for $uuid!")
|
||||
}
|
||||
increment(uuid, ShardType.TOTAL)
|
||||
val dbPlayerShards =
|
||||
@@ -157,8 +160,8 @@ internal class CachingBalanceManager private constructor() : BalanceManager {
|
||||
cache.setBalance(uuid, dbPlayerShards.enderChest, ShardType.ENDER_CHEST)
|
||||
decrement(uuid, ShardType.TOTAL)
|
||||
return Result.success(dbPlayerShards)
|
||||
} else if (DiamondBankOG.debug) {
|
||||
DiamondBankOG.plugin.logger.info("Cache hit for $uuid!")
|
||||
} else if (debug) {
|
||||
plugin.logger.info("Cache hit for $uuid!")
|
||||
}
|
||||
return Result.success(PlayerShards(cacheBankBalance, cacheInventoryBalance, cacheEnderChestBalance))
|
||||
}
|
||||
+3
-3
@@ -1,15 +1,15 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog.balance.command
|
||||
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.launch
|
||||
import net.trueog.diamondbankog.CommonOperations
|
||||
import net.trueog.diamondbankog.DiamondBankOG
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.balanceManager
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.mm
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.scope
|
||||
import net.trueog.diamondbankog.PlayerPrefix.getPrefix
|
||||
import net.trueog.diamondbankog.transaction.CommonOperations
|
||||
import net.trueog.diamondbankog.util.PlayerPrefix.getPrefix
|
||||
import org.bukkit.command.Command
|
||||
import org.bukkit.command.CommandExecutor
|
||||
import org.bukkit.command.CommandSender
|
||||
+3
-3
@@ -1,16 +1,16 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog.balance.command
|
||||
|
||||
import kotlin.math.ceil
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.launch
|
||||
import net.trueog.diamondbankog.CommonOperations
|
||||
import net.trueog.diamondbankog.DiamondBankOG
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.balanceManager
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.mm
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.scope
|
||||
import net.trueog.diamondbankog.PlayerPrefix.getPrefix
|
||||
import net.trueog.diamondbankog.transaction.CommonOperations
|
||||
import net.trueog.diamondbankog.util.PlayerPrefix.getPrefix
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.OfflinePlayer
|
||||
import org.bukkit.command.Command
|
||||
+5
-5
@@ -1,17 +1,17 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog.balance.command
|
||||
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.launch
|
||||
import net.trueog.diamondbankog.CommonOperations
|
||||
import net.trueog.diamondbankog.DiamondBankOG
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.balanceManager
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.mm
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.scope
|
||||
import net.trueog.diamondbankog.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.PlayerPrefix.getPrefix
|
||||
import net.trueog.diamondbankog.PostgreSQL.ShardType
|
||||
import net.trueog.diamondbankog.balance.shard.ShardType
|
||||
import net.trueog.diamondbankog.transaction.CommonOperations
|
||||
import net.trueog.diamondbankog.util.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.util.PlayerPrefix.getPrefix
|
||||
import org.bukkit.command.Command
|
||||
import org.bukkit.command.CommandExecutor
|
||||
import org.bukkit.command.CommandSender
|
||||
@@ -0,0 +1,5 @@
|
||||
package net.trueog.diamondbankog.balance.shard
|
||||
|
||||
data class PlayerShards(val bank: Long, val inventory: Long, val enderChest: Long) {
|
||||
val total = bank + inventory + enderChest
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.balance.shard
|
||||
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.mm
|
||||
import org.bukkit.Bukkit
|
||||
@@ -0,0 +1,8 @@
|
||||
package net.trueog.diamondbankog.balance.shard
|
||||
|
||||
enum class ShardType(val string: String) {
|
||||
BANK("bank_shards"),
|
||||
INVENTORY("inventory_shards"),
|
||||
ENDER_CHEST("ender_chest_shards"),
|
||||
TOTAL("bank_shards, inventory_shards, ender_chest_shards"),
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package net.trueog.diamondbankog.config
|
||||
|
||||
interface Config {
|
||||
val prefix: String
|
||||
val postgresHost: String
|
||||
val postgresPort: Int
|
||||
val postgresDatabase: String
|
||||
val postgresUser: String
|
||||
val postgresPassword: String?
|
||||
val redisHost: String
|
||||
val redisPort: Int
|
||||
val redisDatabase: Int
|
||||
val redisPassword: String?
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.config
|
||||
|
||||
interface ConfigFactory {
|
||||
fun create(): Config?
|
||||
@@ -0,0 +1,75 @@
|
||||
package net.trueog.diamondbankog.config
|
||||
|
||||
import java.io.File
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.plugin
|
||||
import org.bukkit.configuration.file.YamlConfiguration
|
||||
|
||||
internal class YamlConfig
|
||||
private constructor(
|
||||
override val prefix: String,
|
||||
override val postgresHost: String,
|
||||
override val postgresPort: Int,
|
||||
override val postgresDatabase: String,
|
||||
override val postgresUser: String,
|
||||
override val postgresPassword: String?,
|
||||
override val redisHost: String,
|
||||
override val redisPort: Int,
|
||||
override val redisDatabase: Int,
|
||||
override val redisPassword: String?,
|
||||
) : Config {
|
||||
companion object : ConfigFactory {
|
||||
override fun create(): YamlConfig? {
|
||||
plugin.saveDefaultConfig()
|
||||
val file = File(plugin.dataFolder, "config.yml")
|
||||
val yamlConfig = YamlConfiguration.loadConfiguration(file)
|
||||
|
||||
val prefix = yamlConfig.parseKeyAs<String>("prefix")
|
||||
|
||||
val postgresHost = yamlConfig.parseKeyAs<String>("postgresHost")
|
||||
val postgresPort = yamlConfig.parseKeyAs<Int>("postgresPort")
|
||||
val postgresDatabase = yamlConfig.parseKeyAs<String>("postgresDatabase")
|
||||
val postgresUser = yamlConfig.parseKeyAs<String>("postgresUser")
|
||||
val postgresPassword = yamlConfig.parseKeyAs<String?>("postgresPassword")
|
||||
|
||||
val redisHost = yamlConfig.parseKeyAs<String>("redisHost")
|
||||
val redisPort = yamlConfig.parseKeyAs<Int>("redisPort")
|
||||
val redisDatabase = yamlConfig.parseKeyAs<Int>("redisDatabase")
|
||||
val redisPassword = yamlConfig.parseKeyAs<String?>("redisPassword")
|
||||
|
||||
if (
|
||||
prefix == null ||
|
||||
postgresHost == null ||
|
||||
postgresPort == null ||
|
||||
postgresDatabase == null ||
|
||||
postgresUser == null ||
|
||||
redisHost == null ||
|
||||
redisPort == null ||
|
||||
redisDatabase == null
|
||||
) {
|
||||
return null
|
||||
}
|
||||
|
||||
return YamlConfig(
|
||||
prefix,
|
||||
postgresHost,
|
||||
postgresPort,
|
||||
postgresDatabase,
|
||||
postgresUser,
|
||||
postgresPassword,
|
||||
redisHost,
|
||||
redisPort,
|
||||
redisDatabase,
|
||||
redisPassword,
|
||||
)
|
||||
}
|
||||
|
||||
inline fun <reified T> YamlConfiguration.parseKeyAs(key: String): T? {
|
||||
if (!this.contains(key) && null is T) return null
|
||||
return this.get(key) as? T
|
||||
?: run {
|
||||
plugin.logger.severe("Failed to parse config option \"$key\" as ${T::class.simpleName}")
|
||||
return null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -1,11 +1,11 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog.config.command
|
||||
|
||||
import net.trueog.diamondbankog.CachingBalanceManager
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.balanceManager
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.mm
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.plugin
|
||||
import net.trueog.diamondbankog.YamlConfig
|
||||
import net.trueog.diamondbankog.balance.CachingBalanceManager
|
||||
import net.trueog.diamondbankog.config.YamlConfig
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.command.Command
|
||||
import org.bukkit.command.CommandExecutor
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog.economy.command
|
||||
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog.economy.command
|
||||
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
|
||||
+16
-22
@@ -1,50 +1,48 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.persistence
|
||||
|
||||
import com.github.jasync.sql.db.asSuspending
|
||||
import com.github.jasync.sql.db.pool.ConnectionPool
|
||||
import com.github.jasync.sql.db.postgresql.PostgreSQLConnection
|
||||
import com.github.jasync.sql.db.postgresql.PostgreSQLConnectionBuilder
|
||||
import java.net.URI
|
||||
import java.util.*
|
||||
import kotlinx.coroutines.future.await
|
||||
import net.trueog.diamondbankog.DiamondBankException.*
|
||||
import net.trueog.diamondbankog.DiamondBankOG
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.balanceManager
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.plugin
|
||||
import net.trueog.diamondbankog.balance.shard.PlayerShards
|
||||
import net.trueog.diamondbankog.balance.shard.ShardType
|
||||
import org.flywaydb.core.Flyway
|
||||
import org.postgresql.ds.PGSimpleDataSource
|
||||
|
||||
class PostgreSQL private constructor() {
|
||||
internal class PostgreSQL private constructor() {
|
||||
lateinit var pool: ConnectionPool<PostgreSQLConnection>
|
||||
|
||||
class NoRowsException : Exception()
|
||||
|
||||
enum class ShardType(val string: String) {
|
||||
BANK("bank_shards"),
|
||||
INVENTORY("inventory_shards"),
|
||||
ENDER_CHEST("ender_chest_shards"),
|
||||
TOTAL("bank_shards, inventory_shards, ender_chest_shards"),
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun create(): PostgreSQL? {
|
||||
val postgreSQL = PostgreSQL()
|
||||
|
||||
try {
|
||||
val pg = PGSimpleDataSource()
|
||||
pg.setUrl(config.postgresUrl)
|
||||
pg.user = config.postgresUser
|
||||
pg.password = config.postgresPassword
|
||||
val pg =
|
||||
PGSimpleDataSource().apply {
|
||||
serverNames = arrayOf(config.postgresHost)
|
||||
portNumbers = intArrayOf(config.postgresPort)
|
||||
databaseName = config.postgresDatabase
|
||||
user = config.postgresUser
|
||||
password = config.postgresPassword
|
||||
}
|
||||
val flyway = Flyway.configure(DiamondBankOG::class.java.classLoader).dataSource(pg).load()
|
||||
flyway.migrate()
|
||||
|
||||
val uri = URI(config.postgresUrl.removePrefix("jdbc:"))
|
||||
postgreSQL.pool =
|
||||
PostgreSQLConnectionBuilder.createConnectionPool {
|
||||
host = uri.host
|
||||
port = uri.port
|
||||
database = uri.path.removePrefix("/")
|
||||
host = config.postgresHost
|
||||
port = config.postgresPort
|
||||
database = config.postgresDatabase
|
||||
username = config.postgresUser
|
||||
password = config.postgresPassword
|
||||
}
|
||||
@@ -60,10 +58,6 @@ class PostgreSQL private constructor() {
|
||||
}
|
||||
}
|
||||
|
||||
data class PlayerShards(val bank: Long, val inventory: Long, val enderChest: Long) {
|
||||
val total = bank + inventory + enderChest
|
||||
}
|
||||
|
||||
suspend fun setPlayerShards(uuid: UUID, shards: Long, type: ShardType): Result<Unit> {
|
||||
if (type == ShardType.TOTAL) return Result.failure(InvalidArgumentException())
|
||||
val playerShards: PlayerShards
|
||||
+9
-2
@@ -1,11 +1,18 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.persistence
|
||||
|
||||
import io.lettuce.core.RedisClient
|
||||
import io.lettuce.core.RedisConnectionException
|
||||
import io.lettuce.core.RedisURI
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.config
|
||||
|
||||
internal class Redis {
|
||||
private val redisClient: RedisClient = RedisClient.create(config.redisUrl)
|
||||
private val redisClient: RedisClient =
|
||||
RedisClient.create(
|
||||
RedisURI.Builder.redis(config.redisHost, config.redisPort)
|
||||
.apply { config.redisPassword?.let { withPassword(it) } }
|
||||
.withDatabase(config.redisDatabase)
|
||||
.build()
|
||||
)
|
||||
|
||||
/** @return True if failed */
|
||||
fun testConnection(): Boolean {
|
||||
+4
-1
@@ -1,10 +1,13 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.transaction
|
||||
|
||||
import java.util.*
|
||||
import kotlin.math.floor
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage
|
||||
import net.trueog.diamondbankog.DiamondBankException.InsufficientFundsException
|
||||
import net.trueog.diamondbankog.DiamondBankOG
|
||||
import net.trueog.diamondbankog.DiamondBankRuntimeException.MoreThanOneDecimalDigitRuntimeException
|
||||
import net.trueog.diamondbankog.balance.BalanceManager
|
||||
import net.trueog.diamondbankog.config.Config
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.OfflinePlayer
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package net.trueog.diamondbankog.transaction
|
||||
|
||||
import java.util.Collections
|
||||
import java.util.WeakHashMap
|
||||
import org.bukkit.inventory.PlayerInventory
|
||||
|
||||
object InventoryLockExtensions {
|
||||
val lockMap: MutableSet<PlayerInventory> = Collections.newSetFromMap(Collections.synchronizedMap(WeakHashMap()))
|
||||
|
||||
fun PlayerInventory.lock() {
|
||||
val added = lockMap.add(this)
|
||||
if (!added) throw IllegalStateException("Inventory was already locked")
|
||||
}
|
||||
|
||||
fun PlayerInventory.unlock() {
|
||||
val removed = lockMap.remove(this)
|
||||
if (!removed) throw IllegalStateException("Inventory was not locked")
|
||||
}
|
||||
|
||||
fun PlayerInventory.isLocked(): Boolean {
|
||||
return this in lockMap
|
||||
}
|
||||
}
|
||||
+6
-5
@@ -1,13 +1,14 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.transaction
|
||||
|
||||
import java.util.*
|
||||
import java.util.function.Consumer
|
||||
import kotlinx.coroutines.launch
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.scope
|
||||
import net.trueog.diamondbankog.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countTotal
|
||||
import net.trueog.diamondbankog.InventoryExtensions.isLocked
|
||||
import net.trueog.diamondbankog.PostgreSQL.ShardType
|
||||
import net.trueog.diamondbankog.balance.BalanceManager
|
||||
import net.trueog.diamondbankog.balance.shard.ShardType
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.isLocked
|
||||
import net.trueog.diamondbankog.util.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countTotal
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.inventory.Inventory
|
||||
+4
-1
@@ -1,7 +1,10 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.transaction
|
||||
|
||||
import kotlin.math.ceil
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage
|
||||
import net.trueog.diamondbankog.balance.BalanceManager
|
||||
import net.trueog.diamondbankog.balance.shard.Shard
|
||||
import net.trueog.diamondbankog.config.Config
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.inventory.ItemStack
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.transaction
|
||||
|
||||
import java.util.*
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
+13
-7
@@ -1,16 +1,22 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog.transaction.command
|
||||
|
||||
import kotlin.math.abs
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.launch
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage
|
||||
import net.trueog.diamondbankog.*
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countDiamondBlocks
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countDiamonds
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countShards
|
||||
import net.trueog.diamondbankog.InventoryExtensions.lock
|
||||
import net.trueog.diamondbankog.InventoryExtensions.unlock
|
||||
import net.trueog.diamondbankog.MainThreadBlock.runOnMainThread
|
||||
import net.trueog.diamondbankog.balance.BalanceManager
|
||||
import net.trueog.diamondbankog.balance.shard.Shard
|
||||
import net.trueog.diamondbankog.config.Config
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.lock
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.unlock
|
||||
import net.trueog.diamondbankog.transaction.InventorySnapshot
|
||||
import net.trueog.diamondbankog.transaction.TransactionLock
|
||||
import net.trueog.diamondbankog.util.CommonCommandInterlude
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countDiamondBlocks
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countDiamonds
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countShards
|
||||
import net.trueog.diamondbankog.util.MainThreadBlock.runOnMainThread
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.block.ShulkerBox
|
||||
import org.bukkit.command.Command
|
||||
+12
-5
@@ -1,14 +1,21 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog.transaction.command
|
||||
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.launch
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage
|
||||
import net.trueog.diamondbankog.*
|
||||
import net.trueog.diamondbankog.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.InventoryExtensions.lock
|
||||
import net.trueog.diamondbankog.InventoryExtensions.unlock
|
||||
import net.trueog.diamondbankog.MainThreadBlock.runOnMainThread
|
||||
import net.trueog.diamondbankog.balance.BalanceManager
|
||||
import net.trueog.diamondbankog.config.Config
|
||||
import net.trueog.diamondbankog.transaction.CommonOperations
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.lock
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.unlock
|
||||
import net.trueog.diamondbankog.transaction.InventorySnapshot
|
||||
import net.trueog.diamondbankog.transaction.InventorySnapshotUtils
|
||||
import net.trueog.diamondbankog.transaction.TransactionLock
|
||||
import net.trueog.diamondbankog.util.CommonCommandInterlude
|
||||
import net.trueog.diamondbankog.util.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.util.MainThreadBlock.runOnMainThread
|
||||
import org.bukkit.command.Command
|
||||
import org.bukkit.command.CommandExecutor
|
||||
import org.bukkit.command.CommandSender
|
||||
+12
-6
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog.transaction.command
|
||||
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
@@ -6,11 +6,17 @@ import kotlinx.coroutines.launch
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage
|
||||
import net.luckperms.api.LuckPerms
|
||||
import net.trueog.diamondbankog.*
|
||||
import net.trueog.diamondbankog.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.InventoryExtensions.lock
|
||||
import net.trueog.diamondbankog.InventoryExtensions.unlock
|
||||
import net.trueog.diamondbankog.MainThreadBlock.runOnMainThread
|
||||
import net.trueog.diamondbankog.PlayerPrefix.getPrefix
|
||||
import net.trueog.diamondbankog.balance.BalanceManager
|
||||
import net.trueog.diamondbankog.config.Config
|
||||
import net.trueog.diamondbankog.transaction.CommonOperations
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.lock
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.unlock
|
||||
import net.trueog.diamondbankog.transaction.InventorySnapshot
|
||||
import net.trueog.diamondbankog.transaction.TransactionLock
|
||||
import net.trueog.diamondbankog.util.CommonCommandInterlude
|
||||
import net.trueog.diamondbankog.util.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.util.MainThreadBlock.runOnMainThread
|
||||
import net.trueog.diamondbankog.util.PlayerPrefix.getPrefix
|
||||
import org.bukkit.command.Command
|
||||
import org.bukkit.command.CommandExecutor
|
||||
import org.bukkit.command.CommandSender
|
||||
+12
-5
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog.transaction.command
|
||||
|
||||
import kotlin.math.floor
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@@ -6,10 +6,17 @@ import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.launch
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage
|
||||
import net.trueog.diamondbankog.*
|
||||
import net.trueog.diamondbankog.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.InventoryExtensions.lock
|
||||
import net.trueog.diamondbankog.InventoryExtensions.unlock
|
||||
import net.trueog.diamondbankog.MainThreadBlock.runOnMainThread
|
||||
import net.trueog.diamondbankog.balance.BalanceManager
|
||||
import net.trueog.diamondbankog.balance.shard.Shard
|
||||
import net.trueog.diamondbankog.config.Config
|
||||
import net.trueog.diamondbankog.transaction.CommonOperations
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.lock
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.unlock
|
||||
import net.trueog.diamondbankog.transaction.InventorySnapshot
|
||||
import net.trueog.diamondbankog.transaction.TransactionLock
|
||||
import net.trueog.diamondbankog.util.CommonCommandInterlude
|
||||
import net.trueog.diamondbankog.util.ErrorHandler.handleError
|
||||
import net.trueog.diamondbankog.util.MainThreadBlock.runOnMainThread
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.command.Command
|
||||
import org.bukkit.command.CommandExecutor
|
||||
+2
-2
@@ -1,10 +1,10 @@
|
||||
package net.trueog.diamondbankog.commands
|
||||
package net.trueog.diamondbankog.util
|
||||
|
||||
import kotlin.contracts.ExperimentalContracts
|
||||
import kotlin.contracts.contract
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage
|
||||
import net.trueog.diamondbankog.Config
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
|
||||
import net.trueog.diamondbankog.config.Config
|
||||
import org.bukkit.command.CommandSender
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.util
|
||||
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
|
||||
|
||||
+2
-21
@@ -1,10 +1,9 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.util
|
||||
|
||||
import java.util.*
|
||||
import net.trueog.diamondbankog.balance.shard.Shard
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.block.ShulkerBox
|
||||
import org.bukkit.inventory.Inventory
|
||||
import org.bukkit.inventory.PlayerInventory
|
||||
import org.bukkit.inventory.meta.BlockStateMeta
|
||||
|
||||
internal object InventoryExtensions {
|
||||
@@ -32,22 +31,4 @@ internal object InventoryExtensions {
|
||||
val inventoryDiamondBlocks = this.all(Material.DIAMOND_BLOCK).values.sumOf { it.amount }
|
||||
return inventoryDiamondBlocks.toLong()
|
||||
}
|
||||
|
||||
val lockMap: MutableSet<PlayerInventory> = Collections.newSetFromMap(Collections.synchronizedMap(WeakHashMap()))
|
||||
|
||||
fun PlayerInventory.lock(): Boolean {
|
||||
val added = lockMap.add(this)
|
||||
if (!added) throw IllegalStateException("Inventory was already locked")
|
||||
return true
|
||||
}
|
||||
|
||||
fun PlayerInventory.unlock(): Boolean {
|
||||
val removed = lockMap.remove(this)
|
||||
if (!removed) throw IllegalStateException("Inventory was not locked")
|
||||
return true
|
||||
}
|
||||
|
||||
fun PlayerInventory.isLocked(): Boolean {
|
||||
return this in lockMap
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -1,9 +1,10 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.util
|
||||
|
||||
import kotlin.coroutines.resume
|
||||
import kotlin.coroutines.resumeWithException
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||
import net.trueog.diamondbankog.DiamondBankOG.Companion.plugin
|
||||
import org.bukkit.Bukkit
|
||||
|
||||
internal object MainThreadBlock {
|
||||
@@ -15,7 +16,7 @@ internal object MainThreadBlock {
|
||||
suspendCancellableCoroutine { cont ->
|
||||
Bukkit.getScheduler()
|
||||
.runTask(
|
||||
DiamondBankOG.plugin,
|
||||
plugin,
|
||||
Runnable {
|
||||
try {
|
||||
cont.resume(block())
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
package net.trueog.diamondbankog
|
||||
package net.trueog.diamondbankog.util
|
||||
|
||||
import java.util.*
|
||||
import java.util.UUID
|
||||
import kotlinx.coroutines.future.await
|
||||
import net.luckperms.api.LuckPerms
|
||||
|
||||
@@ -2,11 +2,15 @@
|
||||
# MiniMessage-formatted prefix (https://docs.advntr.dev/minimessage/format.html)
|
||||
prefix: <gray>[<aqua>DiamondBank<white>-<red>OG<gray>]
|
||||
|
||||
# ---Postgres---
|
||||
postgresUrl: jdbc:postgresql://localhost:5432/diamond
|
||||
# ---PostgreSQL---
|
||||
postgresHost: localhost
|
||||
postgresPort: 5432
|
||||
postgresDatabase: diamond
|
||||
postgresUser: ^{DIAMONDBANKOG_POSTGRES_USER}
|
||||
postgresPassword: ^{DIAMONDBANKOG_POSTGRES_PASSWORD}
|
||||
|
||||
# ---Redis-compatible URI---
|
||||
# According to https://redis.github.io/lettuce/user-guide/connecting-redis/#uri-syntax
|
||||
redisUrl: redis://^{KEYDB_PASSWORD}@127.0.0.1:6379/0
|
||||
# ---Redis(-compatible) key value store---
|
||||
redisHost: 127.0.0.1
|
||||
redisPort: 6379
|
||||
redisDatabase: 0
|
||||
redisPassword: ^{KEYDB_PASSWORD}
|
||||
@@ -18,13 +18,18 @@ import kotlinx.coroutines.test.runTest
|
||||
import net.kyori.adventure.text.Component
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage
|
||||
import net.trueog.diamondbankog.Constants.playerUuid
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countDiamondBlocks
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countDiamonds
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countShards
|
||||
import net.trueog.diamondbankog.InventoryExtensions.isLocked
|
||||
import net.trueog.diamondbankog.Utils.mockPlayerInventory
|
||||
import net.trueog.diamondbankog.Utils.waitForCoroutines
|
||||
import net.trueog.diamondbankog.commands.Compress
|
||||
import net.trueog.diamondbankog.balance.BalanceManager
|
||||
import net.trueog.diamondbankog.balance.shard.Shard
|
||||
import net.trueog.diamondbankog.balance.shard.ShardType
|
||||
import net.trueog.diamondbankog.config.Config
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.isLocked
|
||||
import net.trueog.diamondbankog.transaction.TransactionLock
|
||||
import net.trueog.diamondbankog.transaction.command.Compress
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countDiamondBlocks
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countDiamonds
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countShards
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.Server
|
||||
@@ -77,8 +82,7 @@ class CompressTest {
|
||||
|
||||
every { player.sendMessage(any<Component>()) } just Runs
|
||||
|
||||
coEvery { balanceManager.setPlayerShards(any(), any(), PostgreSQL.ShardType.INVENTORY) } returns
|
||||
Result.success(Unit)
|
||||
coEvery { balanceManager.setPlayerShards(any(), any(), ShardType.INVENTORY) } returns Result.success(Unit)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
@@ -12,13 +12,18 @@ import kotlinx.coroutines.test.runTest
|
||||
import net.kyori.adventure.text.Component
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage
|
||||
import net.trueog.diamondbankog.Constants.playerUuid
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countDiamondBlocks
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countDiamonds
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countShards
|
||||
import net.trueog.diamondbankog.InventoryExtensions.isLocked
|
||||
import net.trueog.diamondbankog.Utils.mockPlayerInventory
|
||||
import net.trueog.diamondbankog.Utils.waitForCoroutines
|
||||
import net.trueog.diamondbankog.commands.Deposit
|
||||
import net.trueog.diamondbankog.balance.BalanceManager
|
||||
import net.trueog.diamondbankog.balance.shard.Shard
|
||||
import net.trueog.diamondbankog.balance.shard.ShardType
|
||||
import net.trueog.diamondbankog.config.Config
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.isLocked
|
||||
import net.trueog.diamondbankog.transaction.TransactionLock
|
||||
import net.trueog.diamondbankog.transaction.command.Deposit
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countDiamondBlocks
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countDiamonds
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countShards
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.Server
|
||||
@@ -65,8 +70,7 @@ class DepositTest {
|
||||
every { server.getPlayer(playerUuid) } returns player
|
||||
|
||||
coEvery { balanceManager.addToBankShards(any(), any()) } returns Result.success(Unit)
|
||||
coEvery { balanceManager.setPlayerShards(any(), any(), PostgreSQL.ShardType.INVENTORY) } returns
|
||||
Result.success(Unit)
|
||||
coEvery { balanceManager.setPlayerShards(any(), any(), ShardType.INVENTORY) } returns Result.success(Unit)
|
||||
coEvery { balanceManager.insertTransactionLog(any(), any(), any(), any(), any()) } returns Result.success(Unit)
|
||||
every { player.sendMessage(any<Component>()) } just Runs
|
||||
}
|
||||
|
||||
@@ -17,14 +17,19 @@ import net.luckperms.api.model.user.User
|
||||
import net.luckperms.api.node.Node
|
||||
import net.trueog.diamondbankog.Constants.otherPlayerUuid
|
||||
import net.trueog.diamondbankog.Constants.playerUuid
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countDiamondBlocks
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countDiamonds
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countShards
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countTotal
|
||||
import net.trueog.diamondbankog.InventoryExtensions.isLocked
|
||||
import net.trueog.diamondbankog.Utils.mockPlayerInventory
|
||||
import net.trueog.diamondbankog.Utils.waitForCoroutines
|
||||
import net.trueog.diamondbankog.commands.Pay
|
||||
import net.trueog.diamondbankog.balance.BalanceManager
|
||||
import net.trueog.diamondbankog.balance.shard.Shard
|
||||
import net.trueog.diamondbankog.balance.shard.ShardType
|
||||
import net.trueog.diamondbankog.config.Config
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.isLocked
|
||||
import net.trueog.diamondbankog.transaction.TransactionLock
|
||||
import net.trueog.diamondbankog.transaction.command.Pay
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countDiamondBlocks
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countDiamonds
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countShards
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countTotal
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.Server
|
||||
@@ -86,8 +91,7 @@ class PayTest {
|
||||
|
||||
every { otherPlayer.hasPlayedBefore() } returns true
|
||||
coEvery { balanceManager.addToBankShards(any(), any()) } returns Result.success(Unit)
|
||||
coEvery { balanceManager.setPlayerShards(any(), any(), PostgreSQL.ShardType.INVENTORY) } returns
|
||||
Result.success(Unit)
|
||||
coEvery { balanceManager.setPlayerShards(any(), any(), ShardType.INVENTORY) } returns Result.success(Unit)
|
||||
coEvery { balanceManager.subtractFromBankShards(any(), any()) } returns Result.success(Unit)
|
||||
coEvery { balanceManager.insertTransactionLog(any(), any(), any(), any(), any()) } returns Result.success(Unit)
|
||||
|
||||
|
||||
@@ -12,13 +12,17 @@ import kotlinx.coroutines.test.runTest
|
||||
import net.kyori.adventure.text.Component
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage
|
||||
import net.trueog.diamondbankog.Constants.playerUuid
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countDiamonds
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countShards
|
||||
import net.trueog.diamondbankog.InventoryExtensions.countTotal
|
||||
import net.trueog.diamondbankog.InventoryExtensions.isLocked
|
||||
import net.trueog.diamondbankog.Utils.mockPlayerInventory
|
||||
import net.trueog.diamondbankog.Utils.waitForCoroutines
|
||||
import net.trueog.diamondbankog.commands.Withdraw
|
||||
import net.trueog.diamondbankog.balance.BalanceManager
|
||||
import net.trueog.diamondbankog.balance.shard.ShardType
|
||||
import net.trueog.diamondbankog.config.Config
|
||||
import net.trueog.diamondbankog.transaction.InventoryLockExtensions.isLocked
|
||||
import net.trueog.diamondbankog.transaction.TransactionLock
|
||||
import net.trueog.diamondbankog.transaction.command.Withdraw
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countDiamonds
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countShards
|
||||
import net.trueog.diamondbankog.util.InventoryExtensions.countTotal
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.Server
|
||||
@@ -61,8 +65,7 @@ class WithdrawTest {
|
||||
every { server.getPlayer("player") } returns player
|
||||
|
||||
coEvery { balanceManager.addToBankShards(any(), any()) } returns Result.success(Unit)
|
||||
coEvery { balanceManager.setPlayerShards(any(), any(), PostgreSQL.ShardType.INVENTORY) } returns
|
||||
Result.success(Unit)
|
||||
coEvery { balanceManager.setPlayerShards(any(), any(), ShardType.INVENTORY) } returns Result.success(Unit)
|
||||
coEvery { balanceManager.subtractFromBankShards(any(), any()) } returns Result.success(Unit)
|
||||
coEvery { balanceManager.insertTransactionLog(any(), any(), any(), any(), any()) } returns Result.success(Unit)
|
||||
every { player.sendMessage(any<Component>()) } just Runs
|
||||
|
||||
Reference in new issue
Block a user