Add logging for errors while sending embeds

Not that it’s worth much because the discord API is a useless piece of
trash when it comes to error messages. Like, seriously. Might as well
throw no error at all.
Received a 400 response from Discord with body {"embed": ["fields"]}!
Thanks for nothing. Fix in next commit.
This commit is contained in:
kageru 2019-08-05 21:38:41 +02:00
parent 60797c21d0
commit 0ae5e83641
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2
5 changed files with 33 additions and 11 deletions

View File

@ -1,5 +1,6 @@
package moe.kageru.kagebot package moe.kageru.kagebot
import moe.kageru.kagebot.Util.failed
import moe.kageru.kagebot.config.Config import moe.kageru.kagebot.config.Config
import org.javacord.api.entity.message.Message import org.javacord.api.entity.message.Message
import org.javacord.api.entity.message.MessageAuthor import org.javacord.api.entity.message.MessageAuthor
@ -30,7 +31,10 @@ object MessageUtil {
setTimestampToNow() setTimestampToNow()
op() op()
} }
sendMessage(embed) val sent = sendMessage(embed)
if (sent.failed()) {
// for logging
}
} }
/** /**

View File

@ -73,6 +73,11 @@ object Util {
try { try {
join() join()
} catch (e: CompletionException) { } catch (e: CompletionException) {
Log.warn("""Error during CompletableFuture:
|$e
|${e.localizedMessage}
|${e.stackTrace.joinToString("\n\t")}
""".trimMargin())
// we don’t care about this error, but I don’t want to spam stdout // we don’t care about this error, but I don’t want to spam stdout
} }
return isCompletedExceptionally return isCompletedExceptionally

View File

@ -32,8 +32,10 @@ class WelcomeFeature(rawWelcome: RawWelcomeFeature) : MessageFeature, EventFeatu
override fun handle(message: MessageCreateEvent) { override fun handle(message: MessageCreateEvent) {
embed?.let { embed?.let {
MessageUtil.sendEmbed(message.channel, it) val sent = MessageUtil.sendEmbed(message.channel, it)
} // invoke this for logging
sent.failed()
} ?: Log.info("Welcome command was triggered, but no welcome embed defined.")
} }
private fun hasFallback(): Boolean = fallbackChannel != null && fallbackMessage != null private fun hasFallback(): Boolean = fallbackChannel != null && fallbackMessage != null

View File

@ -40,9 +40,15 @@ object TestUtil {
return mockk { return mockk {
every { messageContent } returns content every { messageContent } returns content
every { readableMessageContent } returns content every { readableMessageContent } returns content
every { channel.sendMessage(capture(replies)) } returns mockk() every { channel.sendMessage(capture(replies)) } returns mockk(relaxed = true) {
every { channel.sendMessage(capture(replyEmbeds)) } returns mockk() every { isCompletedExceptionally } returns false
every { channel.sendMessage(capture(files)) } returns mockk() }
every { channel.sendMessage(capture(replyEmbeds)) } returns mockk(relaxed = true) {
every { isCompletedExceptionally } returns false
}
every { channel.sendMessage(capture(files)) } returns mockk(relaxed = true) {
every { isCompletedExceptionally } returns false
}
every { message.canYouDelete() } returns true every { message.canYouDelete() } returns true
every { isPrivateMessage } returns false every { isPrivateMessage } returns false
// We can’t use a nested mock here because other fields of messageAuthor might // We can’t use a nested mock here because other fields of messageAuthor might
@ -59,7 +65,7 @@ object TestUtil {
fun messageableAuthor(messages: MutableList<EmbedBuilder> = mutableListOf()): User { fun messageableAuthor(messages: MutableList<EmbedBuilder> = mutableListOf()): User {
return mockk { return mockk {
every { getRoles(any()) } returns emptyList() every { getRoles(any()) } returns emptyList()
every { sendMessage(capture(messages)) } returns mockk() every { sendMessage(capture(messages)) } returns mockk(relaxed = true)
} }
} }
@ -71,11 +77,13 @@ object TestUtil {
val channel = mockk<Optional<ServerTextChannel>>(relaxed = true) { val channel = mockk<Optional<ServerTextChannel>>(relaxed = true) {
every { isPresent } returns true every { isPresent } returns true
every { get() } returns mockk { every { get() } returns mockk {
every { sendMessage(capture(sentEmbeds)) } returns mockk { every { sendMessage(capture(sentEmbeds)) } returns mockk(relaxed = true) {
every { join() } returns mockk() every { join() } returns mockk {
every { isCompletedExceptionally } returns false
}
every { isCompletedExceptionally } returns false every { isCompletedExceptionally } returns false
} }
every { sendMessage(capture(sentMessages)) } returns mockk() every { sendMessage(capture(sentMessages)) } returns mockk(relaxed = true)
} }
} }
val api = mockk<DiscordApi> { val api = mockk<DiscordApi> {
@ -88,7 +96,9 @@ object TestUtil {
every { getMembersByName(any()) } returns listOf(mockk(relaxed = true) { every { getMembersByName(any()) } returns listOf(mockk(relaxed = true) {
every { id } returns 123 every { id } returns 123
every { getRoles(any()) } returns listOf(TEST_ROLE) every { getRoles(any()) } returns listOf(TEST_ROLE)
every { sendMessage(capture(dmEmbeds)) } returns mockk() every { sendMessage(capture(dmEmbeds)) } returns mockk(relaxed = true) {
every { isCompletedExceptionally } returns false
}
}) })
}) })
} }

View File

@ -12,6 +12,7 @@ import org.javacord.api.entity.message.embed.EmbedBuilder
class TimeoutFeatureTest : StringSpec({ class TimeoutFeatureTest : StringSpec({
TestUtil.prepareTestEnvironment() TestUtil.prepareTestEnvironment()
"should remove and store roles" { "should remove and store roles" {
clearTimeouts()
TestUtil.mockMessage("!timeout kageru 99999999").process() TestUtil.mockMessage("!timeout kageru 99999999").process()
Dao.getAllTimeouts().let { Dao.getAllTimeouts().let {
it.size shouldBe 1 it.size shouldBe 1