Переглянути джерело

Make QQAndroidClient lighter

Him188 4 роки тому
батько
коміт
4446479e80

+ 1 - 1
mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt

@@ -18,7 +18,7 @@ import net.mamoe.mirai.event.events.*
 import net.mamoe.mirai.internal.message.OfflineFriendImage
 import net.mamoe.mirai.internal.message.contextualBugReportException
 import net.mamoe.mirai.internal.message.getImageType
-import net.mamoe.mirai.internal.network.BdhSession
+import net.mamoe.mirai.internal.network.handler.BdhSession
 import net.mamoe.mirai.internal.network.highway.ChannelKind
 import net.mamoe.mirai.internal.network.highway.Highway
 import net.mamoe.mirai.internal.network.highway.ResourceKind.PRIVATE_IMAGE

+ 1 - 1
mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt

@@ -22,7 +22,7 @@ import net.mamoe.mirai.event.events.*
 import net.mamoe.mirai.internal.QQAndroidBot
 import net.mamoe.mirai.internal.contact.info.MemberInfoImpl
 import net.mamoe.mirai.internal.message.OfflineGroupImage
-import net.mamoe.mirai.internal.network.BdhSession
+import net.mamoe.mirai.internal.network.handler.BdhSession
 import net.mamoe.mirai.internal.network.handler.NetworkHandler
 import net.mamoe.mirai.internal.network.highway.ChannelKind
 import net.mamoe.mirai.internal.network.highway.Highway

+ 20 - 57
mirai-core/src/commonMain/kotlin/network/QQAndroidClient.kt

@@ -7,18 +7,15 @@
  *  https://github.com/mamoe/mirai/blob/master/LICENSE
  */
 
-@file:Suppress("NOTHING_TO_INLINE", "EXPERIMENTAL_API_USAGE", "DEPRECATION_ERROR")
+@file:Suppress("NOTHING_TO_INLINE", "EXPERIMENTAL_API_USAGE", "DEPRECATION_ERROR", "unused")
 
 package net.mamoe.mirai.internal.network
 
 import kotlinx.atomicfu.AtomicBoolean
 import kotlinx.atomicfu.AtomicInt
 import kotlinx.atomicfu.atomic
-import kotlinx.io.core.BytePacketBuilder
 import kotlinx.io.core.String
 import kotlinx.io.core.toByteArray
-import kotlinx.io.core.writeFully
-import kotlinx.serialization.Serializable
 import net.mamoe.mirai.data.OnlineStatus
 import net.mamoe.mirai.internal.BotAccount
 import net.mamoe.mirai.internal.QQAndroidBot
@@ -30,7 +27,6 @@ import net.mamoe.mirai.internal.utils.MiraiProtocolInternal
 import net.mamoe.mirai.internal.utils.NetworkType
 import net.mamoe.mirai.internal.utils.crypto.ECDH
 import net.mamoe.mirai.utils.*
-import java.util.concurrent.CopyOnWriteArraySet
 import kotlin.random.Random
 
 
