From b0d34754696e9e3550faf5d50d5147946ad8becb Mon Sep 17 00:00:00 2001 From: kageru Date: Sun, 14 Jul 2019 17:14:23 +0200 Subject: [PATCH] Add getConfig feature to retrieve the current config file This implements #11 and is preparation for config reloading at runtime --- .../moe/kageru/kagebot/config/ConfigParser.kt | 3 +++ .../moe/kageru/kagebot/config/RawConfig.kt | 2 +- .../moe/kageru/kagebot/features/Features.kt | 17 ++++++++++--- .../kagebot/features/GetConfigFeature.kt | 13 ++++++++++ src/main/resources/config.toml | 4 ++++ .../kotlin/moe/kageru/kagebot/TestUtil.kt | 3 +++ .../kagebot/features/ConfigFeatureTest.kt | 24 +++++++++++++++++++ 7 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/moe/kageru/kagebot/features/GetConfigFeature.kt create mode 100644 src/test/kotlin/moe/kageru/kagebot/features/ConfigFeatureTest.kt diff --git a/src/main/kotlin/moe/kageru/kagebot/config/ConfigParser.kt b/src/main/kotlin/moe/kageru/kagebot/config/ConfigParser.kt index 85383de..cd0e8c1 100644 --- a/src/main/kotlin/moe/kageru/kagebot/config/ConfigParser.kt +++ b/src/main/kotlin/moe/kageru/kagebot/config/ConfigParser.kt @@ -4,8 +4,11 @@ import moe.kageru.kagebot.Globals import moe.kageru.kagebot.command.Command import moe.kageru.kagebot.features.Features import java.awt.Color +import java.io.File object ConfigParser { + val configFile: File = File(RawConfig.DEFAULT_CONFIG_PATH) + fun initialLoad(rawConfig: RawConfig) { val systemConfig = rawConfig.system?.let(::SystemConfig) ?: throw IllegalArgumentException("No [system] block in config.") diff --git a/src/main/kotlin/moe/kageru/kagebot/config/RawConfig.kt b/src/main/kotlin/moe/kageru/kagebot/config/RawConfig.kt index a32a9f7..403b6e0 100644 --- a/src/main/kotlin/moe/kageru/kagebot/config/RawConfig.kt +++ b/src/main/kotlin/moe/kageru/kagebot/config/RawConfig.kt @@ -13,7 +13,7 @@ class RawConfig( val features: RawFeatures? ) { companion object { - private const val DEFAULT_CONFIG_PATH = "config.toml" + const val DEFAULT_CONFIG_PATH = "config.toml" fun readFromString(tomlContent: String): RawConfig = Toml().read(tomlContent).to(RawConfig::class.java) diff --git a/src/main/kotlin/moe/kageru/kagebot/features/Features.kt b/src/main/kotlin/moe/kageru/kagebot/features/Features.kt index f0407e3..689df78 100644 --- a/src/main/kotlin/moe/kageru/kagebot/features/Features.kt +++ b/src/main/kotlin/moe/kageru/kagebot/features/Features.kt @@ -2,14 +2,25 @@ package moe.kageru.kagebot.features import moe.kageru.kagebot.config.RawFeatures -class Features(val welcome: WelcomeFeature?, debug: DebugFeature, help: HelpFeature) { +class Features( + val welcome: WelcomeFeature?, + debug: DebugFeature, + help: HelpFeature, + getConfig: GetConfigFeature +) { constructor(rawFeatures: RawFeatures) : this( rawFeatures.welcome?.let(::WelcomeFeature), DebugFeature(), - HelpFeature() + HelpFeature(), + GetConfigFeature() ) - private val featureMap = mapOf("help" to help, "debug" to debug, "welcome" to welcome) + private val featureMap = mapOf( + "help" to help, + "debug" to debug, + "welcome" to welcome, + "getConfig" to getConfig + ) fun findByString(feature: String) = featureMap[feature] } diff --git a/src/main/kotlin/moe/kageru/kagebot/features/GetConfigFeature.kt b/src/main/kotlin/moe/kageru/kagebot/features/GetConfigFeature.kt new file mode 100644 index 0000000..4e6e67f --- /dev/null +++ b/src/main/kotlin/moe/kageru/kagebot/features/GetConfigFeature.kt @@ -0,0 +1,13 @@ +package moe.kageru.kagebot.features + +import moe.kageru.kagebot.config.ConfigParser +import org.javacord.api.event.message.MessageCreateEvent + +/** + * Simple message handler to send the current config file via message attachment. + */ +class GetConfigFeature : MessageFeature() { + override fun handleInternal(message: MessageCreateEvent) { + message.channel.sendMessage(ConfigParser.configFile) + } +} diff --git a/src/main/resources/config.toml b/src/main/resources/config.toml index 534c9e5..1111ef7 100644 --- a/src/main/resources/config.toml +++ b/src/main/resources/config.toml @@ -106,3 +106,7 @@ feature = "welcome" [[command]] trigger = "!help" feature = "help" + +[[command]] +trigger = "!getConfig" +feature = "getConfig" diff --git a/src/test/kotlin/moe/kageru/kagebot/TestUtil.kt b/src/test/kotlin/moe/kageru/kagebot/TestUtil.kt index d1d9ab8..5f108cb 100644 --- a/src/test/kotlin/moe/kageru/kagebot/TestUtil.kt +++ b/src/test/kotlin/moe/kageru/kagebot/TestUtil.kt @@ -16,6 +16,7 @@ import org.javacord.api.entity.message.embed.EmbedBuilder import org.javacord.api.entity.user.User import org.javacord.api.event.message.MessageCreateEvent import org.javacord.core.entity.message.embed.EmbedBuilderDelegateImpl +import java.io.File import java.util.* object TestUtil { @@ -23,6 +24,7 @@ object TestUtil { content: String, replies: MutableList = mutableListOf(), replyEmbeds: MutableList = mutableListOf(), + files: MutableList = mutableListOf(), isBot: Boolean = false ): MessageCreateEvent { return mockk { @@ -30,6 +32,7 @@ object TestUtil { every { readableMessageContent } returns content every { channel.sendMessage(capture(replies)) } returns mockk() every { channel.sendMessage(capture(replyEmbeds)) } returns mockk() + every { channel.sendMessage(capture(files)) } returns mockk() every { message.canYouDelete() } returns true every { isPrivateMessage } returns false // We can’t use a nested mock here because other fields of messageAuthor might diff --git a/src/test/kotlin/moe/kageru/kagebot/features/ConfigFeatureTest.kt b/src/test/kotlin/moe/kageru/kagebot/features/ConfigFeatureTest.kt new file mode 100644 index 0000000..b880afd --- /dev/null +++ b/src/test/kotlin/moe/kageru/kagebot/features/ConfigFeatureTest.kt @@ -0,0 +1,24 @@ +package moe.kageru.kagebot.features + +import io.kotlintest.shouldBe +import io.kotlintest.specs.ShouldSpec +import moe.kageru.kagebot.Kagebot +import moe.kageru.kagebot.TestUtil +import moe.kageru.kagebot.TestUtil.mockMessage +import moe.kageru.kagebot.TestUtil.withCommands +import java.io.File + +class ConfigFeatureTest : ShouldSpec({ + TestUtil.prepareTestEnvironment() + "getConfig should sent message with attachment" { + withCommands(""" + [[command]] + trigger = "!getConfig" + feature = "getConfig" + """.trimIndent()) { + val calls = mutableListOf() + Kagebot.processMessage(mockMessage("!getConfig", files = calls)) + calls.size shouldBe 1 + } + } +})