1
0
mirror of https://github.com/mamoe/mirai.git synced 2025-03-06 17:10:48 +08:00

Avoid re-broadcasting MessagePostSendEvent for long messages

This commit is contained in:
Him188 2021-01-23 00:28:14 +08:00
parent d60006376c
commit 9b38b9a54d
2 changed files with 44 additions and 42 deletions
mirai-core/src/commonMain/kotlin/contact

View File

@ -116,9 +116,12 @@ internal class GroupImpl(
val chain = broadcastGroupMessagePreSendEvent(message) val chain = broadcastGroupMessagePreSendEvent(message)
return sendMessageImpl(message, chain, false).also { val (finalMessage, result) = sendMessageImpl(message, chain, false)
logMessageSent(chain)
} logMessageSent(finalMessage)
GroupMessagePostSendEvent(this, finalMessage, result.exceptionOrNull(), result.getOrNull()).broadcast()
return result.getOrThrow()
} }
@OptIn(ExperimentalTime::class) @OptIn(ExperimentalTime::class)

View File

@ -14,7 +14,6 @@ import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.MessageTooLargeException import net.mamoe.mirai.contact.MessageTooLargeException
import net.mamoe.mirai.event.broadcast import net.mamoe.mirai.event.broadcast
import net.mamoe.mirai.event.events.EventCancelledException 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.event.events.GroupMessagePreSendEvent
import net.mamoe.mirai.internal.MiraiImpl import net.mamoe.mirai.internal.MiraiImpl
import net.mamoe.mirai.internal.forwardMessage import net.mamoe.mirai.internal.forwardMessage
@ -34,7 +33,7 @@ internal suspend fun GroupImpl.sendMessageImpl(
originalMessage: Message, originalMessage: Message,
transformedMessage: Message, transformedMessage: Message,
forceAsLongMessage: Boolean, forceAsLongMessage: Boolean,
): MessageReceipt<Group> { ): Pair<MessageChain, Result<MessageReceipt<Group>>> {
val chain = transformedMessage val chain = transformedMessage
.transformSpecialMessages(this) .transformSpecialMessages(this)
.convertToLongMessageIfNeeded(originalMessage, forceAsLongMessage, this) .convertToLongMessageIfNeeded(originalMessage, forceAsLongMessage, this)
@ -45,11 +44,13 @@ internal suspend fun GroupImpl.sendMessageImpl(
updateFriendImageForGroupMessage(image) updateFriendImageForGroupMessage(image)
} }
return sendMessagePacket( return chain to kotlin.runCatching {
originalMessage, sendMessagePacket(
chain, originalMessage,
allowResendAsLongMessage = transformedMessage.takeSingleContent<LongMessageInternal>() == null chain,
) allowResendAsLongMessage = transformedMessage.takeSingleContent<LongMessageInternal>() == null
)
}
} }
@ -101,42 +102,40 @@ private suspend fun GroupImpl.sendMessagePacket(
): MessageReceipt<Group> { ): MessageReceipt<Group> {
val group = this val group = this
val result = bot.network.runCatching sendMsg@{ val source: OnlineMessageSourceToGroupImpl
val source: OnlineMessageSourceToGroupImpl
MessageSvcPbSendMsg.createToGroup(bot.client, group, finalMessage) { bot.network.run {
source = it MessageSvcPbSendMsg.createToGroup(bot.client, group, finalMessage) { source = it }
}.sendAndExpect<MessageSvcPbSendMsg.Response>().let { resp -> .sendAndExpect<MessageSvcPbSendMsg.Response>().let { resp ->
if (resp is MessageSvcPbSendMsg.Response.MessageTooLarge) { if (resp is MessageSvcPbSendMsg.Response.MessageTooLarge) {
if (allowResendAsLongMessage) { if (allowResendAsLongMessage) {
return@sendMsg sendMessageImpl(originalMessage, finalMessage, true) return sendMessageImpl(originalMessage, finalMessage, true).second.getOrThrow()
} else throw MessageTooLargeException( } else {
group, throw MessageTooLargeException(
originalMessage, group,
finalMessage, originalMessage,
"Message '${finalMessage.content.take(10)}' is too large." 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( private suspend fun GroupImpl.uploadGroupLongMessageHighway(