From e762a23f003e68b03ccc85b4ac12e813f2d3a959 Mon Sep 17 00:00:00 2001 From: Him188 Date: Fri, 18 Dec 2020 21:32:41 +0800 Subject: [PATCH] Improve packet queue --- .../network/QQAndroidBotNetworkHandler.kt | 7 +- .../network/protocol/packet/PacketFactory.kt | 91 +++++++++---------- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/mirai-core/src/commonMain/kotlin/network/QQAndroidBotNetworkHandler.kt b/mirai-core/src/commonMain/kotlin/network/QQAndroidBotNetworkHandler.kt index 0d91a9164..e35226563 100644 --- a/mirai-core/src/commonMain/kotlin/network/QQAndroidBotNetworkHandler.kt +++ b/mirai-core/src/commonMain/kotlin/network/QQAndroidBotNetworkHandler.kt @@ -45,6 +45,7 @@ import net.mamoe.mirai.network.RetryLaterException import net.mamoe.mirai.network.UnsupportedSMSLoginException import net.mamoe.mirai.network.WrongPasswordException import net.mamoe.mirai.utils.* +import java.util.concurrent.ConcurrentLinkedQueue import kotlin.coroutines.CoroutineContext @Suppress("MemberVisibilityCanBePrivate") @@ -220,8 +221,8 @@ internal class QQAndroidBotNetworkHandler(coroutineContext: CoroutineContext, bo @JvmField @Volatile - internal var pendingIncomingPackets: LockFreeLinkedList>? = - LockFreeLinkedList() + internal var pendingIncomingPackets: ConcurrentLinkedQueue>? = + ConcurrentLinkedQueue() private var initFriendOk = false private var initGroupOk = false @@ -322,7 +323,7 @@ internal class QQAndroidBotNetworkHandler(coroutineContext: CoroutineContext, bo } if (!pendingEnabled) { - pendingIncomingPackets = LockFreeLinkedList() + pendingIncomingPackets = ConcurrentLinkedQueue() _pendingEnabled.value = true } 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 d6aa5c276..3c6f9b938 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/PacketFactory.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/PacketFactory.kt @@ -184,60 +184,59 @@ internal object KnownPacketFactories { bot: QQAndroidBot, rawInput: ByteReadPacket, consumer: PacketConsumer - ) = - with(rawInput) { - // login - val flag1 = readInt() + ): Unit = with(rawInput) { + // login + val flag1 = readInt() - PacketLogger.verbose { "开始处理一个包" } + PacketLogger.verbose { "开始处理一个包" } - val flag2 = readByte().toInt() - val flag3 = readByte().toInt() - check(flag3 == 0) { - "Illegal flag3. Expected 0, whereas got $flag3. flag1=$flag1, flag2=$flag2. " + - "Remaining=${this.readBytes().toUHexString()}" - } + val flag2 = readByte().toInt() + val flag3 = readByte().toInt() + check(flag3 == 0) { + "Illegal flag3. Expected 0, whereas got $flag3. flag1=$flag1, flag2=$flag2. " + + "Remaining=${this.readBytes().toUHexString()}" + } - readString(readInt() - 4)// uinAccount + readString(readInt() - 4)// uinAccount - @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") - ByteArrayPool.useInstance(this.remaining.toInt()) { data -> - val size = this.readAvailable(data) + @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") + ByteArrayPool.useInstance(this.remaining.toInt()) { data -> + val size = this.readAvailable(data) - kotlin.runCatching { - when (flag2) { - 2 -> TEA.decrypt(data, DECRYPTER_16_ZERO, size) - 1 -> TEA.decrypt(data, bot.client.wLoginSigInfo.d2Key, size) - 0 -> data - else -> error("") - } - }.getOrElse { - bot.client.tryDecryptOrNull(data, size) { it } - }?.toReadPacket()?.let { decryptedData -> - when (flag1) { - 0x0A -> parseSsoFrame(bot, decryptedData) - 0x0B -> parseSsoFrame(bot, decryptedData) // 这里可能是 uni?? 但测试时候发现结构跟 sso 一样. - else -> error("unknown flag1: ${flag1.toByte().toUHexString()}") - } - }?.let { - it as IncomingPacket - - if (it.packetFactory is IncomingPacketFactory && it.packetFactory.canBeCached && bot.network.pendingEnabled) { - @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") - bot.network.pendingIncomingPackets?.addLast(it.also { - it.consumer = consumer - it.flag2 = flag2 - PacketLogger.info { "Cached ${it.commandName} #${it.sequenceId}" } - }) ?: handleIncomingPacket(it, bot, flag2, consumer) - } else { - handleIncomingPacket(it, bot, flag2, consumer) - } - } ?: kotlin.run { - PacketLogger.error { "任何key都无法解密: ${data.take(size).toUHexString()}" } - return + kotlin.runCatching { + when (flag2) { + 2 -> TEA.decrypt(data, DECRYPTER_16_ZERO, size) + 1 -> TEA.decrypt(data, bot.client.wLoginSigInfo.d2Key, size) + 0 -> data + else -> error("") } + }.getOrElse { + bot.client.tryDecryptOrNull(data, size) { it } + }?.toReadPacket()?.let { decryptedData -> + when (flag1) { + 0x0A -> parseSsoFrame(bot, decryptedData) + 0x0B -> parseSsoFrame(bot, decryptedData) // 这里可能是 uni?? 但测试时候发现结构跟 sso 一样. + else -> error("unknown flag1: ${flag1.toByte().toUHexString()}") + } + }?.let { + it as IncomingPacket + + if (it.packetFactory is IncomingPacketFactory && it.packetFactory.canBeCached && bot.network.pendingEnabled) { + @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") + bot.network.pendingIncomingPackets?.add(it.also { + it.consumer = consumer + it.flag2 = flag2 + PacketLogger.info { "Cached ${it.commandName} #${it.sequenceId}" } + }) ?: handleIncomingPacket(it, bot, flag2, consumer) + } else { + handleIncomingPacket(it, bot, flag2, consumer) + } + } ?: kotlin.run { + PacketLogger.error { "任何key都无法解密: ${data.take(size).toUHexString()}" } + return } } + } internal suspend fun handleIncomingPacket( it: IncomingPacket,