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:
parent
d60006376c
commit
9b38b9a54d
mirai-core/src/commonMain/kotlin/contact
@ -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)
|
||||||
|
@ -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(
|
||||||
|
Loading…
Reference in New Issue
Block a user