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

View File

@ -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)

View File

@ -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(