MDRanks/src/main/kotlin/pw/hamzantal/mdranks/Configs.kt

255 lines
7.6 KiB
Kotlin

package pw.hamzantal.mdranks
import hazae41.minecraft.kutils.bukkit.ConfigFile
import hazae41.minecraft.kutils.bukkit.keys
import hazae41.minecraft.kutils.get
import org.bukkit.ChatColor
import org.bukkit.configuration.ConfigurationSection
import org.bukkit.entity.Player
import pw.hamzantal.mdranks.api.Perms
import pw.hamzantal.mdranks.api.RankType
import pw.hamzantal.mdranks.api.Vault
import kotlin.math.floor
import kotlin.random.Random
import kotlin.random.nextInt
object Config : ConfigFile(MDRanks.pl.dataFolder["config.yml"]) {
val codes = listOf(
7 to "S",
6 to "Q",
5 to "q",
4 to "T",
3 to "B",
2 to "M",
1 to "K"
)
fun formatC(amount: Number): String {
var base: Number = amount.toLong()
var exponent = 0
while (base.toLong() > 1000) {
base = if (base.toLong() < 1_000_000) base.toDouble() / 1000
else base.toLong() / 1000
exponent++
}
val (_, suffix) = codes.firstOrNull { it.first <= exponent } ?: 0 to ""
return config.getString("currencyFormat").replace("%amt%", "${floor(base.toDouble() * 10.0) / 10}$suffix")
}
fun wBrcks(msg: String): String {
return config.getString("bracketformat", "&7[%display%&7]").replace("%display%", msg).c
}
val defaultPrestige by string("default_prestige")
val defaultRebirth by string("default_rebirth")
}
object Ranks : ConfigFile(MDRanks.pl.dataFolder["ranks.yml"]) {
init {
autoSave = true
minDelay = 1000
}
data class PlayerRank(val name: String, val regular: Int, val prestige: Int, val rebirth: Int)
private const val cacheTime = 1000 * 60 * 5 //calculate top every 5 mins
private var nextCalculate = 0L
private var topCache = listOf<PlayerRank>()
val top: List<PlayerRank> get() {
if (nextCalculate < System.currentTimeMillis()) {
topCache = config.keys.map {
PlayerRank(
config.getString("$it.name"),
config.getInt("$it.regular"),
config.getInt("$it.prestige"),
config.getInt("$it.rebirth")
)
}.sortedWith(compareBy(PlayerRank::rebirth, PlayerRank::prestige, PlayerRank::regular))
.reversed()
.take(10)
nextCalculate = System.currentTimeMillis() + cacheTime
}
return topCache
}
operator fun set(p: Player, path: String, value: Int) {
this["${p.uniqueId}.$path"] = value
this["${p.uniqueId}.name"] = p.name
}
}
val String.wBrackets: String get() = Config.wBrcks(this)
open class RankData(
val level: Int,
val isLast: Boolean,
val display: String,
val cost: Double,
val commandsOnUpgrade: List<String>,
val broadcast: List<String>,
val msg: List<String>,
val addPerms: List<String>,
val delPerms: List<String>,
val others: ConfigurationSection
) {
val randomCommandList: List<String>
get() {
val sec = others.getConfigurationSection("randomcmds") ?: return listOf()
val chancePair = sec.getKeys(false)
.map { sec.getInt("$it.chance") to sec.getStringList("$it.commands") }
val max = chancePair.sumBy { it.first }
val choice = Random.nextInt(1..max)
var total = 0
return chancePair.first {
total += it.first
total >= choice
}.second
}
fun cost(p: Player): Double {
var calcCost = cost.toDouble()
calcCost *= 1 + (RegularConfig(Perms.reg(p)).percentageIncrease / 100.0)
if (Perms.prestige(p) != 0)
calcCost *= 1 + (PrestigeConfig(Perms.prestige(p)).percentageIncrease / 100.0)
if (Perms.rebirth(p) != 0)
calcCost *= 1 + (RebirthConfig(Perms.rebirth(p)).percentageIncrease / 100.0)
return calcCost
}
val percentageIncrease: Double get() = others.getDouble("cost_percentage_increase", 0.0)
override fun toString() =
"RankData(level=$level, display='$display', cost=$cost, commandsOnUpgrade=$commandsOnUpgrade, broadcast=$broadcast, msg=$msg, addPerms=$addPerms, delPerms=$delPerms)"
}
abstract class PrisonConfig(fName: String) : ConfigFile(MDRanks.pl.dataFolder["$fName.yml"]) {
fun nextPcnt(p: Player, type: RankType): Double {
val current = this(p, type)
if (current?.isLast == true) return 0.0
val data = this(current?.level ?: 0 + 1)
return Vault.balance(p) / data.cost(p)
}
fun next(p: Player, type: RankType, block: RankData.() -> String): String {
val current = this(p, type)
if (current?.isLast == true) return when (type) {
RankType.REG -> "&euse /prestige!"
RankType.PRESTIGE -> "&euse /rebirth!"
RankType.REBIRTH -> "&eNo more rebirths!"
}
return this(current?.level ?: 0 + 1).block()
}
operator fun invoke(p: Player, type: RankType): RankData? {
val level = Perms.rankFor(p, type)
return if (level == 0) null
else this(level)
}
operator fun invoke(level: Int): RankData {
val sec = this.config.getConfigurationSection("$level") ?: run {
throw IllegalStateException("The specified level ($level) does not exist.")
}
val index = config.keys.indexOf("$level")
val last = index + 1 == config.keys.size
return RankData(
level,
last,
sec.getString("display", "").c,
sec.getDouble("cost", 0.0),
sec.getStringList("commands").c,
sec.getStringList("broadcast").c,
sec.getStringList("msg").c,
sec.getStringList("addpermission").c,
sec.getStringList("delpermission").c,
sec
)
}
fun max() = config.getKeys(false).last().toInt()
init {
val cFile = MDRanks.pl.dataFolder["$fName.yml"]
if (!cFile.exists()) {
cFile.createNewFile()
}
}
}
object RegularConfig : PrisonConfig("regular") {
init {
val cFile = MDRanks.pl.dataFolder["regular.yml"]
if (!cFile.exists()) {
cFile.createNewFile()
set("1.display", "&1A")
set("1.cost", 0)
set("1.addpermission", listOf("essentials.warp.1"))
set("2.display", "&2A")
set("2.cost", 25000)
set(
"2.commands",
listOf(
"[console] give %player% diamond 1",
"[op] say i am executing this command as an operator",
"[player] warp %rankup%"
)
)
set("2.broadcast", listOf("&7%player% &eranked up to &7%rankup%", "&7-----------------"))
set("2.msg", listOf("&9You got &b1 &bdiamond."))
set("2.randomcmds.1.chance", 70)
set("2.randomcmds.1.commands", listOf("[console] tell %player% this was executed 70% of the time"))
set("2.randomcmds.2.chance", 30)
set("2.randomcmds.2.commands", listOf("[console] tell %player% this was executed 30% of the time"))
set("2.addpermission", listOf("essentials.warp.2"))
set("2.delpermission", listOf("essentials.warp.1"))
}
}
}
object PrestigeConfig : PrisonConfig("prestige") {
init {
val cFile = MDRanks.pl.dataFolder["prestige.yml"]
if (!cFile.exists()) {
cFile.createNewFile()
set("1.display", "&1P1")
set("1.cost", 25000)
set("1.commands", listOf("[console] give %player% diamond 5"))
set("1.broadcast", listOf("&7%player% &eprestiged up to &7%rankup%", "&7-----------------"))
set("1.msg", listOf("&9You got &b5 &bdiamonds."))
set("1.cost_percentage_increase", 25)
set("2.display", "&2P2")
set("2.cost", 50000)
set("2.commands", listOf("[console] give %player% gold_ingot 10"))
set("2.broadcast", listOf("&7%player% &eprestiged up to &7%rankup%", "&7-----------------"))
set("2.msg", listOf("&9You got &b10 &6gold ingots."))
set("2.cost_percentage_increase", 30)
}
}
}
object RebirthConfig : PrisonConfig("rebirth") {
init {
val cFile = MDRanks.pl.dataFolder["rebirth.yml"]
if (!cFile.exists()) {
cFile.createNewFile()
set("1.display", "&1&lR1")
set("1.cost", 100000)
set("1.commands", listOf("[console] give %player% diamond 64"))
set("1.broadcast", listOf("&7&l%player% &e&lprestiged up to &7&l%rankup%", "&7-----------------"))
set("1.msg", listOf("&9You got &b5 &bdiamonds."))
set("1.cost_percentage_increase", 25)
set("1.cost_percentage_increase", 25)
}
}
}
val String.c: String get() = ChatColor.translateAlternateColorCodes('&', this)
val List<String>.c: List<String> get() = map { it.c }