Restructuring, split URL config value for PostgreSQL and Redis into specific config values, and other config improvements #39

Merged
SKBotNL merged 7 commits from master into master 2026-04-06 16:00:39 -04:00
54 changed files with 407 additions and 290 deletions

No files matched your search

+2 -2
View File
@@ -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,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,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)
@@ -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,4 +1,4 @@
package net.trueog.diamondbankog
package net.trueog.diamondbankog.api
interface PlayerBalanceChangedListener {
fun onUpdate(event: PlayerBalanceChangedEvent)
@@ -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,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
@@ -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,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
@@ -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,4 +1,4 @@
package net.trueog.diamondbankog
package net.trueog.diamondbankog.balance
interface BalanceManagerFactory {
fun create(): BalanceManager?
@@ -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) }
@@ -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))
}
@@ -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
@@ -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
@@ -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,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,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
}
}
}
}
@@ -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,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,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,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
@@ -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 {
@@ -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
}
}
@@ -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
@@ -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,4 +1,4 @@
package net.trueog.diamondbankog
package net.trueog.diamondbankog.transaction
import java.util.*
import java.util.concurrent.ConcurrentHashMap
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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,4 +1,4 @@
package net.trueog.diamondbankog
package net.trueog.diamondbankog.util
import net.trueog.diamondbankog.DiamondBankOG.Companion.economyDisabled
@@ -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
}
}
@@ -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())
@@ -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
+9 -5
View File
@@ -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