Pull event handling into interface

This commit is contained in:
kageru 2019-07-17 23:42:12 +02:00
parent b9f1c6e540
commit 39ceaffa6c
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2
11 changed files with 51 additions and 45 deletions

View File

@ -1,13 +1,11 @@
package moe.kageru.kagebot package moe.kageru.kagebot
import moe.kageru.kagebot.Util.checked import moe.kageru.kagebot.Util.checked
import moe.kageru.kagebot.Util.failed
import moe.kageru.kagebot.config.Config import moe.kageru.kagebot.config.Config
import moe.kageru.kagebot.config.ConfigParser import moe.kageru.kagebot.config.ConfigParser
import moe.kageru.kagebot.config.RawConfig import moe.kageru.kagebot.config.RawConfig
import org.javacord.api.DiscordApiBuilder import org.javacord.api.DiscordApiBuilder
import org.javacord.api.event.message.MessageCreateEvent import org.javacord.api.event.message.MessageCreateEvent
import org.javacord.api.event.server.member.ServerMemberJoinEvent
import java.io.File import java.io.File
import kotlin.system.exitProcess import kotlin.system.exitProcess
@ -17,7 +15,7 @@ fun main() {
object Kagebot { object Kagebot {
fun MessageCreateEvent.process() { fun MessageCreateEvent.process() {
if (messageAuthor.isBotUser) { if (messageAuthor.isBotUser) {
if (messageAuthor.isYourself) { if (messageAuthor.isYourself) {
val loggedMessage = val loggedMessage =
if (readableMessageContent.isBlank()) "[embed]" else readableMessageContent 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() private fun getSecret() = File("secret").readText().trim()
fun init() { fun init() {
@ -61,10 +47,6 @@ object Kagebot {
}) })
Log.info("kagebot Mk II running") Log.info("kagebot Mk II running")
Globals.api.addMessageCreateListener { checked { it.process() } } Globals.api.addMessageCreateListener { checked { it.process() } }
Config.features.welcome?.let { Config.features.eventFeatures().forEach { it.register(Globals.api) }
Globals.api.addServerMemberJoinListener {
checked { welcomeUser(it) }
}
}
} }
} }

View File

@ -9,9 +9,9 @@ import java.lang.management.ManagementFactory
import java.time.Duration import java.time.Duration
import java.time.temporal.ChronoUnit 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) { if (message.messageAuthor.isBotOwner) {
MessageUtil.sendEmbed(message.channel, getPerformanceStats()) MessageUtil.sendEmbed(message.channel, getPerformanceStats())
} }

View File

@ -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)
}

View File

@ -17,6 +17,7 @@ class Features(
SetConfigFeature() SetConfigFeature()
) )
private val all = listOf(welcome, debug, help, getConfig, setConfig)
private val featureMap = mapOf( private val featureMap = mapOf(
"help" to help, "help" to help,
"debug" to debug, "debug" to debug,
@ -26,4 +27,5 @@ class Features(
) )
fun findByString(feature: String) = featureMap[feature] fun findByString(feature: String) = featureMap[feature]
fun eventFeatures() = all.filterIsInstance<EventFeature>()
} }

View File

@ -6,8 +6,8 @@ import org.javacord.api.event.message.MessageCreateEvent
/** /**
* Simple message handler to send the current config file via message attachment. * Simple message handler to send the current config file via message attachment.
*/ */
class GetConfigFeature : MessageFeature() { class GetConfigFeature : MessageFeature {
override fun handleInternal(message: MessageCreateEvent) { override fun handle(message: MessageCreateEvent) {
message.channel.sendMessage(ConfigParser.configFile) message.channel.sendMessage(ConfigParser.configFile)
} }
} }

View File

