Implement common configuration loading mechanism.

This commit is contained in:
Alex Zenla 2023-03-19 16:35:09 -07:00
parent 59fbea0a37
commit a043e0852f
Signed by: alex
GPG Key ID: C0780728420EBFE5
9 changed files with 48 additions and 63 deletions

View File

@ -1,5 +1,8 @@
package gay.pizza.foundation.common
import gay.pizza.foundation.shared.IFoundationCore
import gay.pizza.foundation.shared.loadConfigurationWithDefault
import kotlinx.serialization.DeserializationStrategy
import org.bukkit.command.CommandExecutor
import org.bukkit.command.TabCompleter
import org.bukkit.plugin.java.JavaPlugin
@ -18,4 +21,14 @@ abstract class BaseFoundationPlugin : JavaPlugin() {
}
}
}
inline fun <reified T> loadConfigurationWithDefault(
core: IFoundationCore,
deserializer: DeserializationStrategy<T>,
name: String
): T {
return loadConfigurationWithDefault(
slF4JLogger, deserializer,
core.pluginDataPath, name)
}
}

View File

@ -1,6 +1,5 @@
package gay.pizza.foundation.bifrost
import com.charleskorn.kaml.Yaml
import gay.pizza.foundation.bifrost.model.BifrostConfig
import gay.pizza.foundation.common.BaseFoundationPlugin
import gay.pizza.foundation.common.FoundationCoreLoader
@ -24,7 +23,6 @@ import org.bukkit.event.player.PlayerAdvancementDoneEvent
import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerQuitEvent
import java.awt.Color
import kotlin.io.path.inputStream
import net.dv8tion.jda.api.hooks.EventListener as DiscordEventListener
import org.bukkit.event.Listener as BukkitEventListener
@ -37,13 +35,11 @@ class FoundationBifrostPlugin : BaseFoundationPlugin(), DiscordEventListener, Bu
override fun onEnable() {
isDev = description.version == "DEV"
val foundation = FoundationCoreLoader.get(server)
val configPath = copyDefaultConfig<FoundationBifrostPlugin>(
slF4JLogger,
foundation.pluginDataPath,
config = loadConfigurationWithDefault(
foundation,
BifrostConfig.serializer(),
"bifrost.yaml"
)
config = Yaml.default.decodeFromStream(BifrostConfig.serializer(), configPath.inputStream())
server.pluginManager.registerEvents(this, this)
if (config.authentication.token.isEmpty()) {
slF4JLogger.warn("Token empty, Bifrost will not connect to Discord.")

View File

@ -1,12 +1,9 @@
package gay.pizza.foundation.chaos
import com.charleskorn.kaml.Yaml
import gay.pizza.foundation.chaos.model.ChaosConfig
import gay.pizza.foundation.common.BaseFoundationPlugin
import gay.pizza.foundation.common.FoundationCoreLoader
import gay.pizza.foundation.shared.PluginMainClass
import gay.pizza.foundation.shared.copyDefaultConfig
import kotlin.io.path.inputStream
@PluginMainClass
class FoundationChaosPlugin : BaseFoundationPlugin() {
@ -18,12 +15,11 @@ class FoundationChaosPlugin : BaseFoundationPlugin() {
override fun onEnable() {
val foundation = FoundationCoreLoader.get(server)
val configPath = copyDefaultConfig<FoundationChaosPlugin>(
slF4JLogger,
foundation.pluginDataPath,
"chaos.yaml"
config = loadConfigurationWithDefault(
foundation,
ChaosConfig.serializer(),
"heimdall.yaml"
)
config = Yaml.default.decodeFromStream(ChaosConfig.serializer(), configPath.inputStream())
registerCommandExecutor("chaos", ChaosToggleCommand())
}
}

View File

@ -1,11 +1,8 @@
package gay.pizza.foundation.core.features.backup
import com.charleskorn.kaml.Yaml
import gay.pizza.foundation.core.FoundationCorePlugin
import gay.pizza.foundation.core.abstraction.Feature
import gay.pizza.foundation.core.features.scheduler.cancel
import gay.pizza.foundation.core.features.scheduler.cron
import gay.pizza.foundation.shared.copyDefaultConfig
import org.koin.core.component.inject
import org.koin.dsl.module
import software.amazon.awssdk.auth.credentials.AwsSessionCredentials
@ -13,7 +10,6 @@ import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.s3.S3Client
import java.net.URI
import kotlin.io.path.inputStream
class BackupFeature : Feature() {
private val s3Client by inject<S3Client>()
@ -46,14 +42,10 @@ class BackupFeature : Feature() {
override fun module() = module {
single {
val configPath = copyDefaultConfig<FoundationCorePlugin>(
plugin.slF4JLogger,
plugin.pluginDataPath,
"backup.yaml",
)
return@single Yaml.default.decodeFromStream(
plugin.loadConfigurationWithDefault(
plugin,
BackupConfig.serializer(),
configPath.inputStream()
"backup.yaml"
)
}
single {

View File

@ -1,8 +1,5 @@
package gay.pizza.foundation.core.features.gameplay
import com.charleskorn.kaml.Yaml
import gay.pizza.foundation.shared.copyDefaultConfig
import gay.pizza.foundation.core.FoundationCorePlugin
import gay.pizza.foundation.core.abstraction.Feature
import org.bukkit.Bukkit
import org.bukkit.Material
@ -17,21 +14,16 @@ import org.bukkit.event.player.PlayerInteractEntityEvent
import org.bukkit.inventory.ItemStack
import org.koin.core.component.inject
import org.koin.dsl.module
import kotlin.io.path.inputStream
class GameplayFeature : Feature() {
private val config by inject<GameplayConfig>()
override fun module() = module {
single {
val configPath = copyDefaultConfig<FoundationCorePlugin>(
plugin.slF4JLogger,
plugin.pluginDataPath,
"gameplay.yaml",
)
return@single Yaml.default.decodeFromStream(
plugin.loadConfigurationWithDefault(
plugin,
GameplayConfig.serializer(),
configPath.inputStream()
"gameplay.yaml"
)
}
}

View File

@ -1,12 +1,9 @@
package gay.pizza.foundation.core.features.player
import com.charleskorn.kaml.Yaml
import com.google.common.cache.Cache
import com.google.common.cache.CacheBuilder
import com.google.common.cache.RemovalCause
import gay.pizza.foundation.core.FoundationCorePlugin
import gay.pizza.foundation.core.abstraction.Feature
import gay.pizza.foundation.shared.copyDefaultConfig
import net.kyori.adventure.text.Component
import org.bukkit.GameMode
import org.bukkit.event.EventHandler
@ -16,7 +13,6 @@ import org.bukkit.event.player.PlayerMoveEvent
import org.bukkit.event.player.PlayerQuitEvent
import org.koin.core.component.inject
import java.time.Duration
import kotlin.io.path.inputStream
class PlayerFeature : Feature() {
private val config by inject<PlayerConfig>()
@ -53,14 +49,10 @@ class PlayerFeature : Feature() {
override fun module() = org.koin.dsl.module {
single {
val configPath = copyDefaultConfig<FoundationCorePlugin>(
plugin.slF4JLogger,
plugin.pluginDataPath,
"player.yaml",
)
return@single Yaml.default.decodeFromStream(
plugin.loadConfigurationWithDefault(
plugin,
PlayerConfig.serializer(),
configPath.inputStream()
"player.yaml"
)
}
}

View File

@ -1,6 +1,5 @@
package gay.pizza.foundation.heimdall.plugin
import com.charleskorn.kaml.Yaml
import com.zaxxer.hikari.HikariConfig
import com.zaxxer.hikari.HikariDataSource
import gay.pizza.foundation.common.BaseFoundationPlugin
@ -13,12 +12,10 @@ import gay.pizza.foundation.heimdall.plugin.export.ExportAllChunksCommand
import gay.pizza.foundation.heimdall.plugin.load.ImportWorldLoadCommand
import gay.pizza.foundation.heimdall.plugin.model.HeimdallConfig
import gay.pizza.foundation.shared.PluginMainClass
import gay.pizza.foundation.shared.copyDefaultConfig
import org.bukkit.event.Listener
import org.jetbrains.exposed.sql.Database
import org.postgresql.Driver
import java.time.Duration
import kotlin.io.path.inputStream
@PluginMainClass
class FoundationHeimdallPlugin : BaseFoundationPlugin(), Listener {
@ -45,12 +42,11 @@ class FoundationHeimdallPlugin : BaseFoundationPlugin(), Listener {
importWorldLoadCommand.setExecutor(ImportWorldLoadCommand(this))
val foundation = FoundationCoreLoader.get(server)
val configPath = copyDefaultConfig<FoundationHeimdallPlugin>(
slF4JLogger,
foundation.pluginDataPath,
config = loadConfigurationWithDefault(
foundation,
HeimdallConfig.serializer(),
"heimdall.yaml"
)
config = Yaml.default.decodeFromStream(HeimdallConfig.serializer(), configPath.inputStream())
if (!config.enabled) {
slF4JLogger.info("Heimdall tracking is not enabled.")
return

View File

@ -1,7 +1,10 @@
package gay.pizza.foundation.shared
import com.charleskorn.kaml.Yaml
import kotlinx.serialization.DeserializationStrategy
import org.slf4j.Logger
import java.nio.file.Path
import kotlin.io.path.inputStream
/**
* Copy the default configuration from the resource [resourceName] into the directory [targetPath].
@ -20,7 +23,6 @@ inline fun <reified T> copyDefaultConfig(log: Logger, targetPath: Path, resource
val outPath = targetPath.resolve(resourceName)
val outFile = outPath.toFile()
if (outFile.exists()) {
log.debug("Configuration file already exists.")
return outPath
}
@ -37,3 +39,13 @@ inline fun <reified T> copyDefaultConfig(log: Logger, targetPath: Path, resource
return outPath
}
inline fun <reified T> loadConfigurationWithDefault(
log: Logger,
deserializer: DeserializationStrategy<T>,
pluginConfigDirectoryPath: Path,
name: String
): T {
val path = copyDefaultConfig<T>(log, pluginConfigDirectoryPath, name)
return Yaml.default.decodeFromStream(deserializer, path.inputStream())
}

View File

@ -1,11 +1,8 @@
package gay.pizza.foundation.tailscale
import com.charleskorn.kaml.Yaml
import gay.pizza.foundation.common.BaseFoundationPlugin
import gay.pizza.foundation.common.FoundationCoreLoader
import gay.pizza.foundation.shared.PluginMainClass
import gay.pizza.foundation.shared.copyDefaultConfig
import kotlin.io.path.inputStream
@PluginMainClass
class FoundationTailscalePlugin : BaseFoundationPlugin() {
@ -14,12 +11,11 @@ class FoundationTailscalePlugin : BaseFoundationPlugin() {
override fun onEnable() {
val foundation = FoundationCoreLoader.get(server)
val configPath = copyDefaultConfig<FoundationTailscalePlugin>(
slF4JLogger,
foundation.pluginDataPath,
config = loadConfigurationWithDefault(
foundation,
TailscaleConfig.serializer(),
"tailscale.yaml"
)
config = Yaml.default.decodeFromStream(TailscaleConfig.serializer(), configPath.inputStream())
controller = TailscaleController(server, config)
controller.enable()
}