Introduce messageTarget for message elems conversions

Introduce messageTarget for message elems conversions

Introduce messageTarget for message elems conversions
This commit is contained in:
Him188 2020-12-14 12:55:06 +08:00
parent 895c8f6bb3
commit 6ec0310b1a
6 changed files with 38 additions and 29 deletions

View File

@ -577,7 +577,7 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
val data = message.calculateValidationDataForGroup(
sequenceId = sequenceId,
random = Random.nextInt().absoluteValue,
groupCode = groupCode
group
)
val response =
@ -837,7 +837,7 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
toUin = 0,
flag = 1,
elems = originalMessage.toRichTextElems(
forGroup = kind == MessageSourceKind.GROUP,
null, //forGroup = kind == MessageSourceKind.GROUP,
withGeneralFlags = false
),
type = 0,

View File

@ -31,6 +31,7 @@ import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
internal inline val Group.uin: Long get() = this.cast<GroupImpl>().uin
internal inline val Group.groupCode: Long get() = this.id
internal inline val User.uin: Long get() = this.id
internal inline val Bot.uin: Long get() = this.id

View File

@ -18,6 +18,8 @@ import kotlinx.io.core.readUInt
import kotlinx.io.core.toByteArray
import net.mamoe.mirai.Bot
import net.mamoe.mirai.LowLevelApi
import net.mamoe.mirai.contact.ContactOrBot
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.internal.network.protocol.data.proto.HummerCommelem
import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody
import net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm
@ -25,6 +27,7 @@ import net.mamoe.mirai.internal.utils.*
import net.mamoe.mirai.internal.utils.io.serialization.loadAs
import net.mamoe.mirai.internal.utils.io.serialization.toByteArray
import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.utils.safeCast
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
@ -37,7 +40,11 @@ private val UNSUPPORTED_VOICE_MESSAGE_PLAIN = PlainText("收到语音消息,
@OptIn(ExperimentalStdlibApi::class)
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
internal fun MessageChain.toRichTextElems(forGroup: Boolean, withGeneralFlags: Boolean): MutableList<ImMsgBody.Elem> {
internal fun MessageChain.toRichTextElems(
messageTarget: ContactOrBot?,
withGeneralFlags: Boolean
): MutableList<ImMsgBody.Elem> {
val forGroup = messageTarget is Group
val elements = ArrayList<ImMsgBody.Elem>(this.size)
if (this.anyIsInstance<QuoteReply>()) {
@ -112,7 +119,7 @@ internal fun MessageChain.toRichTextElems(forGroup: Boolean, withGeneralFlags: B
)
}
is At -> {
elements.add(ImMsgBody.Elem(text = it.toJceData()))
elements.add(ImMsgBody.Elem(text = it.toJceData(messageTarget.safeCast())))
// elements.add(ImMsgBody.Elem(text = ImMsgBody.Text(str = " ")))
// removed by https://github.com/mamoe/mirai/issues/524
// 发送 QuoteReply 消息时无可避免的产生多余空格 #524

View File

@ -16,6 +16,7 @@ import kotlinx.coroutines.Deferred
import kotlinx.coroutines.ExperimentalCoroutinesApi
import net.mamoe.mirai.Bot
import net.mamoe.mirai.Mirai
import net.mamoe.mirai.contact.ContactOrBot
import net.mamoe.mirai.contact.Friend
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member
@ -32,10 +33,10 @@ import net.mamoe.mirai.message.data.OnlineMessageSource
import java.util.concurrent.atomic.AtomicBoolean
private fun <T> T.toJceDataImpl(): ImMsgBody.SourceMsg
private fun <T> T.toJceDataImpl(subject: ContactOrBot?): ImMsgBody.SourceMsg
where T : MessageSourceInternal, T : MessageSource {
val elements = originalMessage.toRichTextElems(forGroup = false, withGeneralFlags = true)
val elements = originalMessage.toRichTextElems(subject, withGeneralFlags = true)
val pdReserve = SourceMsg.ResvAttr(
origUids = sequenceIds.zip(internalIds)
@ -87,7 +88,7 @@ internal class MessageSourceToFriendImpl(
override val ids: IntArray
get() = sequenceIds
override var isRecalledOrPlanned: AtomicBoolean = AtomicBoolean(false)
private val jceData by lazy { toJceDataImpl() }
private val jceData by lazy { toJceDataImpl(subject) }
override fun toJceData(): ImMsgBody.SourceMsg = jceData
}
@ -104,7 +105,7 @@ internal class MessageSourceToTempImpl(
override val ids: IntArray
get() = sequenceIds
override var isRecalledOrPlanned: AtomicBoolean = AtomicBoolean(false)
private val jceData by lazy { toJceDataImpl() }
private val jceData by lazy { toJceDataImpl(subject) }
override fun toJceData(): ImMsgBody.SourceMsg = jceData
}
@ -144,7 +145,7 @@ internal class MessageSourceToGroupImpl(
suspend fun ensureSequenceIdAvailable() = kotlin.run { sequenceIdDeferred.await() }
private val jceData by lazy {
val elements = originalMessage.toRichTextElems(forGroup = false, withGeneralFlags = true)
val elements = originalMessage.toRichTextElems(subject, withGeneralFlags = true)
ImMsgBody.SourceMsg(
origSeqs = sequenceIds,
senderUin = fromId,

View File

@ -12,7 +12,9 @@
package net.mamoe.mirai.internal.network.protocol.packet.chat
import kotlinx.io.core.ByteReadPacket
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.internal.QQAndroidBot
import net.mamoe.mirai.internal.contact.groupCode
import net.mamoe.mirai.internal.message.toRichTextElems
import net.mamoe.mirai.internal.network.Packet
import net.mamoe.mirai.internal.network.QQAndroidClient
@ -46,7 +48,7 @@ internal inline fun Int.toLongUnsigned(): Long = this.toLong().and(0xFFFF_FFFF)
internal fun Collection<ForwardMessage.INode>.calculateValidationDataForGroup(
sequenceId: Int,
random: Int,
groupCode: Long
targetGroup: Group,
): MessageValidationData {
val msgList = map { chain ->
MsgComm.Msg(
@ -61,7 +63,7 @@ internal fun Collection<ForwardMessage.INode>.calculateValidationDataForGroup(
),
msgType = 82, // troop
groupInfo = MsgComm.GroupInfo(
groupCode = groupCode,
groupCode = targetGroup.groupCode,
groupCard = chain.senderName // Cinnamon
),
isSrcMsg = false
@ -69,7 +71,7 @@ internal fun Collection<ForwardMessage.INode>.calculateValidationDataForGroup(
msgBody = ImMsgBody.MsgBody(
richText = ImMsgBody.RichText(
elems = chain.message.asMessageChain()
.toRichTextElems(forGroup = true, withGeneralFlags = false).toMutableList()
.toRichTextElems(targetGroup, withGeneralFlags = false).toMutableList()
)
)
)

View File

@ -15,7 +15,8 @@ import net.mamoe.mirai.contact.Friend
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.internal.QQAndroidBot
import net.mamoe.mirai.internal.contact.GroupImpl
import net.mamoe.mirai.internal.contact.groupCode
import net.mamoe.mirai.internal.contact.uin
import net.mamoe.mirai.internal.message.MessageSourceToFriendImpl
import net.mamoe.mirai.internal.message.MessageSourceToGroupImpl
import net.mamoe.mirai.internal.message.MessageSourceToTempImpl
@ -34,7 +35,6 @@ import net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf
import net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.message.data.PttMessage
import net.mamoe.mirai.message.data.firstOrNull
import net.mamoe.mirai.utils.currentTimeSeconds
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
@ -62,7 +62,7 @@ internal object MessageSvcPbSendMsg : OutgoingPacketFactory<MessageSvcPbSendMsg.
@Suppress("FunctionName")
internal fun createToFriendImpl(
client: QQAndroidClient,
toUin: Long,
targetFriend: Friend,
message: MessageChain,
source: MessageSourceToFriendImpl
): OutgoingPacket = buildOutgoingUniPacket(client) {
@ -71,11 +71,11 @@ internal object MessageSvcPbSendMsg : OutgoingPacketFactory<MessageSvcPbSendMsg.
///return@buildOutgoingUniPacket
writeProtoBuf(
MsgSvc.PbSendMsgReq.serializer(), MsgSvc.PbSendMsgReq(
routingHead = MsgSvc.RoutingHead(c2c = MsgSvc.C2C(toUin = toUin)),
routingHead = MsgSvc.RoutingHead(c2c = MsgSvc.C2C(toUin = targetFriend.uin)),
contentHead = MsgComm.ContentHead(pkgNum = 1),
msgBody = ImMsgBody.MsgBody(
richText = ImMsgBody.RichText(
elems = message.toRichTextElems(forGroup = false, withGeneralFlags = true)
elems = message.toRichTextElems(messageTarget = targetFriend, withGeneralFlags = true)
)
),
msgSeq = source.sequenceIds.single(),
@ -92,20 +92,19 @@ internal object MessageSvcPbSendMsg : OutgoingPacketFactory<MessageSvcPbSendMsg.
*/
internal fun createToTempImpl(
client: QQAndroidClient,
groupUin: Long,
toUin: Long,
targetMember: Member,
message: MessageChain,
source: MessageSourceToTempImpl
): OutgoingPacket = buildOutgoingUniPacket(client) {
writeProtoBuf(
MsgSvc.PbSendMsgReq.serializer(), MsgSvc.PbSendMsgReq(
routingHead = MsgSvc.RoutingHead(
grpTmp = MsgSvc.GrpTmp(groupUin, toUin)
grpTmp = MsgSvc.GrpTmp(targetMember.group.uin, targetMember.id)
),
contentHead = MsgComm.ContentHead(pkgNum = 1),
msgBody = ImMsgBody.MsgBody(
richText = ImMsgBody.RichText(
elems = message.toRichTextElems(forGroup = false, withGeneralFlags = true)
elems = message.toRichTextElems(messageTarget = targetMember, withGeneralFlags = true)
)
),
msgSeq = source.sequenceIds.single(),
@ -122,7 +121,7 @@ internal object MessageSvcPbSendMsg : OutgoingPacketFactory<MessageSvcPbSendMsg.
@Suppress("FunctionName")
internal fun createToGroupImpl(
client: QQAndroidClient,
groupCode: Long,
targetGroup: Group,
message: MessageChain,
isForward: Boolean,
source: MessageSourceToGroupImpl
@ -134,12 +133,12 @@ internal object MessageSvcPbSendMsg : OutgoingPacketFactory<MessageSvcPbSendMsg.
///return@buildOutgoingUniPacket
writeProtoBuf(
MsgSvc.PbSendMsgReq.serializer(), MsgSvc.PbSendMsgReq(
routingHead = MsgSvc.RoutingHead(grp = MsgSvc.Grp(groupCode = groupCode)),
routingHead = MsgSvc.RoutingHead(grp = MsgSvc.Grp(groupCode = targetGroup.groupCode)),
contentHead = MsgComm.ContentHead(pkgNum = 1),
msgBody = ImMsgBody.MsgBody(
richText = ImMsgBody.RichText(
elems = message.toRichTextElems(forGroup = true, withGeneralFlags = true),
ptt = message.firstOrNull(PttMessage)?.run {
elems = message.toRichTextElems(messageTarget = targetGroup, withGeneralFlags = true),
ptt = message.get(PttMessage)?.run {
ImMsgBody.Ptt(
fileName = fileName.toByteArray(),
fileMd5 = md5,
@ -196,8 +195,7 @@ internal inline fun MessageSvcPbSendMsg.createToTemp(
sourceCallback(source)
return createToTempImpl(
client,
(member.group as GroupImpl).uin,
member.id,
member,
message,
source
)
@ -224,7 +222,7 @@ internal inline fun MessageSvcPbSendMsg.createToFriend(
sourceCallback(source)
return createToFriendImpl(
client,
qq.id,
qq,
message,
source
)
@ -252,7 +250,7 @@ internal inline fun MessageSvcPbSendMsg.createToGroup(
sourceCallback(source)
return createToGroupImpl(
client,
group.id,
group,
message,
isForward,
source