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

View File

@ -73,6 +73,11 @@ object Util {
try {
join()
} 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
}
return isCompletedExceptionally

View File

@ -32,8 +32,10 @@ class WelcomeFeature(rawWelcome: RawWelcomeFeature) : MessageFeature, EventFeatu
override fun handle(message: MessageCreateEvent) {
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

View File

@ -40,9 +40,15 @@ object TestUtil {
return mockk {
every { messageContent } returns content
every { readableMessageContent } returns content
every { channel.sendMessage(capture(replies)) } returns mockk()
every { channel.sendMessage(capture(replyEmbeds)) } returns mockk()
every { channel.sendMessage(capture(files)) } returns mockk()
every { channel.sendMessage(capture(replies)) } returns mockk(relaxed = true) {
every { isCompletedExceptionally } returns false
}
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 { isPrivateMessage } returns false
// 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 {
return mockk {
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) {
every { isPresent } returns true
every { get() } returns mockk {
every { sendMessage(capture(sentEmbeds)) } returns mockk {
every { join() } returns mockk()
every { sendMessage(capture(sentEmbeds)) } returns mockk(relaxed = true) {
every { join() } returns mockk {
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> {
@ -88,7 +96,9 @@ object TestUtil {
every { getMembersByName(any()) } returns listOf(mockk(relaxed = true) {
every { id } returns 123
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({
TestUtil.prepareTestEnvironment()
"should remove and store roles" {
clearTimeouts()
TestUtil.mockMessage("!timeout kageru 99999999").process()
Dao.getAllTimeouts().let {
it.size shouldBe 1