From ad8ffa6cd4b094e2d8fca237260548f9c0dad9c7 Mon Sep 17 00:00:00 2001 From: Him188 <Him188@mamoe.net> Date: Thu, 24 Dec 2020 17:46:41 +0800 Subject: [PATCH] Internal optimizations: simplify RequestPacket and jce struct sending --- .../protocol/data/jce/RequestPacket.kt | 9 +++--- .../data/jce/SvcRequestPushReadedNotify.kt | 2 +- .../network/protocol/packet/PacketFactory.kt | 1 + .../protocol/packet/chat/TroopManagement.kt | 8 +++--- .../packet/chat/receive/OnlinePush.ReqPush.kt | 6 ++-- .../protocol/packet/list/FriendList.kt | 24 ++++++++-------- .../protocol/packet/list/ProfileService.kt | 6 ++-- .../protocol/packet/login/ConfigPushSvc.kt | 8 +++--- .../kotlin/utils/io/serialization/utils.kt | 28 +++++++++++++++---- 9 files changed, 54 insertions(+), 38 deletions(-) diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/RequestPacket.kt b/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/RequestPacket.kt index 863fc4216..78117e0c9 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/RequestPacket.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/RequestPacket.kt @@ -13,18 +13,17 @@ import kotlinx.serialization.Serializable import net.mamoe.mirai.internal.network.protocol.packet.EMPTY_BYTE_ARRAY import net.mamoe.mirai.internal.utils.io.JceStruct import net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId -import kotlin.jvm.JvmField private val EMPTY_MAP = mapOf<String, String>() @Serializable internal class RequestPacket( - @TarsId(1) @JvmField val iVersion: Short? = 3, + @TarsId(1) @JvmField val version: Short? = 3, @TarsId(2) @JvmField val cPacketType: Byte = 0, @TarsId(3) @JvmField val iMessageType: Int = 0, - @TarsId(4) @JvmField val iRequestId: Int = 0, - @TarsId(5) @JvmField val sServantName: String = "", - @TarsId(6) @JvmField val sFuncName: String = "", + @TarsId(4) @JvmField val requestId: Int = 0, + @TarsId(5) @JvmField val servantName: String = "", + @TarsId(6) @JvmField val funcName: String = "", @TarsId(7) @JvmField val sBuffer: ByteArray = EMPTY_BYTE_ARRAY, @TarsId(8) @JvmField val iTimeout: Int? = 0, @TarsId(9) @JvmField val context: Map<String, String>? = EMPTY_MAP, diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SvcRequestPushReadedNotify.kt b/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SvcRequestPushReadedNotify.kt index b420e7d2c..e34be31a9 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SvcRequestPushReadedNotify.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SvcRequestPushReadedNotify.kt @@ -9,7 +9,7 @@ @file:Suppress("SpellCheckingInspection") -package net.mamoe.mirai.internal.network.protocol.data.jce +package net.mamoe.mirai.internal.network.protocol.data.jce import kotlinx.serialization.Serializable import net.mamoe.mirai.internal.utils.io.JceStruct diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/PacketFactory.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/PacketFactory.kt index 809d435f4..a8d5db02e 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/PacketFactory.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/PacketFactory.kt @@ -128,6 +128,7 @@ internal object KnownPacketFactories { WtLogin.Login, StatSvc.Register, StatSvc.GetOnlineStatus, + StatSvc.GetDevLoginInfo, MessageSvcPbGetMsg, MessageSvcPushForceOffline, MessageSvcPbSendMsg, diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/TroopManagement.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/TroopManagement.kt index c73b4f37c..cbd92f541 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/TroopManagement.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/TroopManagement.kt @@ -406,11 +406,11 @@ internal class TroopManagement { writeJceStruct( RequestPacket.serializer(), RequestPacket( - sFuncName = "ModifyGroupCardReq", - sServantName = "mqq.IMService.FriendListServiceServantObj", - iVersion = 3, + funcName = "ModifyGroupCardReq", + servantName = "mqq.IMService.FriendListServiceServantObj", + version = 3, cPacketType = 0x00, - iRequestId = client.nextRequestPacketRequestId(), + requestId = client.nextRequestPacketRequestId(), sBuffer = jceRequestSBuffer( "MGCREQ", ModifyGroupCardReq.serializer(), diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt index 307f7a6ee..457b8c6a8 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt @@ -135,9 +135,9 @@ internal object OnlinePushReqPush : IncomingPacketFactory<OnlinePushReqPush.ReqP writeJceStruct( RequestPacket.serializer(), RequestPacket( - sServantName = "OnlinePush", - sFuncName = "SvcRespPushMsg", - iRequestId = sequenceId, + servantName = "OnlinePush", + funcName = "SvcRespPushMsg", + requestId = sequenceId, sBuffer = jceRequestSBuffer( "resp", OnlinePushPack.SvcRespPushMsg.serializer(), diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/list/FriendList.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/list/FriendList.kt index 00943485c..73b2b4e9d 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/list/FriendList.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/list/FriendList.kt @@ -47,10 +47,10 @@ internal class FriendList { writeJceStruct( RequestPacket.serializer(), RequestPacket( - sFuncName = "GetTroopMemberListReq", - sServantName = "mqq.IMService.FriendListServiceServantObj", - iVersion = 3, - iRequestId = client.nextRequestPacketRequestId(), + funcName = "GetTroopMemberListReq", + servantName = "mqq.IMService.FriendListServiceServantObj", + version = 3, + requestId = client.nextRequestPacketRequestId(), sBuffer = jceRequestSBuffer( "GTML", GetTroopMemberListReq.serializer(), @@ -97,11 +97,11 @@ internal class FriendList { writeJceStruct( RequestPacket.serializer(), RequestPacket( - sFuncName = "GetTroopListReqV2Simplify", - sServantName = "mqq.IMService.FriendListServiceServantObj", - iVersion = 3, + funcName = "GetTroopListReqV2Simplify", + servantName = "mqq.IMService.FriendListServiceServantObj", + version = 3, cPacketType = 0x00, - iRequestId = client.nextRequestPacketRequestId(), + requestId = client.nextRequestPacketRequestId(), sBuffer = jceRequestSBuffer( "GetTroopListReqV2Simplify", GetTroopListReqV2Simplify.serializer(), @@ -153,11 +153,11 @@ internal class FriendList { writeJceStruct( RequestPacket.serializer(), RequestPacket( - sFuncName = "GetFriendListReq", - sServantName = "mqq.IMService.FriendListServiceServantObj", - iVersion = 3, + funcName = "GetFriendListReq", + servantName = "mqq.IMService.FriendListServiceServantObj", + version = 3, cPacketType = 0x003, - iRequestId = 1921334514, + requestId = 1921334514, sBuffer = jceRequestSBuffer( "FL", GetFriendListReq.serializer(), diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/list/ProfileService.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/list/ProfileService.kt index fa3a76999..105d6e969 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/list/ProfileService.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/list/ProfileService.kt @@ -40,9 +40,9 @@ internal class ProfileService { writeJceStruct( RequestPacket.serializer(), RequestPacket( - sServantName = "KQQ.ProfileService.ProfileServantObj", - sFuncName = "GroupMngReq", - iRequestId = client.nextRequestPacketRequestId(), + servantName = "KQQ.ProfileService.ProfileServantObj", + funcName = "GroupMngReq", + requestId = client.nextRequestPacketRequestId(), sBuffer = jceRequestSBuffer( "GroupMngReq", GroupMngReqJce.serializer(), diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/login/ConfigPushSvc.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/login/ConfigPushSvc.kt index d33748697..b3005a3f8 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/login/ConfigPushSvc.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/login/ConfigPushSvc.kt @@ -245,10 +245,10 @@ msfwifi.3g.qq.com ? writeJceStruct( RequestPacket.serializer(), RequestPacket( - iRequestId = 0, - iVersion = 3, - sServantName = "QQService.ConfigPushSvc.MainServant", - sFuncName = "PushResp", + requestId = 0, + version = 3, + servantName = "QQService.ConfigPushSvc.MainServant", + funcName = "PushResp", sBuffer = jceRequestSBuffer( "PushResp", PushResp.serializer(), diff --git a/mirai-core/src/commonMain/kotlin/utils/io/serialization/utils.kt b/mirai-core/src/commonMain/kotlin/utils/io/serialization/utils.kt index 18bb900e6..448c640b3 100644 --- a/mirai-core/src/commonMain/kotlin/utils/io/serialization/utils.kt +++ b/mirai-core/src/commonMain/kotlin/utils/io/serialization/utils.kt @@ -24,8 +24,6 @@ import net.mamoe.mirai.internal.utils.io.ProtoBuf import net.mamoe.mirai.internal.utils.io.readPacketExact import net.mamoe.mirai.internal.utils.io.serialization.tars.Tars import net.mamoe.mirai.internal.utils.read -import kotlin.jvm.JvmMultifileClass -import kotlin.jvm.JvmName internal fun <T : JceStruct> ByteArray.loadWithUniPacket( deserializer: DeserializationStrategy<T>, @@ -50,6 +48,24 @@ internal fun <T : JceStruct> ByteReadPacket.readJceStruct( return Tars.UTF_8.load(serializer, this.readPacketExact(length)) } +internal fun <T : JceStruct> BytePacketBuilder.writeJceRequestPacket( + version: Int = 3, + servantName: String, + funcName: String, + name: String = funcName, + serializer: SerializationStrategy<T>, + body: T +) = writeJceStruct( + RequestPacket.serializer(), + RequestPacket( + requestId = 0, + version = version.toShort(), + servantName = servantName, + funcName = funcName, + sBuffer = jceRequestSBuffer(name, serializer, body) + ) +) + /** * 先解析为 [RequestPacket], 即 `UniRequest`, 再按版本解析 map, 再找出指定数据并反序列化 */ @@ -85,15 +101,15 @@ private fun <K, V> Map<K, V>.firstValue(): V = this.entries.first().value private fun <R> ByteReadPacket.decodeUniRequestPacketAndDeserialize(name: String? = null, block: (ByteArray) -> R): R { val request = this.readJceStruct(RequestPacket.serializer()) - return block(if (name == null) when (request.iVersion?.toInt() ?: 3) { + return block(if (name == null) when (request.version?.toInt() ?: 3) { 2 -> request.sBuffer.loadAs(RequestDataVersion2.serializer()).map.firstValue().firstValue() 3 -> request.sBuffer.loadAs(RequestDataVersion3.serializer()).map.firstValue() - else -> error("unsupported version ${request.iVersion}") - } else when (request.iVersion?.toInt() ?: 3) { + else -> error("unsupported version ${request.version}") + } else when (request.version?.toInt() ?: 3) { 2 -> request.sBuffer.loadAs(RequestDataVersion2.serializer()).map.getOrElse(name) { error("cannot find $name") } .firstValue() 3 -> request.sBuffer.loadAs(RequestDataVersion3.serializer()).map.getOrElse(name) { error("cannot find $name") } - else -> error("unsupported version ${request.iVersion}") + else -> error("unsupported version ${request.version}") }) }