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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,10 @@
package gay.pizza.foundation.shared package gay.pizza.foundation.shared
import com.charleskorn.kaml.Yaml
import kotlinx.serialization.DeserializationStrategy
import org.slf4j.Logger import org.slf4j.Logger
import java.nio.file.Path import java.nio.file.Path
import kotlin.io.path.inputStream
/** /**
* Copy the default configuration from the resource [resourceName] into the directory [targetPath]. * 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 outPath = targetPath.resolve(resourceName)
val outFile = outPath.toFile() val outFile = outPath.toFile()
if (outFile.exists()) { if (outFile.exists()) {
log.debug("Configuration file already exists.")
return outPath return outPath
} }
@ -37,3 +39,13 @@ inline fun <reified T> copyDefaultConfig(log: Logger, targetPath: Path, resource
return outPath 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 package gay.pizza.foundation.tailscale
import com.charleskorn.kaml.Yaml
import gay.pizza.foundation.common.BaseFoundationPlugin import gay.pizza.foundation.common.BaseFoundationPlugin
import gay.pizza.foundation.common.FoundationCoreLoader import gay.pizza.foundation.common.FoundationCoreLoader
import gay.pizza.foundation.shared.PluginMainClass import gay.pizza.foundation.shared.PluginMainClass
import gay.pizza.foundation.shared.copyDefaultConfig
import kotlin.io.path.inputStream
@PluginMainClass @PluginMainClass
class FoundationTailscalePlugin : BaseFoundationPlugin() { class FoundationTailscalePlugin : BaseFoundationPlugin() {
@ -14,12 +11,11 @@ class FoundationTailscalePlugin : BaseFoundationPlugin() {
override fun onEnable() { override fun onEnable() {
val foundation = FoundationCoreLoader.get(server) val foundation = FoundationCoreLoader.get(server)
val configPath = copyDefaultConfig<FoundationTailscalePlugin>( config = loadConfigurationWithDefault(
slF4JLogger, foundation,
foundation.pluginDataPath, TailscaleConfig.serializer(),
"tailscale.yaml" "tailscale.yaml"
) )
config = Yaml.default.decodeFromStream(TailscaleConfig.serializer(), configPath.inputStream())
controller = TailscaleController(server, config) controller = TailscaleController(server, config)
controller.enable() controller.enable()
} }