diff --git a/src/main/kotlin/moe/kageru/kagebot/Command.kt b/src/main/kotlin/moe/kageru/kagebot/Command.kt index a4a2cea..a81be1d 100644 --- a/src/main/kotlin/moe/kageru/kagebot/Command.kt +++ b/src/main/kotlin/moe/kageru/kagebot/Command.kt @@ -1,32 +1,34 @@ package moe.kageru.kagebot import moe.kageru.kagebot.Util.doIf -import moe.kageru.kagebot.Util.asString import org.javacord.api.entity.message.MessageAuthor import org.javacord.api.event.message.MessageCreateEvent private const val AUTHOR_PLACEHOLDER = "@@" -class Command(trigger: String?, response: String?, matchType: MatchType?, private val deleteMessage: Boolean) { +class Command( + trigger: String?, + private val response: String?, + matchType: MatchType?, + private val deleteMessage: Boolean +) { val trigger: String = trigger!! val regex: Regex? = if (matchType == MatchType.REGEX) Regex(trigger!!) else null - private val response: String = response!! private val matchType: MatchType = matchType ?: MatchType.PREFIX constructor(cmd: Command) : this(cmd.trigger, cmd.response, cmd.matchType, cmd.deleteMessage) fun execute(message: MessageCreateEvent) { - if (this.deleteMessage && message.isServerMessage) { - val wasDeleted = message.deleteMessage() - if (wasDeleted.isCompletedExceptionally) { - Log.log.warning("Could not delete message ${message.asString()}") - } + if (this.deleteMessage && message.message.canYouDelete()) { + message.deleteMessage() + } + this.response?.let { + message.channel.sendMessage(respond(message.messageAuthor)) } - message.channel.sendMessage(respond(message.messageAuthor)) } fun matches(msg: String) = this.matchType.matches(msg, this) - private fun respond(author: MessageAuthor) = this.response.doIf({ it.contains(AUTHOR_PLACEHOLDER) }) { + private fun respond(author: MessageAuthor) = this.response!!.doIf({ it.contains(AUTHOR_PLACEHOLDER) }) { it.replace(AUTHOR_PLACEHOLDER, MessageUtil.mention(author)) } } diff --git a/src/main/kotlin/moe/kageru/kagebot/Kagebot.kt b/src/main/kotlin/moe/kageru/kagebot/Kagebot.kt index 3d84dd9..779cd79 100644 --- a/src/main/kotlin/moe/kageru/kagebot/Kagebot.kt +++ b/src/main/kotlin/moe/kageru/kagebot/Kagebot.kt @@ -8,7 +8,7 @@ import org.javacord.api.event.message.MessageCreateEvent class Kagebot { companion object { fun processMessage(event: MessageCreateEvent) { - if (!event.messageAuthor.isYourself) { + if (event.messageAuthor.isYourself) { return } for (command in config.commands) { diff --git a/src/main/resources/config.toml b/src/main/resources/config.toml index 4e490ae..fc9d6bb 100644 --- a/src/main/resources/config.toml +++ b/src/main/resources/config.toml @@ -24,6 +24,10 @@ trigger = "answer me" # i.e. “@author there you go” response = "@@ there you go" +[[commands]] +trigger = "delet this" +deleteMessage = true + [[commands]] trigger = "^[^`]*([()|DoOvVcC][-=^']?;|;[-=^']?[()|DoOpPvVcC3]|:wink:|😉)[^`]*$" response = "@@ Oboe!" diff --git a/src/test/kotlin/moe/kageru/kagebot/CommandTest.kt b/src/test/kotlin/moe/kageru/kagebot/CommandTest.kt index f9bdda1..2b30941 100644 --- a/src/test/kotlin/moe/kageru/kagebot/CommandTest.kt +++ b/src/test/kotlin/moe/kageru/kagebot/CommandTest.kt @@ -2,23 +2,37 @@ package moe.kageru.kagebot import io.kotlintest.shouldBe import io.kotlintest.specs.StringSpec +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify class CommandTest : StringSpec({ "should match prefix command" { - testMessage("!ping", "pong") + testMessageSuccess("!ping", "pong") } "should match contains command" { - testMessage("the trigger is somewhere in this message", "found it") + testMessageSuccess("the trigger is somewhere in this message", "found it") } "should match regex command" { - testMessage("AcsdB", "regex matched") + testMessageSuccess("AcsdB", "regex matched") } "should ping author" { - testMessage("answer me", "<@1> there you go") + testMessageSuccess("answer me", "<@1> there you go") + } + "should not react to own message" { + val calls = mutableListOf() + Kagebot.processMessage(TestUtil.mockMessage("!ping", capturedCalls = calls, isSelf = true)) + calls.size shouldBe 0 + } + "should delete messages" { + val mockMessage = TestUtil.mockMessage("delet this") + every { mockMessage.deleteMessage() } returns mockk() + Kagebot.processMessage(mockMessage) + verify(exactly = 1) { mockMessage.deleteMessage() } } }) { companion object { - fun testMessage(content: String, result: String) { + fun testMessageSuccess(content: String, result: String) { val calls = mutableListOf() Kagebot.processMessage(TestUtil.mockMessage(content, capturedCalls = calls)) calls.size shouldBe 1 diff --git a/src/test/kotlin/moe/kageru/kagebot/TestUtil.kt b/src/test/kotlin/moe/kageru/kagebot/TestUtil.kt index c3a3a27..2f85823 100644 --- a/src/test/kotlin/moe/kageru/kagebot/TestUtil.kt +++ b/src/test/kotlin/moe/kageru/kagebot/TestUtil.kt @@ -5,11 +5,18 @@ import io.mockk.mockk import org.javacord.api.event.message.MessageCreateEvent object TestUtil { - fun mockMessage(content: String, author: Long = 1, capturedCalls: MutableList = mutableListOf()): MessageCreateEvent { + fun mockMessage( + content: String, + author: Long = 1, + capturedCalls: MutableList = mutableListOf(), + isSelf: Boolean = false + ): MessageCreateEvent { val message = mockk() every { message.messageContent } returns content every { message.messageAuthor.id } returns author every { message.channel.sendMessage(capture(capturedCalls)) } returns mockk() + every { message.messageAuthor.isYourself } returns isSelf + every { message.message.canYouDelete() } returns true return message } } \ No newline at end of file