From 39ceaffa6c341fafd1aa3cadda3585ba679e9442 Mon Sep 17 00:00:00 2001 From: kageru Date: Wed, 17 Jul 2019 23:42:12 +0200 Subject: [PATCH] Pull event handling into interface --- src/main/kotlin/moe/kageru/kagebot/Kagebot.kt | 22 ++--------------- .../kageru/kagebot/features/DebugFeature.kt | 4 ++-- .../kageru/kagebot/features/FeatureTypes.kt | 12 ++++++++++ .../moe/kageru/kagebot/features/Features.kt | 2 ++ .../kagebot/features/GetConfigFeature.kt | 4 ++-- .../kageru/kagebot/features/HelpFeature.kt | 4 ++-- .../kageru/kagebot/features/MessageFeature.kt | 11 --------- .../kagebot/features/SetConfigFeature.kt | 4 ++-- .../kageru/kagebot/features/WelcomeFeature.kt | 24 +++++++++++++++++-- .../kotlin/moe/kageru/kagebot/ConfigTest.kt | 1 + .../kagebot/features/WelcomeFeatureTest.kt | 8 +++---- 11 files changed, 51 insertions(+), 45 deletions(-) create mode 100644 src/main/kotlin/moe/kageru/kagebot/features/FeatureTypes.kt delete mode 100644 src/main/kotlin/moe/kageru/kagebot/features/MessageFeature.kt diff --git a/src/main/kotlin/moe/kageru/kagebot/Kagebot.kt b/src/main/kotlin/moe/kageru/kagebot/Kagebot.kt index c652c36..86b29d1 100644 --- a/src/main/kotlin/moe/kageru/kagebot/Kagebot.kt +++ b/src/main/kotlin/moe/kageru/kagebot/Kagebot.kt @@ -1,13 +1,11 @@ package moe.kageru.kagebot import moe.kageru.kagebot.Util.checked -import moe.kageru.kagebot.Util.failed import moe.kageru.kagebot.config.Config import moe.kageru.kagebot.config.ConfigParser import moe.kageru.kagebot.config.RawConfig import org.javacord.api.DiscordApiBuilder import org.javacord.api.event.message.MessageCreateEvent -import org.javacord.api.event.server.member.ServerMemberJoinEvent import java.io.File import kotlin.system.exitProcess @@ -17,7 +15,7 @@ fun main() { object Kagebot { fun MessageCreateEvent.process() { - if (messageAuthor.isBotUser) { + if (messageAuthor.isBotUser) { if (messageAuthor.isYourself) { val loggedMessage = if (readableMessageContent.isBlank()) "[embed]" else readableMessageContent @@ -33,18 +31,6 @@ object Kagebot { } } - fun welcomeUser(event: ServerMemberJoinEvent) { - Config.features.welcome!!.run { - val message = event.user.sendMessage(embed) - // If the user disabled direct messages, try the fallback (if defined) - if (message.failed() && hasFallback()) { - fallbackChannel!!.sendMessage( - fallbackMessage!!.replace("@@", MessageUtil.mention(event.user)) - ) - } - } - } - private fun getSecret() = File("secret").readText().trim() fun init() { @@ -61,10 +47,6 @@ object Kagebot { }) Log.info("kagebot Mk II running") Globals.api.addMessageCreateListener { checked { it.process() } } - Config.features.welcome?.let { - Globals.api.addServerMemberJoinListener { - checked { welcomeUser(it) } - } - } + Config.features.eventFeatures().forEach { it.register(Globals.api) } } } diff --git a/src/main/kotlin/moe/kageru/kagebot/features/DebugFeature.kt b/src/main/kotlin/moe/kageru/kagebot/features/DebugFeature.kt index 39fd954..c69a967 100644 --- a/src/main/kotlin/moe/kageru/kagebot/features/DebugFeature.kt +++ b/src/main/kotlin/moe/kageru/kagebot/features/DebugFeature.kt @@ -9,9 +9,9 @@ import java.lang.management.ManagementFactory import java.time.Duration import java.time.temporal.ChronoUnit -class DebugFeature : MessageFeature() { +class DebugFeature : MessageFeature { - override fun handleInternal(message: MessageCreateEvent) { + override fun handle(message: MessageCreateEvent) { if (message.messageAuthor.isBotOwner) { MessageUtil.sendEmbed(message.channel, getPerformanceStats()) } diff --git a/src/main/kotlin/moe/kageru/kagebot/features/FeatureTypes.kt b/src/main/kotlin/moe/kageru/kagebot/features/FeatureTypes.kt new file mode 100644 index 0000000..e21903a --- /dev/null +++ b/src/main/kotlin/moe/kageru/kagebot/features/FeatureTypes.kt @@ -0,0 +1,12 @@ +package moe.kageru.kagebot.features + +import org.javacord.api.DiscordApi +import org.javacord.api.event.message.MessageCreateEvent + +interface MessageFeature { + fun handle(message: MessageCreateEvent) +} + +interface EventFeature { + fun register(api: DiscordApi) +} \ No newline at end of file diff --git a/src/main/kotlin/moe/kageru/kagebot/features/Features.kt b/src/main/kotlin/moe/kageru/kagebot/features/Features.kt index 029e86f..5c75fa1 100644 --- a/src/main/kotlin/moe/kageru/kagebot/features/Features.kt +++ b/src/main/kotlin/moe/kageru/kagebot/features/Features.kt @@ -17,6 +17,7 @@ class Features( SetConfigFeature() ) + private val all = listOf(welcome, debug, help, getConfig, setConfig) private val featureMap = mapOf( "help" to help, "debug" to debug, @@ -26,4 +27,5 @@ class Features( ) fun findByString(feature: String) = featureMap[feature] + fun eventFeatures() = all.filterIsInstance() } diff --git a/src/main/kotlin/moe/kageru/kagebot/features/GetConfigFeature.kt b/src/main/kotlin/moe/kageru/kagebot/features/GetConfigFeature.kt index 4e6e67f..2621aaa 100644 --- a/src/main/kotlin/moe/kageru/kagebot/features/GetConfigFeature.kt +++ b/src/main/kotlin/moe/kageru/kagebot/features/GetConfigFeature.kt @@ -6,8 +6,8 @@ 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) { +class GetConfigFeature : MessageFeature { + override fun handle(message: MessageCreateEvent) { message.channel.sendMessage(ConfigParser.configFile) } } diff --git a/src/main/kotlin/moe/kageru/kagebot/features/HelpFeature.kt b/src/main/kotlin/moe/kageru/kagebot/features/HelpFeature.kt index 2e8d84e..1c432ad 100644 --- a/src/main/kotlin/moe/kageru/kagebot/features/HelpFeature.kt +++ b/src/main/kotlin/moe/kageru/kagebot/features/HelpFeature.kt @@ -5,8 +5,8 @@ import moe.kageru.kagebot.command.MatchType import moe.kageru.kagebot.config.Config import org.javacord.api.event.message.MessageCreateEvent -class HelpFeature : MessageFeature() { - override fun handleInternal(message: MessageCreateEvent) { +class HelpFeature : MessageFeature { + override fun handle(message: MessageCreateEvent) { message.channel.sendEmbed { addField("Commands:", listCommands(message)) } diff --git a/src/main/kotlin/moe/kageru/kagebot/features/MessageFeature.kt b/src/main/kotlin/moe/kageru/kagebot/features/MessageFeature.kt deleted file mode 100644 index 754bf61..0000000 --- a/src/main/kotlin/moe/kageru/kagebot/features/MessageFeature.kt +++ /dev/null @@ -1,11 +0,0 @@ -package moe.kageru.kagebot.features - -import org.javacord.api.event.message.MessageCreateEvent - -abstract class MessageFeature { - fun handle(message: MessageCreateEvent) { - handleInternal(message) - } - - internal abstract fun handleInternal(message: MessageCreateEvent) -} diff --git a/src/main/kotlin/moe/kageru/kagebot/features/SetConfigFeature.kt b/src/main/kotlin/moe/kageru/kagebot/features/SetConfigFeature.kt index a3bdf81..4a59d5f 100644 --- a/src/main/kotlin/moe/kageru/kagebot/features/SetConfigFeature.kt +++ b/src/main/kotlin/moe/kageru/kagebot/features/SetConfigFeature.kt @@ -7,9 +7,9 @@ import moe.kageru.kagebot.config.RawConfig import org.javacord.api.entity.channel.TextChannel import org.javacord.api.event.message.MessageCreateEvent -class SetConfigFeature : MessageFeature() { +class SetConfigFeature : MessageFeature { @ExperimentalStdlibApi - override fun handleInternal(message: MessageCreateEvent) { + override fun handle(message: MessageCreateEvent) { if (message.messageAttachments.size != 1) { message.channel.sendMessage("Error: please attach the new config to your message.") return diff --git a/src/main/kotlin/moe/kageru/kagebot/features/WelcomeFeature.kt b/src/main/kotlin/moe/kageru/kagebot/features/WelcomeFeature.kt index 0c68faf..7076c3d 100644 --- a/src/main/kotlin/moe/kageru/kagebot/features/WelcomeFeature.kt +++ b/src/main/kotlin/moe/kageru/kagebot/features/WelcomeFeature.kt @@ -2,13 +2,33 @@ package moe.kageru.kagebot.features import moe.kageru.kagebot.MessageUtil import moe.kageru.kagebot.Util +import moe.kageru.kagebot.Util.checked +import moe.kageru.kagebot.Util.failed import moe.kageru.kagebot.config.RawWelcomeFeature +import org.javacord.api.DiscordApi import org.javacord.api.entity.channel.TextChannel import org.javacord.api.entity.message.embed.EmbedBuilder import org.javacord.api.event.message.MessageCreateEvent +import org.javacord.api.event.server.member.ServerMemberJoinEvent -class WelcomeFeature(rawWelcome: RawWelcomeFeature) : MessageFeature() { - override fun handleInternal(message: MessageCreateEvent) { +class WelcomeFeature(rawWelcome: RawWelcomeFeature) : MessageFeature, EventFeature { + override fun register(api: DiscordApi) { + api.addServerMemberJoinListener { event -> + checked { welcomeUser(event) } + } + } + + fun welcomeUser(event: ServerMemberJoinEvent) { + val message = event.user.sendMessage(embed) + // If the user disabled direct messages, try the fallback (if defined) + if (message.failed() && hasFallback()) { + fallbackChannel!!.sendMessage( + fallbackMessage!!.replace("@@", MessageUtil.mention(event.user)) + ) + } + } + + override fun handle(message: MessageCreateEvent) { embed?.let { MessageUtil.sendEmbed(message.channel, it) } diff --git a/src/test/kotlin/moe/kageru/kagebot/ConfigTest.kt b/src/test/kotlin/moe/kageru/kagebot/ConfigTest.kt index 649ccfd..7dfbe10 100644 --- a/src/test/kotlin/moe/kageru/kagebot/ConfigTest.kt +++ b/src/test/kotlin/moe/kageru/kagebot/ConfigTest.kt @@ -8,6 +8,7 @@ import io.mockk.mockk import moe.kageru.kagebot.config.Config import moe.kageru.kagebot.features.SetConfigFeature +@ExperimentalStdlibApi class ConfigTest : ShouldSpec({ TestUtil.prepareTestEnvironment() "should properly parse test config" { diff --git a/src/test/kotlin/moe/kageru/kagebot/features/WelcomeFeatureTest.kt b/src/test/kotlin/moe/kageru/kagebot/features/WelcomeFeatureTest.kt index 07f19e9..5b27270 100644 --- a/src/test/kotlin/moe/kageru/kagebot/features/WelcomeFeatureTest.kt +++ b/src/test/kotlin/moe/kageru/kagebot/features/WelcomeFeatureTest.kt @@ -4,16 +4,16 @@ import io.kotlintest.shouldBe import io.kotlintest.specs.StringSpec import io.mockk.every import io.mockk.mockk -import moe.kageru.kagebot.config.Config -import moe.kageru.kagebot.Kagebot import moe.kageru.kagebot.TestUtil +import moe.kageru.kagebot.config.Config import org.javacord.api.entity.message.embed.EmbedBuilder +@ExperimentalStdlibApi class WelcomeFeatureTest : StringSpec({ TestUtil.prepareTestEnvironment() "should send welcome" { val sentMessages = mutableListOf() - Kagebot.welcomeUser( + Config.features.welcome!!.welcomeUser( mockk { every { user } returns mockk { every { sendMessage(capture(sentMessages)) } returns mockk { @@ -28,7 +28,7 @@ class WelcomeFeatureTest : StringSpec({ "should send welcome fallback if DMs are disabled" { val message = mutableListOf() TestUtil.prepareTestEnvironment(sentMessages = message) - Kagebot.welcomeUser( + Config.features.welcome!!.welcomeUser( mockk { every { user } returns mockk { every { id } returns 123