From c044c64b82b12935cb09f3e74fd59c753b23a82f Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Fri, 31 Jan 2020 19:58:18 +0800
Subject: [PATCH] Try fix group list

---
 .../network/QQAndroidBotNetworkHandler.kt       |  2 ++
 .../protocol/packet/list/FriendListPacket.kt    | 11 ++++++-----
 .../protocol/packet/login/LoginPacket.kt        |  6 ++++--
 .../kotlin/androidPacketTests/serverToClient.kt | 17 ++++++++++++-----
 4 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt
index fb51a07b2..a60ff3c08 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt
@@ -111,6 +111,8 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
             2
         ).sendAndExpect<FriendList.GetFriendGroupList.Response>()
          */
+        delay(2000)
+
         val data = FriendList.GetTroopList(
             bot.client
         ).sendAndExpect<FriendList.GetTroopList.Response>()
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/list/FriendListPacket.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/list/FriendListPacket.kt
index 9414fed14..1a5d9d0ff 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/list/FriendListPacket.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/list/FriendListPacket.kt
@@ -54,12 +54,13 @@ internal class FriendList {
                             GetTroopListReqV2Simplify.serializer(),
                             GetTroopListReqV2Simplify(
                                 uin = client.uin,
-                                getMSFMsgFlag = 0,
-                                groupFlagExt = 1,
-                                shVersion = 7,
+                                getMSFMsgFlag = 0, // const
+                                groupFlagExt = 1,// const
+                                shVersion = 7, // const
                                 dwCompanyId = 0,
-                                versionNum = 1,
-                                getLongGroupName = 1
+                                versionNum = 1, // const
+                                vecGroupInfo = listOf(),
+                                getLongGroupName = 1// const
                             )
                         )
                     )
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt
index eaf81934b..0ec5f14f2 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt
@@ -294,13 +294,15 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt
 
         data class UnsafeLogin(val url: String) : LoginPacketResponse()
 
-        class SMSVerifyCodeNeeded(val t402: ByteArray, val t403: ByteArray) : LoginPacketResponse(){
+        class SMSVerifyCodeNeeded(val t402: ByteArray, val t403: ByteArray) : LoginPacketResponse() {
             override fun toString(): String {
                 return "LoginPacketResponse.SMSVerifyCodeNeeded"
             }
         }
 
-        class DeviceLockLogin(val t402: ByteArray, val t403: ByteArray) : LoginPacketResponse()
+        class DeviceLockLogin(val t402: ByteArray, val t403: ByteArray) : LoginPacketResponse() {
+            override fun toString(): String = "LoginPacket.LoginPacketResponse.DeviceLockLogin"
+        }
     }
 
     @InternalAPI
diff --git a/mirai-core-qqandroid/src/jvmTest/kotlin/androidPacketTests/serverToClient.kt b/mirai-core-qqandroid/src/jvmTest/kotlin/androidPacketTests/serverToClient.kt
index 77ca2dbfe..86de2110a 100644
--- a/mirai-core-qqandroid/src/jvmTest/kotlin/androidPacketTests/serverToClient.kt
+++ b/mirai-core-qqandroid/src/jvmTest/kotlin/androidPacketTests/serverToClient.kt
@@ -12,6 +12,7 @@ import net.mamoe.mirai.utils.cryptor.ECDH
 import net.mamoe.mirai.utils.cryptor.adjustToPublicKey
 import net.mamoe.mirai.utils.cryptor.decryptBy
 import net.mamoe.mirai.utils.io.*
+import net.mamoe.mirai.utils.unzip
 
 /*
  */
@@ -67,7 +68,6 @@ private fun processFullPacketWithoutLength(packet: ByteReadPacket) {
         PacketLogger.verbose("包类型(flag2) = $flag2. (可能是 ${if (flag2 == 2) "sso" else "uni"})")
 
         val flag3 = readByte().toInt()
-        check(flag3 == 0) { "Illegal flag3. Expected 0, got $flag3" }
 
         val uinAccount = readString(readInt() - 4)//uin
 
@@ -88,9 +88,9 @@ private fun processFullPacketWithoutLength(packet: ByteReadPacket) {
             this.readBytes().tryDecryptOrNull()?.toReadPacket()
         }?.debugPrint("sso/uni body=")?.let {
             if (flag1 == 0x0A) {
-                parseSsoFrame(it)
+                parseSsoFrame(flag3, it)
             } else {
-                parseSsoFrame(it)
+                parseSsoFrame(flag3, it)
             }
         }?.let {
             val bytes = it.data.readBytes()
@@ -205,7 +205,7 @@ private fun ByteReadPacket.parseOicqResponse(body: ByteReadPacket.() -> Unit) {
  * 解析 SSO 层包装
  */
 @UseExperimental(ExperimentalUnsignedTypes::class)
-private fun parseSsoFrame(input: ByteReadPacket): KnownPacketFactories.IncomingPacket {
+private fun parseSsoFrame(flag3: Int, input: ByteReadPacket): KnownPacketFactories.IncomingPacket {
     val commandName: String
     val ssoSequenceId: Int
 
@@ -232,7 +232,14 @@ private fun parseSsoFrame(input: ByteReadPacket): KnownPacketFactories.IncomingP
         println("找不到包 PacketFactory")
         PacketLogger.verbose("传递给 PacketFactory 的数据 = ${input.readBytes().toUHexString()}")
     }
-    return KnownPacketFactories.IncomingPacket(packetFactory, ssoSequenceId, input)
+
+    var data = input.readBytes()
+    if (flag3 == 1) {
+        data = data.unzip(offset = 4)
+    } else {
+
+    }
+    return KnownPacketFactories.IncomingPacket(packetFactory, ssoSequenceId, data.toReadPacket())
 }