@@ -77,20 +73,23 @@ internal open class QQAndroidClient(
     lateinit var _bot: QQAndroidBot
     val bot: QQAndroidBot get() = _bot
 
+    /**
+     * 真实 QQ 号. 使用邮箱等登录时则需获取这个 uin 进行后续一些操作.
+     *
+     * **注意**: 总是使用这个属性, 而不要使用 [BotAccount.id]. 将来它可能会变为 [String]
+     */
+    val uin: Long get() = _uin
 
-    internal var strangerSeq: Int = 0
+    override var outgoingPacketSessionId: ByteArray = 0x02B05B8B.toByteArray()
+    override var loginState = 0
 
     var onlineStatus: OnlineStatus = OnlineStatus.ONLINE
 
-
-    internal val miscBitMap: Int get() = protocol.miscBitMap // 184024956 // 也可能是 150470524 ?
-    internal val mainSigMap: Int get() = protocol.mainSigMap
+    var fileStoragePushFSSvcList: FileStoragePushFSSvcList? = null
 
     @Volatile
     private var _ssoSequenceId: Int = Random.nextInt(100000)
 
-    var fileStoragePushFSSvcList: FileStoragePushFSSvcList? = null
-
     @Synchronized
     @MiraiInternalApi("Do not use directly. Get from the lambda param of buildSsoPacket")
     internal fun nextSsoSequenceId(): Int {
@@ -124,6 +123,8 @@ internal open class QQAndroidClient(
         return new
     }
 
+    internal var strangerSeq: Int = 0
+
     // TODO: 2021/4/14 investigate whether they can be minimized
     private val friendSeq: AtomicInt = atomic(getRandomUnsignedInt())
     internal fun getFriendSeq(): Int = friendSeq.value
@@ -132,15 +133,6 @@ internal open class QQAndroidClient(
 
     internal fun setFriendSeq(compare: Int, id: Int): Boolean = friendSeq.compareAndSet(compare, id % 65535)
 
-    val appClientVersion: Int = 0
-
-
-    val ssoVersion: Int = 15
-
-
-    var networkType: NetworkType = NetworkType.WIFI
-
-
     internal val groupConfig: GroupConfig = GroupConfig()
 
     internal class GroupConfig {
@@ -207,16 +199,6 @@ internal open class QQAndroidClient(
 
     val syncingController = MessageSvcSyncData()
 
-    /*
-     * 以下登录使用
-     */
-    @Suppress("SpellCheckingInspection")
-    @PublishedApi
-    internal val apkId: ByteArray = "com.tencent.mobileqq".toByteArray()
-
-    override var outgoingPacketSessionId: ByteArray = 0x02B05B8B.toByteArray()
-    override var loginState = 0
-
     var t150: Tlv? = null
     var rollbackSig: ByteArray? = null
     var ipFromT149: ByteArray? = null
@@ -226,13 +208,6 @@ internal open class QQAndroidClient(
      */
     var timeDifference: Long = 0
 
-    /**
-     * 真实 QQ 号. 使用邮箱等登录时则需获取这个 uin 进行后续一些操作.
-     *
-     * **注意**: 总是使用这个属性, 而不要使用 [BotAccount.id]. 将来它可能会变为 [String]
-     */
-    val uin: Long get() = _uin
-
     @Suppress("PropertyName")
     internal var _uin: Long = account.id
 
@@ -247,11 +222,17 @@ internal open class QQAndroidClient(
     lateinit var wFastLoginInfo: WFastLoginInfo
     var reserveUinInfo: ReserveUinInfo? = null
     var t402: ByteArray? = null
-    lateinit var qrPushSig: ByteArray
-    lateinit var mainDisplayName: ByteArray
     lateinit var t104: ByteArray
 }
 
+internal val QQAndroidClient.apkId: ByteArray get() = "com.tencent.mobileqq".toByteArray()
+internal val QQAndroidClient.ssoVersion: Int get() = 15
+internal val QQAndroidClient.networkType: NetworkType get() = NetworkType.WIFI
+internal val QQAndroidClient.appClientVersion: Int get() = 0
+internal val QQAndroidClient.buildVer: String get() = "8.4.18.4810" // 8.2.0.1296 // 8.4.8.4810 // 8.2.7.4410
+internal val QQAndroidClient.apkVersionName: ByteArray get() = protocol.ver.toByteArray() //"8.4.18".toByteArray()
+internal val QQAndroidClient.mainSigMap: Int get() = protocol.mainSigMap
+internal val QQAndroidClient.miscBitMap: Int get() = protocol.miscBitMap // 184024956 // 也可能是 150470524 ?
 internal val QQAndroidClient.clientVersion: String get() = "android ${protocol.ver}" // android 8.5.0
 internal val QQAndroidClient.protocol get() = MiraiProtocolInternal[bot.configuration.protocol]
 internal val QQAndroidClient.sdkVersion: String get() = protocol.sdkVer
@@ -259,21 +240,3 @@ internal val QQAndroidClient.buildTime: Long get() = protocol.buildTime
 internal val QQAndroidClient.subAppId: Long get() = protocol.id
 internal val QQAndroidClient.apkSignatureMd5: ByteArray get() = protocol.sign.hexToBytes() // "A6 B7 45 BF 24 A2 C2 77 52 77 16 F6 F3 6E B6 8D".hexToBytes()
 internal val QQAndroidClient.subSigMap: Int get() = protocol.subSigMap // 0x10400 //=66,560
-
-internal fun BytePacketBuilder.writeLoginExtraData(loginExtraData: LoginExtraData) {
-    loginExtraData.run {
-        writeLong(uin)
-        writeByte(ip.size.toByte())
-        writeFully(ip)
-        writeInt(time)
-        writeInt(version)
-    }
-}
-
-@Serializable
-internal class BdhSession(
-    val sigSession: ByteArray,
-    val sessionKey: ByteArray,
-    var ssoAddresses: MutableSet<Pair<Int, Int>> = CopyOnWriteArraySet(),
-    var otherAddresses: MutableSet<Pair<Int, Int>> = CopyOnWriteArraySet(),
-)

+ 9 - 1
mirai-core/src/commonMain/kotlin/network/handler/BdhSessionSyncer.kt

@@ -15,11 +15,11 @@ import kotlinx.serialization.KSerializer
 import kotlinx.serialization.Serializable
 import kotlinx.serialization.builtins.ListSerializer
 import net.mamoe.mirai.internal.QQAndroidBot
-import net.mamoe.mirai.internal.network.BdhSession
 import net.mamoe.mirai.internal.network.JsonForCache
 import net.mamoe.mirai.internal.network.ProtoBufForCache
 import net.mamoe.mirai.internal.utils.actualCacheDir
 import java.io.File
+import java.util.concurrent.CopyOnWriteArraySet
 
 @Serializable
 private data class ServerHostAndPort(
@@ -127,3 +127,11 @@ internal class BdhSessionSyncer(
 
     }
 }
+
+@Serializable
+internal class BdhSession(
+    val sigSession: ByteArray,
+    val sessionKey: ByteArray,
+    var ssoAddresses: MutableSet<Pair<Int, Int>> = CopyOnWriteArraySet(),
+    var otherAddresses: MutableSet<Pair<Int, Int>> = CopyOnWriteArraySet(),
+)

+ 1 - 1
mirai-core/src/commonMain/kotlin/network/highway/Highway.kt

@@ -21,8 +21,8 @@ import kotlinx.io.core.buildPacket
 import kotlinx.io.core.discardExact
 import kotlinx.io.core.writeFully
 import net.mamoe.mirai.internal.QQAndroidBot
-import net.mamoe.mirai.internal.network.BdhSession
 import net.mamoe.mirai.internal.network.QQAndroidClient
+import net.mamoe.mirai.internal.network.handler.BdhSession
 import net.mamoe.mirai.internal.network.handler.logger
 import net.mamoe.mirai.internal.network.protocol.data.proto.CSDataHighwayHead
 import net.mamoe.mirai.internal.network.subAppId

+ 12 - 0
mirai-core/src/commonMain/kotlin/network/keys.kt

@@ -9,7 +9,9 @@
 
 package net.mamoe.mirai.internal.network
 
+import kotlinx.io.core.BytePacketBuilder
 import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.writeFully
 import kotlinx.serialization.SerialName
 import kotlinx.serialization.Serializable
 import net.mamoe.mirai.utils.*
@@ -62,6 +64,16 @@ internal class LoginExtraData(
     }
 }
 
+internal fun BytePacketBuilder.writeLoginExtraData(loginExtraData: LoginExtraData) {
+    loginExtraData.run {
+        writeLong(uin)
+        writeByte(ip.size.toByte())
+        writeFully(ip)
+        writeInt(time)
+        writeInt(version)
+    }
+}
+
 @Suppress("ArrayInDataClass") // for `copy`
 @Serializable
 internal data class WLoginSigInfo(

+ 1 - 0
mirai-core/src/commonMain/kotlin/network/protocol/packet/OutgoingPacketAndroid.kt

@@ -17,6 +17,7 @@ import kotlinx.io.core.writeFully
 import net.mamoe.mirai.internal.QQAndroidBot
 import net.mamoe.mirai.internal.network.Packet
 import net.mamoe.mirai.internal.network.QQAndroidClient
+import net.mamoe.mirai.internal.network.appClientVersion
 import net.mamoe.mirai.internal.network.handler.NetworkHandler
 import net.mamoe.mirai.internal.utils.io.encryptAndWrite
 import net.mamoe.mirai.internal.utils.io.writeHex

+ 1 - 4
mirai-core/src/commonMain/kotlin/network/protocol/packet/Tlv.kt

@@ -12,11 +12,8 @@
 package net.mamoe.mirai.internal.network.protocol.packet
 
 import kotlinx.io.core.*
-import net.mamoe.mirai.internal.network.LoginExtraData
-import net.mamoe.mirai.internal.network.QQAndroidClient
+import net.mamoe.mirai.internal.network.*
 import net.mamoe.mirai.internal.network.protocol.LoginType
-import net.mamoe.mirai.internal.network.subAppId
-import net.mamoe.mirai.internal.network.writeLoginExtraData
 import net.mamoe.mirai.internal.utils.GuidSource
 import net.mamoe.mirai.internal.utils.MacOrAndroidIdChangeFlag
 import net.mamoe.mirai.internal.utils.NetworkType

+ 2 - 1
mirai-core/src/commonMain/kotlin/network/protocol/packet/login/ConfigPushSvc.kt

@@ -18,9 +18,10 @@ import net.mamoe.mirai.event.broadcast
 import net.mamoe.mirai.event.events.BotOfflineEvent
 import net.mamoe.mirai.internal.QQAndroidBot
 import net.mamoe.mirai.internal.message.contextualBugReportException
-import net.mamoe.mirai.internal.network.BdhSession
 import net.mamoe.mirai.internal.network.Packet
+import net.mamoe.mirai.internal.network.handler.BdhSession
 import net.mamoe.mirai.internal.network.handler.logger
+import net.mamoe.mirai.internal.network.networkType
 import net.mamoe.mirai.internal.network.protocol.data.jce.FileStoragePushFSSvcList
 import net.mamoe.mirai.internal.network.protocol.data.jce.PushResp
 import net.mamoe.mirai.internal.network.protocol.data.jce.RequestPacket

+ 2 - 2
mirai-core/src/commonMain/kotlin/network/protocol/packet/login/WtLogin.kt

@@ -286,7 +286,7 @@ internal class WtLogin {
                     tlvMap119[0x528]?.let { client.t528 = it }
                     tlvMap119[0x530]?.let { client.t530 = it }
 
-                    tlvMap119[0x118]?.let { client.mainDisplayName = it }
+//                    tlvMap119[0x118]?.let { client.mainDisplayName = it }
                     tlvMap119[0x108]?.let { client.ksid = it }
                     tlvMap119[0x11a]?.read {
                         readShort().toInt() // faceId
@@ -333,7 +333,7 @@ internal class WtLogin {
                         // dont move into constructor, keep order
                         client.reserveUinInfo = ReserveUinInfo(imgType, imgFormat, imgUrl)
                     }
-                    client.qrPushSig = tlvMap119[0x317] ?: byteArrayOf()
+//                    client.qrPushSig = tlvMap119[0x317] ?: byteArrayOf()
 
 
                     var payToken: ByteArray? = null

+ 1 - 0
mirai-core/src/commonMain/kotlin/network/protocol/packet/login/wtlogin/WtLogin2.kt

@@ -10,6 +10,7 @@
 package net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin
 
 import net.mamoe.mirai.internal.network.QQAndroidClient
+import net.mamoe.mirai.internal.network.miscBitMap
 import net.mamoe.mirai.internal.network.protocol.packet.*
 import net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin
 import net.mamoe.mirai.internal.network.subAppId

+ 1 - 0
mirai-core/src/commonMain/kotlin/network/protocol/packet/login/wtlogin/WtLogin20.kt

@@ -10,6 +10,7 @@
 package net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin
 
 import net.mamoe.mirai.internal.network.QQAndroidClient
+import net.mamoe.mirai.internal.network.miscBitMap
 import net.mamoe.mirai.internal.network.protocol.packet.*
 import net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin
 import net.mamoe.mirai.internal.network.subAppId