1
0
mirror of https://github.com/mamoe/mirai.git synced 2025-03-25 06:50:09 +08:00

Refine MessageSource ()

* Refine MessageSource

* comments
This commit is contained in:
Karlatemp 2021-09-27 23:27:22 +08:00 committed by GitHub
parent cb3d4362ba
commit 5fe9ad0658
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 8 deletions

View File

@ -59,6 +59,20 @@ internal interface OutgoingMessageSourceInternal : MessageSourceInternal {
var originalMessage: MessageChain
}
/**
* All [OnlineMessageSource.Incoming] should implement this interface.
*
*/
internal interface IncomingMessageSourceInternal : MessageSourceInternal {
// #1532, #1289
// 问题描述: 解析 Incoming 时存在中间元素 (如 ForwardMessageInternal) 等,
// MessageChain.source.originMessage 中可能因为各种原因而存在这些中间元素
// 于是在广播 MessageEvent 前将 originalMessage 改成 refined 后的 MessageChain
var originalMessageLazy: Lazy<MessageChain>
}
@Suppress("DEPRECATION_ERROR")
internal fun <C : Contact> OnlineMessageSource.Outgoing.createMessageReceipt(
target: C,

View File

@ -12,7 +12,9 @@ package net.mamoe.mirai.internal.message
import net.mamoe.mirai.Bot
import net.mamoe.mirai.internal.message.DeepMessageRefiner.refineDeep
import net.mamoe.mirai.internal.message.LightMessageRefiner.refineLight
import net.mamoe.mirai.internal.message.LightMessageRefiner.refineMessageSource
import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.utils.safeCast
/**
* 在接收解析消息后会经过一层转换的消息.
@ -142,6 +144,22 @@ internal class SimpleRefineContext(
* 执行不需要 `suspend` refine. 用于 [MessageSource.originalMessage].
*/
internal object LightMessageRefiner : MessageRefiner() {
/* note:
* 不在 refineLight 中处理的原因是 refineMessageSource
* 需要的是 **最终处理完成后** MessageChain ( refineDeep 后的 MessageChain)
*
* refineLight/RefinableMessage.(try)refine 中直接处理将导致获取不到最终结果导致逻辑错误
*/
fun MessageChain.refineMessageSource(): MessageChain {
val source = this.sourceOrNull?.safeCast<IncomingMessageSourceInternal>() ?: return this
val originalMessage = this
source.originalMessageLazy = lazy {
@Suppress("INVISIBLE_MEMBER")
createMessageChainImplOptimized(originalMessage.filterNot { it is MessageSource })
}
return this
}
fun MessageChain.refineLight(
bot: Bot,
refineContext: RefineContext = EmptyRefineContext,
@ -159,5 +177,6 @@ internal object DeepMessageRefiner : MessageRefiner() {
refineContext: RefineContext = EmptyRefineContext,
): MessageChain {
return refineImpl(bot) { it.refine(bot, this, refineContext) }
.refineMessageSource()
}
}

View File

@ -40,7 +40,7 @@ import java.util.concurrent.atomic.AtomicBoolean
internal class OnlineMessageSourceFromFriendImpl(
override val bot: Bot,
msg: List<MsgComm.Msg>,
) : OnlineMessageSource.Incoming.FromFriend(), MessageSourceInternal {
) : OnlineMessageSource.Incoming.FromFriend(), IncomingMessageSourceInternal {
object Serializer : MessageSourceSerializerImpl("OnlineMessageSourceFromFriend")
override val sequenceIds: IntArray = msg.mapToIntArray { it.msgHead.msgSeq }
@ -50,9 +50,10 @@ internal class OnlineMessageSourceFromFriendImpl(
it.msgBody.richText.attr?.random ?: 0
} // other client 消息的这个是0
override val time: Int = msg.first().msgHead.msgTime
override val originalMessage: MessageChain by lazy {
override var originalMessageLazy = lazy {
msg.toMessageChainNoSource(bot, 0, MessageSourceKind.FRIEND)
}
override val originalMessage: MessageChain get() = originalMessageLazy.value
override val sender: Friend = bot.getFriendOrFail(msg.first().msgHead.fromUin)
private val jceData: ImMsgBody.SourceMsg by lazy { msg.toJceDataPrivate(internalIds) }
@ -65,7 +66,7 @@ internal class OnlineMessageSourceFromFriendImpl(
internal class OnlineMessageSourceFromStrangerImpl(
override val bot: Bot,
msg: List<MsgComm.Msg>,
) : OnlineMessageSource.Incoming.FromStranger(), MessageSourceInternal {
) : OnlineMessageSource.Incoming.FromStranger(), IncomingMessageSourceInternal {
object Serializer : MessageSourceSerializerImpl("OnlineMessageSourceFromStranger")
override val sequenceIds: IntArray = msg.mapToIntArray { it.msgHead.msgSeq }
@ -75,9 +76,10 @@ internal class OnlineMessageSourceFromStrangerImpl(
it.msgBody.richText.attr?.random ?: 0
} // other client 消息的这个是0
override val time: Int = msg.first().msgHead.msgTime
override val originalMessage: MessageChain by lazy {
override var originalMessageLazy = lazy {
msg.toMessageChainNoSource(bot, 0, MessageSourceKind.STRANGER)
}
override val originalMessage: MessageChain get() = originalMessageLazy.value
override val sender: Stranger = bot.getStrangerOrFail(msg.first().msgHead.fromUin)
private val jceData: ImMsgBody.SourceMsg by lazy { msg.toJceDataPrivate(internalIds) }
@ -129,7 +131,7 @@ private fun List<MsgComm.Msg>.toJceDataPrivate(ids: IntArray): ImMsgBody.SourceM
internal class OnlineMessageSourceFromTempImpl(
override val bot: Bot,
msg: List<MsgComm.Msg>,
) : OnlineMessageSource.Incoming.FromTemp(), MessageSourceInternal {
) : OnlineMessageSource.Incoming.FromTemp(), IncomingMessageSourceInternal {
object Serializer : MessageSourceSerializerImpl("OnlineMessageSourceFromTemp")
override val sequenceIds: IntArray = msg.mapToIntArray { it.msgHead.msgSeq }
@ -137,9 +139,10 @@ internal class OnlineMessageSourceFromTempImpl(
override var isRecalledOrPlanned: AtomicBoolean = AtomicBoolean(false)
override val ids: IntArray get() = sequenceIds //
override val time: Int = msg.first().msgHead.msgTime
override val originalMessage: MessageChain by lazy {
override var originalMessageLazy = lazy {
msg.toMessageChainNoSource(bot, groupIdOrZero = 0, MessageSourceKind.TEMP)
}
override val originalMessage: MessageChain get() = originalMessageLazy.value
override val sender: Member = with(msg.first().msgHead) {
// it must be uin, see #1410
// corresponding test: net.mamoe.mirai.internal.notice.processors.MessageTest.group temp message test 2
@ -158,7 +161,7 @@ internal class OnlineMessageSourceFromTempImpl(
internal class OnlineMessageSourceFromGroupImpl(
override val bot: Bot,
msg: List<MsgComm.Msg>,
) : OnlineMessageSource.Incoming.FromGroup(), MessageSourceInternal {
) : OnlineMessageSource.Incoming.FromGroup(), IncomingMessageSourceInternal {
object Serializer : MessageSourceSerializerImpl("OnlineMessageSourceFromGroupImpl")
@Transient
@ -167,9 +170,10 @@ internal class OnlineMessageSourceFromGroupImpl(
override val internalIds: IntArray = msg.mapToIntArray { it.msgBody.richText.attr!!.random }
override val ids: IntArray get() = sequenceIds
override val time: Int = msg.first().msgHead.msgTime
override val originalMessage: MessageChain by lazy {
override var originalMessageLazy = lazy {
msg.toMessageChainNoSource(bot, groupIdOrZero = group.id, MessageSourceKind.GROUP)
}
override val originalMessage: MessageChain get() = originalMessageLazy.value
override val sender: Member by lazy {
val groupCode = msg.first().msgHead.groupInfo?.groupCode