mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-06 00:50:13 +08:00
Introduce messageTarget for message elems conversions
Introduce messageTarget for message elems conversions Introduce messageTarget for message elems conversions
This commit is contained in:
parent
895c8f6bb3
commit
6ec0310b1a
@ -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,
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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()
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user