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}")
     })
 }