From bbf991103d2c4034544d91a75bde6aca583af429 Mon Sep 17 00:00:00 2001 From: Him188 Date: Sun, 1 Mar 2020 14:40:51 +0800 Subject: [PATCH] Add `MessageSource.originalMessage` --- .../qqandroid/message/MessageSourceImpl.kt | 37 ++++++++++++------- .../packet/chat/receive/MessageSvc.kt | 4 +- .../message/data/MessageSource.kt | 9 ++++- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageSourceImpl.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageSourceImpl.kt index 3566dac68..a0519129e 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageSourceImpl.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageSourceImpl.kt @@ -26,11 +26,15 @@ import net.mamoe.mirai.qqandroid.network.protocol.data.proto.SourceMsg import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.OnlinePush import net.mamoe.mirai.utils.MiraiExperimentalAPI -internal inline class MessageSourceFromServer( +internal class MessageSourceFromServer( val delegate: ImMsgBody.SourceMsg ) : MessageSource { override val time: Long get() = delegate.time.toLong() and 0xFFFFFFFF + override val originalMessage: MessageChain by lazy { + delegate.toMessageChain() + } + override val id: Long get() = (delegate.origSeqs?.firstOrNull() ?: error("cannot find sequenceId from ImMsgBody.SourceMsg")).toLong().shl(32) or @@ -49,12 +53,12 @@ internal inline class MessageSourceFromServer( override fun toString(): String = "" } -internal inline class MessageSourceFromMsg( +internal class MessageSourceFromMsg( val delegate: MsgComm.Msg ) : MessageSource { override val time: Long get() = delegate.msgHead.msgTime.toLong() and 0xFFFFFFFF - override val id: Long - get() = delegate.msgHead.msgSeq.toLong().shl(32) or + override val id: Long = + delegate.msgHead.msgSeq.toLong().shl(32) or delegate.msgBody.richText.attr!!.random.toLong().and(0xFFFFFFFF) override suspend fun ensureSequenceIdAvailable() { @@ -64,6 +68,9 @@ internal inline class MessageSourceFromMsg( override val toUin: Long get() = delegate.msgHead.toUin override val senderId: Long get() = delegate.msgHead.fromUin override val groupId: Long get() = delegate.msgHead.groupInfo?.groupCode ?: 0 + override val originalMessage: MessageChain by lazy { + delegate.toMessageChain() + } fun toJceData(): ImMsgBody.SourceMsg { return if (groupId == 0L) { @@ -71,6 +78,12 @@ internal inline class MessageSourceFromMsg( } else toJceDataImplForGroup() } + val elems by lazy { + delegate.msgBody.richText.elems.toMutableList().also { + if (it.last().elemFlags2 == null) it.add(ImMsgBody.Elem(elemFlags2 = ImMsgBody.ElemFlags2())) + } + } + private fun toJceDataImplForFriend(): ImMsgBody.SourceMsg { return ImMsgBody.SourceMsg( origSeqs = listOf(delegate.msgHead.msgSeq), @@ -97,9 +110,7 @@ internal inline class MessageSourceFromMsg( ), msgBody = ImMsgBody.MsgBody( richText = ImMsgBody.RichText( - elems = delegate.msgBody.richText.elems.also { - if (it.last().elemFlags2 == null) it.add(ImMsgBody.Elem(elemFlags2 = ImMsgBody.ElemFlags2())) - } + elems = elems ) ) ).toByteArray(MsgComm.Msg.serializer()) @@ -135,9 +146,7 @@ internal inline class MessageSourceFromMsg( ), msgBody = ImMsgBody.MsgBody( richText = ImMsgBody.RichText( - elems = delegate.msgBody.richText.elems.also { - if (it.last().elemFlags2 == null) it.add(ImMsgBody.Elem(elemFlags2 = ImMsgBody.ElemFlags2())) - } + elems = elems ) ) ).toByteArray(MsgComm.Msg.serializer()) @@ -149,7 +158,7 @@ internal inline class MessageSourceFromMsg( internal abstract class MessageSourceFromSend : MessageSource { - abstract val sourceMessage: MessageChain + abstract override val originalMessage: MessageChain fun toJceData(): ImMsgBody.SourceMsg { return if (groupId == 0L) { @@ -158,7 +167,7 @@ internal abstract class MessageSourceFromSend : MessageSource { } private val elems by lazy { - sourceMessage.toRichTextElems(groupId != 0L) + originalMessage.toRichTextElems(groupId != 0L) } private fun toJceDataImplForFriend(): ImMsgBody.SourceMsg { @@ -242,7 +251,7 @@ internal class MessageSourceFromSendFriend( override val toUin: Long, override val groupId: Long, val sequenceId: Int, - override val sourceMessage: MessageChain + override val originalMessage: MessageChain ) : MessageSourceFromSend() { @UseExperimental(ExperimentalCoroutinesApi::class) override val id: Long @@ -264,7 +273,7 @@ internal class MessageSourceFromSendGroup( override val senderId: Long, override val toUin: Long, override val groupId: Long, - override val sourceMessage: MessageChain + override val originalMessage: MessageChain ) : MessageSourceFromSend() { private lateinit var sequenceIdDeferred: Deferred diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt index 7d9a3617a..249d27c0b 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt @@ -289,7 +289,7 @@ internal class MessageSvc { time = currentTimeSeconds + client.timeDifference, groupId = 0, sequenceId = client.atomicNextMessageSequenceId(), - sourceMessage = message + originalMessage = message ) sourceCallback(source) return ToFriend(client, toUin, message, source) @@ -339,7 +339,7 @@ internal class MessageSvc { toUin = Group.calculateGroupUinByGroupCode(groupCode), time = currentTimeSeconds + client.timeDifference, groupId = groupCode, - sourceMessage = message//, + originalMessage = message//, // sourceMessage = message ) sourceCallback(source) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt index 97703716c..d36d3579e 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt @@ -14,6 +14,7 @@ package net.mamoe.mirai.message.data import net.mamoe.mirai.Bot import net.mamoe.mirai.contact.Group +import net.mamoe.mirai.utils.LazyProperty import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmName @@ -64,14 +65,18 @@ interface MessageSource : Message, MessageMetadata { */ val groupId: Long + /** + * 原消息内容 + */ + @LazyProperty + val originalMessage: MessageChain + /** * 固定返回空字符串 ("") */ override fun toString(): String } -interface GroupMessageSource : MessageSource - /** * 序列号. 若是机器人发出去的消息, 请先 [确保 sequenceId 可用][MessageSource.ensureSequenceIdAvailable] * @see MessageSource.id