senderId, sourceMessage, groupId are now accessible from MessageSource

This commit is contained in:
Him188 2020-02-11 09:16:43 +08:00
parent 0d8e481efc
commit bfc516f350
4 changed files with 71 additions and 18 deletions

View File

@ -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<ImMsgBody.Elem>.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
}

View File

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

View File

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

View File

@ -23,6 +23,21 @@ interface MessageSource : Message {
*/
val messageUid: Long
/**
* 发送人号码
*/
val senderId: Long
/**
* 群号码
*/
val groupId: Long
/**
* 原消息内容
*/
val sourceMessage: MessageChain
/**
* 固定返回空字符串 ("")
*/