mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-25 06:50:09 +08:00
parent
cb3d4362ba
commit
5fe9ad0658
mirai-core/src/commonMain/kotlin/message
@ -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,
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user