Pull event handling into interface
This commit is contained in:
parent
b9f1c6e540
commit
39ceaffa6c
|
@ -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) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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())
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
|
@ -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>()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
|
||||||
}
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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" {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user