Add MessageSource.originalMessage

This commit is contained in:
Him188 2020-03-01 14:40:51 +08:00
parent 58b1a4d7e3
commit bbf991103d
3 changed files with 32 additions and 18 deletions

View File

@ -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(
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(
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(
} 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(
), ),
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(
), ),
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(
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 {
} }
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(
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(
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>

View File

@ -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 {
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)

View File

@ -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 {
*/ */
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