Commit bfc516f3 authored by Him188's avatar Him188

senderId, sourceMessage, groupId are now accessible from MessageSource

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