From 9b38b9a54d8e6831009cdd23938999aeed41b956 Mon Sep 17 00:00:00 2001 From: Him188 <Him188@mamoe.net> Date: Sat, 23 Jan 2021 00:28:14 +0800 Subject: [PATCH] Avoid re-broadcasting MessagePostSendEvent for long messages --- .../commonMain/kotlin/contact/GroupImpl.kt | 9 ++- .../kotlin/contact/GroupSendMessageImpl.kt | 77 +++++++++---------- 2 files changed, 44 insertions(+), 42 deletions(-) diff --git a/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt b/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt index 8473c8c9a..6198f7921 100644 --- a/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt @@ -116,9 +116,12 @@ internal class GroupImpl( val chain = broadcastGroupMessagePreSendEvent(message) - return sendMessageImpl(message, chain, false).also { - logMessageSent(chain) - } + val (finalMessage, result) = sendMessageImpl(message, chain, false) + + logMessageSent(finalMessage) + GroupMessagePostSendEvent(this, finalMessage, result.exceptionOrNull(), result.getOrNull()).broadcast() + + return result.getOrThrow() } @OptIn(ExperimentalTime::class) diff --git a/mirai-core/src/commonMain/kotlin/contact/GroupSendMessageImpl.kt b/mirai-core/src/commonMain/kotlin/contact/GroupSendMessageImpl.kt index 66391f4cb..791e397ef 100644 --- a/mirai-core/src/commonMain/kotlin/contact/GroupSendMessageImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/GroupSendMessageImpl.kt @@ -14,7 +14,6 @@ import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.MessageTooLargeException import net.mamoe.mirai.event.broadcast import net.mamoe.mirai.event.events.EventCancelledException -import net.mamoe.mirai.event.events.GroupMessagePostSendEvent import net.mamoe.mirai.event.events.GroupMessagePreSendEvent import net.mamoe.mirai.internal.MiraiImpl import net.mamoe.mirai.internal.forwardMessage @@ -34,7 +33,7 @@ internal suspend fun GroupImpl.sendMessageImpl( originalMessage: Message, transformedMessage: Message, forceAsLongMessage: Boolean, -): MessageReceipt<Group> { +): Pair<MessageChain, Result<MessageReceipt<Group>>> { val chain = transformedMessage .transformSpecialMessages(this) .convertToLongMessageIfNeeded(originalMessage, forceAsLongMessage, this) @@ -45,11 +44,13 @@ internal suspend fun GroupImpl.sendMessageImpl( updateFriendImageForGroupMessage(image) } - return sendMessagePacket( - originalMessage, - chain, - allowResendAsLongMessage = transformedMessage.takeSingleContent<LongMessageInternal>() == null - ) + return chain to kotlin.runCatching { + sendMessagePacket( + originalMessage, + chain, + allowResendAsLongMessage = transformedMessage.takeSingleContent<LongMessageInternal>() == null + ) + } } @@ -101,42 +102,40 @@ private suspend fun GroupImpl.sendMessagePacket( ): MessageReceipt<Group> { val group = this - val result = bot.network.runCatching sendMsg@{ - val source: OnlineMessageSourceToGroupImpl - MessageSvcPbSendMsg.createToGroup(bot.client, group, finalMessage) { - source = it - }.sendAndExpect<MessageSvcPbSendMsg.Response>().let { resp -> - if (resp is MessageSvcPbSendMsg.Response.MessageTooLarge) { - if (allowResendAsLongMessage) { - return@sendMsg sendMessageImpl(originalMessage, finalMessage, true) - } else throw MessageTooLargeException( - group, - originalMessage, - finalMessage, - "Message '${finalMessage.content.take(10)}' is too large." - ) + val source: OnlineMessageSourceToGroupImpl + + bot.network.run { + MessageSvcPbSendMsg.createToGroup(bot.client, group, finalMessage) { source = it } + .sendAndExpect<MessageSvcPbSendMsg.Response>().let { resp -> + if (resp is MessageSvcPbSendMsg.Response.MessageTooLarge) { + if (allowResendAsLongMessage) { + return sendMessageImpl(originalMessage, finalMessage, true).second.getOrThrow() + } else { + throw MessageTooLargeException( + group, + originalMessage, + finalMessage, + "Message '${finalMessage.content.take(10)}' is too large." + ) + } + } + check(resp is MessageSvcPbSendMsg.Response.SUCCESS) { + "Send group message failed: $resp" + } } - check(resp is MessageSvcPbSendMsg.Response.SUCCESS) { - "Send group message failed: $resp" - } - } - - try { - source.ensureSequenceIdAvailable() - } catch (e: Exception) { - bot.network.logger.warning( - "Timeout awaiting sequenceId for group message(${finalMessage.content.take(10)}). Some features may not work properly", - e - - ) - } - - MessageReceipt(source, group) } - GroupMessagePostSendEvent(this, finalMessage, result.exceptionOrNull(), result.getOrNull()).broadcast() + try { + source.ensureSequenceIdAvailable() + } catch (e: Exception) { + bot.network.logger.warning( + "Timeout awaiting sequenceId for group message(${finalMessage.content.take(10)}). Some features may not work properly", + e - return result.getOrThrow() + ) + } + + return MessageReceipt(source, group) } private suspend fun GroupImpl.uploadGroupLongMessageHighway(