From a043e0852f848ef7b0262724b948e000e6bac204 Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Sun, 19 Mar 2023 16:35:09 -0700 Subject: [PATCH] Implement common configuration loading mechanism. --- .../foundation/common/BaseFoundationPlugin.kt | 13 +++++++++++++ .../foundation/bifrost/FoundationBifrostPlugin.kt | 10 +++------- .../foundation/chaos/FoundationChaosPlugin.kt | 12 ++++-------- .../core/features/backup/BackupFeature.kt | 14 +++----------- .../core/features/gameplay/GameplayFeature.kt | 14 +++----------- .../core/features/player/PlayerFeature.kt | 14 +++----------- .../heimdall/plugin/FoundationHeimdallPlugin.kt | 10 +++------- .../{copyDefaultConfig.kt => Configuration.kt} | 14 +++++++++++++- .../tailscale/FoundationTailscalePlugin.kt | 10 +++------- 9 files changed, 48 insertions(+), 63 deletions(-) rename foundation-shared/src/main/kotlin/gay/pizza/foundation/shared/{copyDefaultConfig.kt => Configuration.kt} (73%) diff --git a/common-plugin/src/main/kotlin/gay/pizza/foundation/common/BaseFoundationPlugin.kt b/common-plugin/src/main/kotlin/gay/pizza/foundation/common/BaseFoundationPlugin.kt index 8037815..089891f 100644 --- a/common-plugin/src/main/kotlin/gay/pizza/foundation/common/BaseFoundationPlugin.kt +++ b/common-plugin/src/main/kotlin/gay/pizza/foundation/common/BaseFoundationPlugin.kt @@ -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 loadConfigurationWithDefault( + core: IFoundationCore, + deserializer: DeserializationStrategy, + name: String + ): T { + return loadConfigurationWithDefault( + slF4JLogger, deserializer, + core.pluginDataPath, name) + } } diff --git a/foundation-bifrost/src/main/kotlin/gay/pizza/foundation/bifrost/FoundationBifrostPlugin.kt b/foundation-bifrost/src/main/kotlin/gay/pizza/foundation/bifrost/FoundationBifrostPlugin.kt index 6e7cdbb..385e4e6 100644 --- a/foundation-bifrost/src/main/kotlin/gay/pizza/foundation/bifrost/FoundationBifrostPlugin.kt +++ b/foundation-bifrost/src/main/kotlin/gay/pizza/foundation/bifrost/FoundationBifrostPlugin.kt @@ -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( - 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.") diff --git a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/FoundationChaosPlugin.kt b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/FoundationChaosPlugin.kt index 4415eb3..f582082 100644 --- a/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/FoundationChaosPlugin.kt +++ b/foundation-chaos/src/main/kotlin/gay/pizza/foundation/chaos/FoundationChaosPlugin.kt @@ -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( - slF4JLogger, - foundation.pluginDataPath, - "chaos.yaml" + config = loadConfigurationWithDefault( + foundation, + ChaosConfig.serializer(), + "heimdall.yaml" ) - config = Yaml.default.decodeFromStream(ChaosConfig.serializer(), configPath.inputStream()) registerCommandExecutor("chaos", ChaosToggleCommand()) } } diff --git a/foundation-core/src/main/kotlin/gay/pizza/foundation/core/features/backup/BackupFeature.kt b/foundation-core/src/main/kotlin/gay/pizza/foundation/core/features/backup/BackupFeature.kt index c94552b..10aa7be 100644 --- a/foundation-core/src/main/kotlin/gay/pizza/foundation/core/features/backup/BackupFeature.kt +++ b/foundation-core/src/main/kotlin/gay/pizza/foundation/core/features/backup/BackupFeature.kt @@ -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() @@ -46,14 +42,10 @@ class BackupFeature : Feature() { override fun module() = module { single { - val configPath = copyDefaultConfig( - plugin.slF4JLogger, - plugin.pluginDataPath, - "backup.yaml", - ) - return@single Yaml.default.decodeFromStream( + plugin.loadConfigurationWithDefault( + plugin, BackupConfig.serializer(), - configPath.inputStream() + "backup.yaml" ) } single { diff --git a/foundation-core/src/main/kotlin/gay/pizza/foundation/core/features/gameplay/GameplayFeature.kt b/foundation-core/src/main/kotlin/gay/pizza/foundation/core/features/gameplay/GameplayFeature.kt index 6bcbecf..f47bb9e 100644 --- a/foundation-core/src/main/kotlin/gay/pizza/foundation/core/features/gameplay/GameplayFeature.kt +++ b/foundation-core/src/main/kotlin/gay/pizza/foundation/core/features/gameplay/GameplayFeature.kt @@ -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() override fun module() = module { single { - val configPath = copyDefaultConfig( - plugin.slF4JLogger, - plugin.pluginDataPath, - "gameplay.yaml", - ) - return@single Yaml.default.decodeFromStream( + plugin.loadConfigurationWithDefault( + plugin, GameplayConfig.serializer(), - configPath.inputStream() + "gameplay.yaml" ) } } diff --git a/foundation-core/src/main/kotlin/gay/pizza/foundation/core/features/player/PlayerFeature.kt b/foundation-core/src/main/kotlin/gay/pizza/foundation/core/features/player/PlayerFeature.kt index 7481810..ce4509f 100644 --- a/foundation-core/src/main/kotlin/gay/pizza/foundation/core/features/player/PlayerFeature.kt +++ b/foundation-core/src/main/kotlin/gay/pizza/foundation/core/features/player/PlayerFeature.kt @@ -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() @@ -53,14 +49,10 @@ class PlayerFeature : Feature() { override fun module() = org.koin.dsl.module { single { - val configPath = copyDefaultConfig( - plugin.slF4JLogger, - plugin.pluginDataPath, - "player.yaml", - ) - return@single Yaml.default.decodeFromStream( + plugin.loadConfigurationWithDefault( + plugin, PlayerConfig.serializer(), - configPath.inputStream() + "player.yaml" ) } } diff --git a/foundation-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/plugin/FoundationHeimdallPlugin.kt b/foundation-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/plugin/FoundationHeimdallPlugin.kt index a96c8de..21354f4 100644 --- a/foundation-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/plugin/FoundationHeimdallPlugin.kt +++ b/foundation-heimdall/src/main/kotlin/gay/pizza/foundation/heimdall/plugin/FoundationHeimdallPlugin.kt @@ -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( - 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 diff --git a/foundation-shared/src/main/kotlin/gay/pizza/foundation/shared/copyDefaultConfig.kt b/foundation-shared/src/main/kotlin/gay/pizza/foundation/shared/Configuration.kt similarity index 73% rename from foundation-shared/src/main/kotlin/gay/pizza/foundation/shared/copyDefaultConfig.kt rename to foundation-shared/src/main/kotlin/gay/pizza/foundation/shared/Configuration.kt index 79aecfe..13cb9d9 100644 --- a/foundation-shared/src/main/kotlin/gay/pizza/foundation/shared/copyDefaultConfig.kt +++ b/foundation-shared/src/main/kotlin/gay/pizza/foundation/shared/Configuration.kt @@ -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 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 copyDefaultConfig(log: Logger, targetPath: Path, resource return outPath } + +inline fun loadConfigurationWithDefault( + log: Logger, + deserializer: DeserializationStrategy, + pluginConfigDirectoryPath: Path, + name: String +): T { + val path = copyDefaultConfig(log, pluginConfigDirectoryPath, name) + return Yaml.default.decodeFromStream(deserializer, path.inputStream()) +} diff --git a/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/FoundationTailscalePlugin.kt b/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/FoundationTailscalePlugin.kt index 4977946..faad3bc 100644 --- a/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/FoundationTailscalePlugin.kt +++ b/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/FoundationTailscalePlugin.kt @@ -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( - slF4JLogger, - foundation.pluginDataPath, + config = loadConfigurationWithDefault( + foundation, + TailscaleConfig.serializer(), "tailscale.yaml" ) - config = Yaml.default.decodeFromStream(TailscaleConfig.serializer(), configPath.inputStream()) controller = TailscaleController(server, config) controller.enable() }