Commit bbf99110 authored by Him188's avatar Him188

Add `MessageSource.originalMessage`

parent 58b1a4d7
...@@ -26,11 +26,15 @@ import net.mamoe.mirai.qqandroid.network.protocol.data.proto.SourceMsg ...@@ -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.qqandroid.network.protocol.packet.chat.receive.OnlinePush
import net.mamoe.mirai.utils.MiraiExperimentalAPI import net.mamoe.mirai.utils.MiraiExperimentalAPI
internal inline class MessageSourceFromServer( internal class MessageSourceFromServer(
val delegate: ImMsgBody.SourceMsg val delegate: ImMsgBody.SourceMsg
) : MessageSource { ) : MessageSource {
override val time: Long get() = delegate.time.toLong() and 0xFFFFFFFF override val time: Long get() = delegate.time.toLong() and 0xFFFFFFFF
override val originalMessage: MessageChain by lazy {
delegate.toMessageChain()
}
override val id: Long override val id: Long
get() = (delegate.origSeqs?.firstOrNull() get() = (delegate.origSeqs?.firstOrNull()
?: error("cannot find sequenceId from ImMsgBody.SourceMsg")).toLong().shl(32) or ?: error("cannot find sequenceId from ImMsgBody.SourceMsg")).toLong().shl(32) or
...@@ -49,12 +53,12 @@ internal inline class MessageSourceFromServer( ...@@ -49,12 +53,12 @@ internal inline class MessageSourceFromServer(
override fun toString(): String = "" override fun toString(): String = ""
} }
internal inline class MessageSourceFromMsg( internal class MessageSourceFromMsg(
val delegate: MsgComm.Msg val delegate: MsgComm.Msg
) : MessageSource { ) : MessageSource {
override val time: Long get() = delegate.msgHead.msgTime.toLong() and 0xFFFFFFFF override val time: Long get() = delegate.msgHead.msgTime.toLong() and 0xFFFFFFFF
override val id: Long override val id: Long =
get() = delegate.msgHead.msgSeq.toLong().shl(32) or delegate.msgHead.msgSeq.toLong().shl(32) or
delegate.msgBody.richText.attr!!.random.toLong().and(0xFFFFFFFF) delegate.msgBody.richText.attr!!.random.toLong().and(0xFFFFFFFF)
override suspend fun ensureSequenceIdAvailable() { override suspend fun ensureSequenceIdAvailable() {
...@@ -64,6 +68,9 @@ internal inline class MessageSourceFromMsg( ...@@ -64,6 +68,9 @@ internal inline class MessageSourceFromMsg(
override val toUin: Long get() = delegate.msgHead.toUin override val toUin: Long get() = delegate.msgHead.toUin
override val senderId: Long get() = delegate.msgHead.fromUin override val senderId: Long get() = delegate.msgHead.fromUin
override val groupId: Long get() = delegate.msgHead.groupInfo?.groupCode ?: 0 override val groupId: Long get() = delegate.msgHead.groupInfo?.groupCode ?: 0
override val originalMessage: MessageChain by lazy {
delegate.toMessageChain()
}
fun toJceData(): ImMsgBody.SourceMsg { fun toJceData(): ImMsgBody.SourceMsg {
return if (groupId == 0L) { return if (groupId == 0L) {
...@@ -71,6 +78,12 @@ internal inline class MessageSourceFromMsg( ...@@ -71,6 +78,12 @@ internal inline class MessageSourceFromMsg(
} else toJceDataImplForGroup() } 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 { private fun toJceDataImplForFriend(): ImMsgBody.SourceMsg {
return ImMsgBody.SourceMsg( return ImMsgBody.SourceMsg(
origSeqs = listOf(delegate.msgHead.msgSeq), origSeqs = listOf(delegate.msgHead.msgSeq),
...@@ -97,9 +110,7 @@ internal inline class MessageSourceFromMsg( ...@@ -97,9 +110,7 @@ internal inline class MessageSourceFromMsg(
), ),
msgBody = ImMsgBody.MsgBody( msgBody = ImMsgBody.MsgBody(
richText = ImMsgBody.RichText( richText = ImMsgBody.RichText(
elems = delegate.msgBody.richText.elems.also { elems = elems
if (it.last().elemFlags2 == null) it.add(ImMsgBody.Elem(elemFlags2 = ImMsgBody.ElemFlags2()))
}
) )
) )
).toByteArray(MsgComm.Msg.serializer()) ).toByteArray(MsgComm.Msg.serializer())
...@@ -135,9 +146,7 @@ internal inline class MessageSourceFromMsg( ...@@ -135,9 +146,7 @@ internal inline class MessageSourceFromMsg(
), ),
msgBody = ImMsgBody.MsgBody( msgBody = ImMsgBody.MsgBody(
richText = ImMsgBody.RichText( richText = ImMsgBody.RichText(
elems = delegate.msgBody.richText.elems.also { elems = elems
if (it.last().elemFlags2 == null) it.add(ImMsgBody.Elem(elemFlags2 = ImMsgBody.ElemFlags2()))
}
) )
) )
).toByteArray(MsgComm.Msg.serializer()) ).toByteArray(MsgComm.Msg.serializer())
...@@ -149,7 +158,7 @@ internal inline class MessageSourceFromMsg( ...@@ -149,7 +158,7 @@ internal inline class MessageSourceFromMsg(
internal abstract class MessageSourceFromSend : MessageSource { internal abstract class MessageSourceFromSend : MessageSource {
abstract val sourceMessage: MessageChain abstract override val originalMessage: MessageChain
fun toJceData(): ImMsgBody.SourceMsg { fun toJceData(): ImMsgBody.SourceMsg {
return if (groupId == 0L) { return if (groupId == 0L) {
...@@ -158,7 +167,7 @@ internal abstract class MessageSourceFromSend : MessageSource { ...@@ -158,7 +167,7 @@ internal abstract class MessageSourceFromSend : MessageSource {
} }
private val elems by lazy { private val elems by lazy {
sourceMessage.toRichTextElems(groupId != 0L) originalMessage.toRichTextElems(groupId != 0L)
} }
private fun toJceDataImplForFriend(): ImMsgBody.SourceMsg { private fun toJceDataImplForFriend(): ImMsgBody.SourceMsg {
...@@ -242,7 +251,7 @@ internal class MessageSourceFromSendFriend( ...@@ -242,7 +251,7 @@ internal class MessageSourceFromSendFriend(
override val toUin: Long, override val toUin: Long,
override val groupId: Long, override val groupId: Long,
val sequenceId: Int, val sequenceId: Int,
override val sourceMessage: MessageChain override val originalMessage: MessageChain
) : MessageSourceFromSend() { ) : MessageSourceFromSend() {
@UseExperimental(ExperimentalCoroutinesApi::class) @UseExperimental(ExperimentalCoroutinesApi::class)
override val id: Long override val id: Long
...@@ -264,7 +273,7 @@ internal class MessageSourceFromSendGroup( ...@@ -264,7 +273,7 @@ internal class MessageSourceFromSendGroup(
override val senderId: Long, override val senderId: Long,
override val toUin: Long, override val toUin: Long,
override val groupId: Long, override val groupId: Long,
override val sourceMessage: MessageChain override val originalMessage: MessageChain
) : MessageSourceFromSend() { ) : MessageSourceFromSend() {
private lateinit var sequenceIdDeferred: Deferred<Int> private lateinit var sequenceIdDeferred: Deferred<Int>
......
...@@ -289,7 +289,7 @@ internal class MessageSvc { ...@@ -289,7 +289,7 @@ internal class MessageSvc {
time = currentTimeSeconds + client.timeDifference, time = currentTimeSeconds + client.timeDifference,
groupId = 0, groupId = 0,
sequenceId = client.atomicNextMessageSequenceId(), sequenceId = client.atomicNextMessageSequenceId(),
sourceMessage = message originalMessage = message
) )
sourceCallback(source) sourceCallback(source)
return ToFriend(client, toUin, message, source) return ToFriend(client, toUin, message, source)
...@@ -339,7 +339,7 @@ internal class MessageSvc { ...@@ -339,7 +339,7 @@ internal class MessageSvc {
toUin = Group.calculateGroupUinByGroupCode(groupCode), toUin = Group.calculateGroupUinByGroupCode(groupCode),
time = currentTimeSeconds + client.timeDifference, time = currentTimeSeconds + client.timeDifference,
groupId = groupCode, groupId = groupCode,
sourceMessage = message//, originalMessage = message//,
// sourceMessage = message // sourceMessage = message
) )
sourceCallback(source) sourceCallback(source)
......
...@@ -14,6 +14,7 @@ package net.mamoe.mirai.message.data ...@@ -14,6 +14,7 @@ package net.mamoe.mirai.message.data
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.utils.LazyProperty
import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmMultifileClass
import kotlin.jvm.JvmName import kotlin.jvm.JvmName
...@@ -64,14 +65,18 @@ interface MessageSource : Message, MessageMetadata { ...@@ -64,14 +65,18 @@ interface MessageSource : Message, MessageMetadata {
*/ */
val groupId: Long val groupId: Long
/**
* 原消息内容
*/
@LazyProperty
val originalMessage: MessageChain
/** /**
* 固定返回空字符串 ("") * 固定返回空字符串 ("")
*/ */
override fun toString(): String override fun toString(): String
} }
interface GroupMessageSource : MessageSource
/** /**
* 序列号. 若是机器人发出去的消息, 请先 [确保 sequenceId 可用][MessageSource.ensureSequenceIdAvailable] * 序列号. 若是机器人发出去的消息, 请先 [确保 sequenceId 可用][MessageSource.ensureSequenceIdAvailable]
* @see MessageSource.id * @see MessageSource.id
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment