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

View File

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

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()
)
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<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.
*/
class GetConfigFeature : MessageFeature() {
override fun handleInternal(message: MessageCreateEvent) {
class GetConfigFeature : MessageFeature {
override fun handle(message: MessageCreateEvent) {
message.channel.sendMessage(ConfigParser.configFile)
}
}

View File

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

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.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

View File

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

View File

@ -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" {

View File

@ -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<EmbedBuilder>()
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<String>()
TestUtil.prepareTestEnvironment(sentMessages = message)
Kagebot.welcomeUser(
Config.features.welcome!!.welcomeUser(
mockk {
every { user } returns mockk {
every { id } returns 123