diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageQQA.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageQQA.kt index e6fe6a870..0dce62349 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageQQA.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageQQA.kt @@ -274,12 +274,30 @@ internal class NotOnlineImageFromServer( @UseExperimental(ExperimentalUnsignedTypes::class, MiraiInternalAPI::class) internal fun MsgComm.Msg.toMessageChain(): MessageChain { - val elems = this.msgBody.richText.elems + val elements = this.msgBody.richText.elems - val message = MessageChain(initialCapacity = elems.size + 1) + val message = MessageChain(initialCapacity = elements.size + 1) message.add(MessageSourceFromMsg(delegate = this)) + elements.joinToMessageChain(message) + return message +} - elems.forEach { +// These two functions are not the same. + +@UseExperimental(ExperimentalUnsignedTypes::class, MiraiInternalAPI::class) +internal fun ImMsgBody.SourceMsg.toMessageChain(): MessageChain { + val elements = this.elems!! + + val message = MessageChain(initialCapacity = elements.size + 1) + message.add(MessageSourceFromServer(delegate = this)) + elements.joinToMessageChain(message) + return message +} + + +@UseExperimental(MiraiInternalAPI::class) +internal fun List.joinToMessageChain(message: MessageChain) { + this.forEach { when { it.srcMsg != null -> message.add(QuoteReply(MessageSourceFromServer(it.srcMsg))) it.notOnlineImage != null -> message.add(NotOnlineImageFromServer(it.notOnlineImage)) @@ -296,5 +314,4 @@ internal fun MsgComm.Msg.toMessageChain(): MessageChain { } } - return message } \ No newline at end of file diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageSourceFromMsg.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageSourceFromMsg.kt index be9d4521e..c8e77f7d3 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageSourceFromMsg.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageSourceFromMsg.kt @@ -10,6 +10,7 @@ package net.mamoe.mirai.qqandroid.message import net.mamoe.mirai.contact.Group +import net.mamoe.mirai.message.data.MessageChain import net.mamoe.mirai.message.data.MessageSource import net.mamoe.mirai.qqandroid.io.serialization.loadAs import net.mamoe.mirai.qqandroid.io.serialization.toByteArray @@ -20,8 +21,10 @@ import net.mamoe.mirai.qqandroid.network.protocol.data.proto.SourceMsg internal inline class MessageSourceFromServer( val delegate: ImMsgBody.SourceMsg ) : MessageSource { - override val messageUid: Long - get() = delegate.pbReserve.loadAs(SourceMsg.ResvAttr.serializer()).origUids!! + override val messageUid: Long get() = delegate.pbReserve.loadAs(SourceMsg.ResvAttr.serializer()).origUids!! + override val sourceMessage: MessageChain get() = delegate.toMessageChain() + override val senderId: Long get() = delegate.senderUin + override val groupId: Long get() = Group.calculateGroupCodeByGroupUin(delegate.toUin) override fun toString(): String = "" } @@ -29,12 +32,14 @@ internal inline class MessageSourceFromServer( internal inline class MessageSourceFromMsg( val delegate: MsgComm.Msg ) : MessageSource { - override val messageUid: Long - get() = delegate.msgBody.richText.attr!!.random.toLong() + override val messageUid: Long get() = delegate.msgBody.richText.attr!!.random.toLong() + override val sourceMessage: MessageChain get() = delegate.toMessageChain() + override val senderId: Long get() = delegate.msgHead.fromUin + override val groupId: Long get() = delegate.msgHead.groupInfo!!.groupCode fun toJceData(): ImMsgBody.SourceMsg { - val groupUin = Group.calculateGroupIdByGroupCode(delegate.msgHead.groupInfo!!.groupCode) + val groupUin = Group.calculateGroupUinByGroupCode(delegate.msgHead.groupInfo!!.groupCode) return ImMsgBody.SourceMsg( origSeqs = listOf(delegate.msgHead.msgSeq), diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Group.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Group.kt index 9f4ca0679..128b63a19 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Group.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Group.kt @@ -111,21 +111,37 @@ interface Group : Contact, CoroutineScope { /** * by @kar98k */ - fun calculateGroupIdByGroupCode(groupCode: Long): Long { + fun calculateGroupUinByGroupCode(groupCode: Long): Long { var left: Long = groupCode / 1000000L - when { - left <= 10 -> left += 202 - left <= 19 -> left += 480 - 11 - left <= 66 -> left += 2100 - 20 - left <= 156 -> left += 2010 - 67 - left <= 209 -> left += 2147 - 157 - left <= 309 -> left += 4100 - 210 - left <= 499 -> left += 3800 - 310 + when (left) { + in 0..10 -> left += 202 + in 11..19 -> left += 480 - 11 + in 20..66 -> left += 2100 - 20 + in 67..156 -> left += 2010 - 67 + in 157..209 -> left += 2147 - 157 + in 210..309 -> left += 4100 - 210 + in 310..499 -> left += 3800 - 310 } return left * 1000000L + groupCode % 1000000L } + + fun calculateGroupCodeByGroupUin(groupUin: Long): Long { + var left: Long = groupUin / 1000000L + + when (left) { + in 0 + 202..10 + 202 -> left -= 202 + in 11 + 480 - 11..19 + 480 - 11 -> left -= 480 - 11 + in 20 + 2100 - 20..66 + 2100 - 20 -> left -= 2100 - 20 + in 67 + 2010 - 67..156 + 2010 - 67 -> left -= 2010 - 67 + in 157 + 2147 - 157..209 + 2147 - 157 -> left -= 2147 - 157 + in 210 + 4100 - 210..309 + 4100 - 210 -> left -= 4100 - 210 + in 310 + 3800 - 310..499 + 3800 - 310 -> left -= 3800 - 310 + } + + return left * 1000000L + groupUin % 1000000L + } } @MiraiExperimentalAPI 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 535af6681..c133938a8 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 @@ -23,6 +23,21 @@ interface MessageSource : Message { */ val messageUid: Long + /** + * 发送人号码 + */ + val senderId: Long + + /** + * 群号码 + */ + val groupId: Long + + /** + * 原消息内容 + */ + val sourceMessage: MessageChain + /** * 固定返回空字符串 ("") */