@ -5,8 +5,8 @@ import moe.kageru.kagebot.command.MatchType
import moe.kageru.kagebot.config.Config import moe.kageru.kagebot.config.Config
import org.javacord.api.event.message.MessageCreateEvent import org.javacord.api.event.message.MessageCreateEvent
class HelpFeature : MessageFeature() { class HelpFeature : MessageFeature {
override fun handleInternal(message: MessageCreateEvent) { override fun handle(message: MessageCreateEvent) {
message.channel.sendEmbed { message.channel.sendEmbed {
addField("Commands:", listCommands(message)) addField("Commands:", listCommands(message))
} }

View File

@ -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)
}

View File

@ -7,9 +7,9 @@ import moe.kageru.kagebot.config.RawConfig
import org.javacord.api.entity.channel.TextChannel import org.javacord.api.entity.channel.TextChannel
import org.javacord.api.event.message.MessageCreateEvent import org.javacord.api.event.message.MessageCreateEvent
class SetConfigFeature : MessageFeature() { class SetConfigFeature : MessageFeature {
@ExperimentalStdlibApi @ExperimentalStdlibApi
override fun handleInternal(message: MessageCreateEvent) { override fun handle(message: MessageCreateEvent) {
if (message.messageAttachments.size != 1) { if (message.messageAttachments.size != 1) {
message.channel.sendMessage("Error: please attach the new config to your message.") message.channel.sendMessage("Error: please attach the new config to your message.")
return return

View File

@ -2,13 +2,33 @@ package moe.kageru.kagebot.features
import moe.kageru.kagebot.MessageUtil import moe.kageru.kagebot.MessageUtil
import moe.kageru.kagebot.Util import moe.kageru.kagebot.Util
import moe.kageru.kagebot.Util.checked
import moe.kageru.kagebot.Util.failed
import moe.kageru.kagebot.config.RawWelcomeFeature import moe.kageru.kagebot.config.RawWelcomeFeature
import org.javacord.api.DiscordApi
import org.javacord.api.entity.channel.TextChannel import org.javacord.api.entity.channel.TextChannel
import org.javacord.api.entity.message.embed.EmbedBuilder import org.javacord.api.entity.message.embed.EmbedBuilder
import org.javacord.api.event.message.MessageCreateEvent import org.javacord.api.event.message.MessageCreateEvent
import org.javacord.api.event.server.member.ServerMemberJoinEvent
class WelcomeFeature(rawWelcome: RawWelcomeFeature) : MessageFeature() { class WelcomeFeature(rawWelcome: RawWelcomeFeature) : MessageFeature, EventFeature {
override fun handleInternal(message: MessageCreateEvent) { 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 { embed?.let {
MessageUtil.sendEmbed(message.channel, it) MessageUtil.sendEmbed(message.channel, it)
} }

View File

@ -8,6 +8,7 @@ import io.mockk.mockk
import moe.kageru.kagebot.config.Config import moe.kageru.kagebot.config.Config
import moe.kageru.kagebot.features.SetConfigFeature import moe.kageru.kagebot.features.SetConfigFeature
@ExperimentalStdlibApi
class ConfigTest : ShouldSpec({ class ConfigTest : ShouldSpec({
TestUtil.prepareTestEnvironment() TestUtil.prepareTestEnvironment()
"should properly parse test config" { "should properly parse test config" {

View File

@ -4,16 +4,16 @@ import io.kotlintest.shouldBe
import io.kotlintest.specs.StringSpec import io.kotlintest.specs.StringSpec
import io.mockk.every import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import moe.kageru.kagebot.config.Config
import moe.kageru.kagebot.Kagebot
import moe.kageru.kagebot.TestUtil import moe.kageru.kagebot.TestUtil
import moe.kageru.kagebot.config.Config
import org.javacord.api.entity.message.embed.EmbedBuilder import org.javacord.api.entity.message.embed.EmbedBuilder
@ExperimentalStdlibApi
class WelcomeFeatureTest : StringSpec({ class WelcomeFeatureTest : StringSpec({
TestUtil.prepareTestEnvironment() TestUtil.prepareTestEnvironment()
"should send welcome" { "should send welcome" {
val sentMessages = mutableListOf<EmbedBuilder>() val sentMessages = mutableListOf<EmbedBuilder>()
Kagebot.welcomeUser( Config.features.welcome!!.welcomeUser(
mockk { mockk {
every { user } returns mockk { every { user } returns mockk {
every { sendMessage(capture(sentMessages)) } returns mockk { every { sendMessage(capture(sentMessages)) } returns mockk {
@ -28,7 +28,7 @@ class WelcomeFeatureTest : StringSpec({
"should send welcome fallback if DMs are disabled" { "should send welcome fallback if DMs are disabled" {
val message = mutableListOf<String>() val message = mutableListOf<String>()
TestUtil.prepareTestEnvironment(sentMessages = message) TestUtil.prepareTestEnvironment(sentMessages = message)
Kagebot.welcomeUser( Config.features.welcome!!.welcomeUser(
mockk { mockk {
every { user } returns mockk { every { user } returns mockk {
every { id } returns 123 every { id } returns 123