Allow partial config reloads

This commit is contained in:
kageru 2019-06-14 21:23:17 +02:00
parent 62bdb582de
commit 3d80540c03
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2
5 changed files with 39 additions and 30 deletions

View File

@ -9,39 +9,46 @@ import java.awt.Color
import kotlin.IllegalArgumentException
class Config(rawConfig: RawConfig) {
val system: SystemConfig
val localization: Localization
val commands: List<Command>
val features: Features
val system: SystemConfig = rawConfig.system?.let(::SystemConfig)
?: throw IllegalArgumentException("No [system] block in config.")
var localization: Localization = rawConfig.localization?.let(::Localization)
?: throw IllegalArgumentException("No [localization] block in config.")
var commands: List<Command> = rawConfig.commands?.map(::Command) ?: emptyList()
var features: Features = rawConfig.features?.let(::Features)
?: throw IllegalArgumentException("No [feature] block in config.")
init {
system = rawConfig.system?.let {
SystemConfig(
it.serverId ?: throw IllegalArgumentException("No [system.server] defined."),
Color.decode(it.color ?: "#1793d0")
)
} ?: throw IllegalArgumentException("No [system] block in config.")
Globals.server = api.getServerById(system.serverId).orElseThrow()
}
localization = rawConfig.localization?.let {
Localization(
permissionDenied = it.permissionDenied
?: throw IllegalArgumentException("No [localization.permissionDenied] defined"),
redirectedMessage = it.redirectedMessage
?: throw IllegalArgumentException("No [localization.permissionDenied] defined"),
messageDeleted = it.messageDeleted
?: throw IllegalArgumentException("No [localization.permissionDenied] defined")
)
} ?: throw IllegalArgumentException("No [localization] block in config.")
fun reloadLocalization(rawLocalization: RawLocalization) {
this.localization = Localization(rawLocalization)
}
commands = rawConfig.commands?.let { rawCommands ->
rawCommands.map { Command(it) }
} ?: emptyList()
fun reloadCommands(rawConfig: RawConfig) {
this.commands = rawConfig.commands?.map(::Command)
?: throw IllegalArgumentException("No commands found in config.")
}
features = rawConfig.features?.let { Features(it) }
?: throw IllegalArgumentException("No [feature] block in config.")
fun reloadFeatures(rawFeatures: RawFeatures) {
this.features = Features(rawFeatures)
}
}
class SystemConfig(val serverId: String, val color: Color)
class Localization(val permissionDenied: String, val redirectedMessage: String, val messageDeleted: String)
class SystemConfig(val serverId: String, val color: Color) {
constructor(rawSystemConfig: RawSystemConfig) : this(
rawSystemConfig.serverId ?: throw IllegalArgumentException("No [system.server] defined."),
Color.decode(rawSystemConfig.color ?: "#1793d0")
)
}
class Localization(val permissionDenied: String, val redirectedMessage: String, val messageDeleted: String) {
constructor(rawLocalization: RawLocalization) : this(
permissionDenied = rawLocalization.permissionDenied
?: throw IllegalArgumentException("No [localization.permissionDenied] defined"),
redirectedMessage = rawLocalization.redirectedMessage
?: throw IllegalArgumentException("No [localization.permissionDenied] defined"),
messageDeleted = rawLocalization.messageDeleted
?: throw IllegalArgumentException("No [localization.permissionDenied] defined")
)
}

View File

@ -13,6 +13,8 @@ class RawConfig(
companion object {
const val DEFAULT_CONFIG_PATH = "config.toml"
fun readFromString(tomlContent: String) = Toml().read(tomlContent).to(RawConfig::class.java)
fun read(path: String = DEFAULT_CONFIG_PATH): RawConfig {
val toml: Toml = Toml().read(run {
val file = File(path)

View File

@ -10,7 +10,6 @@ import moe.kageru.kagebot.TestUtil.embedToString
import moe.kageru.kagebot.TestUtil.messageableAuthor
import moe.kageru.kagebot.TestUtil.mockMessage
import moe.kageru.kagebot.TestUtil.testMessageSuccess
import moe.kageru.kagebot.config.RawConfig.Companion.config
import org.javacord.api.entity.message.embed.EmbedBuilder
class CommandTest : StringSpec({

View File

@ -42,8 +42,9 @@ object TestUtil {
}
fun prepareServerConfig(sentMessages: MutableList<EmbedBuilder> = mutableListOf()) {
val channelMock = mockk<ServerTextChannel>()
every { channelMock.sendMessage(capture(sentMessages)) } returns mockk()
val channelMock = mockk<ServerTextChannel> {
every { sendMessage(capture(sentMessages)) } returns mockk()
}
val resultMock = mockk<Optional<ServerTextChannel>>()
every { resultMock.isPresent } returns true
every { resultMock.get() } returns channelMock

View File