From 61bc65741755499205cc4314593cf035c20c6bc2 Mon Sep 17 00:00:00 2001 From: Him188 Date: Mon, 26 Apr 2021 23:49:23 +0800 Subject: [PATCH] Extract some logic out of QQAndroidBot --- .../src/commonMain/kotlin/QQAndroidBot.kt | 65 +++---------------- .../network/components/ContactUpdater.kt | 2 + .../network/handler/state/StateObserver.kt | 24 +++++++ .../chat/receive/MessageSvc.PbGetMsg.kt | 7 +- .../packet/chat/receive/OnlinePush.ReqPush.kt | 16 +++-- 5 files changed, 50 insertions(+), 64 deletions(-) diff --git a/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt b/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt index 3d5f6731f..b381c1e9c 100644 --- a/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt +++ b/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt @@ -13,7 +13,6 @@ package net.mamoe.mirai.internal import kotlinx.atomicfu.atomic import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.sync.Mutex import net.mamoe.mirai.Bot import net.mamoe.mirai.Mirai import net.mamoe.mirai.contact.Group @@ -22,7 +21,6 @@ import net.mamoe.mirai.event.events.BotOfflineEvent import net.mamoe.mirai.event.events.BotOnlineEvent import net.mamoe.mirai.event.events.BotReloginEvent import net.mamoe.mirai.internal.contact.checkIsGroupImpl -import net.mamoe.mirai.internal.network.Packet import net.mamoe.mirai.internal.network.component.ComponentStorage import net.mamoe.mirai.internal.network.component.ConcurrentComponentStorage import net.mamoe.mirai.internal.network.components.* @@ -35,15 +33,15 @@ import net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport import net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport.BaseStateImpl import net.mamoe.mirai.internal.network.handler.selector.FactoryKeepAliveNetworkHandlerSelector import net.mamoe.mirai.internal.network.handler.selector.SelectorNetworkHandler -import net.mamoe.mirai.internal.network.handler.state.* +import net.mamoe.mirai.internal.network.handler.state.StateChangedObserver +import net.mamoe.mirai.internal.network.handler.state.StateObserver +import net.mamoe.mirai.internal.network.handler.state.StateObserver.Companion.LOGGING +import net.mamoe.mirai.internal.network.handler.state.safe import net.mamoe.mirai.internal.network.impl.netty.NettyNetworkHandlerFactory import net.mamoe.mirai.internal.network.impl.netty.asCoroutineExceptionHandler -import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket -import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketWithRespType import net.mamoe.mirai.internal.utils.subLogger import net.mamoe.mirai.utils.BotConfiguration import net.mamoe.mirai.utils.MiraiLogger -import net.mamoe.mirai.utils.systemProp import kotlin.contracts.contract internal fun Bot.asQQAndroidBot(): QQAndroidBot { @@ -54,28 +52,9 @@ internal fun Bot.asQQAndroidBot(): QQAndroidBot { return this as QQAndroidBot } +// for tests internal class BotDebugConfiguration( - var stateObserver: StateObserver? = when (systemProp( - "mirai.debug.network.state.observer.logging", - "off" - ).toLowerCase()) { - "full" -> { - SafeStateObserver( - LoggingStateObserver(MiraiLogger.create("States"), true), - MiraiLogger.create("LoggingStateObserver errors") - ) - } - "off", "false" -> { - null - } - "on", "true" -> { - SafeStateObserver( - LoggingStateObserver(MiraiLogger.create("States"), false), - MiraiLogger.create("LoggingStateObserver errors") - ) - } - else -> null - } + var stateObserver: StateObserver? = LOGGING ) @Suppress("INVISIBLE_MEMBER", "BooleanLiteralArgument", "OverridingDeprecatedMember") @@ -85,23 +64,12 @@ internal open class QQAndroidBot constructor( private val debugConfiguration: BotDebugConfiguration = BotDebugConfiguration(), ) : AbstractBot(configuration, account.id) { override val bot: QQAndroidBot get() = this - - - @Deprecated( - "", - replaceWith = ReplaceWith( - "this.components[SsoProcessor].firstLoginSucceed", - "net.mamoe.mirai.internal.network.components.SsoProcessor" - ) - ) - internal var firstLoginSucceed: Boolean = false + val client get() = components[SsoProcessor].client /////////////////////////////////////////////////////////////////////////// // network /////////////////////////////////////////////////////////////////////////// - // TODO: 2021/4/14 bdhSyncer.loadFromCache() when login - // also called by tests. fun ComponentStorage.stateObserverChain(): StateObserver { val components = this @@ -183,14 +151,9 @@ internal open class QQAndroidBot constructor( set(ConfigPushSyncer, ConfigPushSyncerImpl()) set(StateObserver, stateObserverChain()) - - // TODO: 2021/4/16 load server list from cache (add a provider) - // bot.bdhSyncer.loadServerListFromCache() - } } - val client get() = components[SsoProcessor].client override fun createNetworkHandler(): NetworkHandler { val context = NetworkHandlerContextImpl( @@ -208,18 +171,9 @@ internal open class QQAndroidBot constructor( ) // We can move the factory to configuration but this is not necessary for now. } - - suspend inline fun OutgoingPacketWithRespType.sendAndExpect( - timeoutMillis: Long = 5000, - retry: Int = 2 - ): E = network.run { sendAndExpect(timeoutMillis, retry) } - - suspend inline fun OutgoingPacket.sendAndExpect(timeoutMillis: Long = 5000, retry: Int = 2): E = - network.run { sendAndExpect(timeoutMillis, retry) } - /** * 获取 获取群公告 所需的 bkn 参数 - * */ + * */ // TODO: 2021/4/26 extract it after #1141 merged val bkn: Int get() = client.wLoginSigInfo.sKey.data .fold(5381) { acc: Int, b: Byte -> acc + acc.shl(5) + b.toInt() } @@ -231,9 +185,6 @@ internal open class QQAndroidBot constructor( override lateinit var nick: String - @JvmField - val groupListModifyLock = Mutex() - // internally visible only fun getGroupByUin(uin: Long): Group { return getGroupByUinOrNull(uin) diff --git a/mirai-core/src/commonMain/kotlin/network/components/ContactUpdater.kt b/mirai-core/src/commonMain/kotlin/network/components/ContactUpdater.kt index fb84267f6..093d90f29 100644 --- a/mirai-core/src/commonMain/kotlin/network/components/ContactUpdater.kt +++ b/mirai-core/src/commonMain/kotlin/network/components/ContactUpdater.kt @@ -53,6 +53,7 @@ import net.mamoe.mirai.utils.verbose */ internal interface ContactUpdater { val otherClientsLock: Mutex + val groupListModifyLock: Mutex /** * Load all caches to the bot this [ContactUpdater] works for. @@ -77,6 +78,7 @@ internal class ContactUpdaterImpl( private val logger: MiraiLogger, ) : ContactUpdater { override val otherClientsLock: Mutex = Mutex() + override val groupListModifyLock: Mutex = Mutex() private val cacheService get() = components[ContactCacheService] private val lock = Mutex() diff --git a/mirai-core/src/commonMain/kotlin/network/handler/state/StateObserver.kt b/mirai-core/src/commonMain/kotlin/network/handler/state/StateObserver.kt index 0b2fa59a0..43d71f085 100644 --- a/mirai-core/src/commonMain/kotlin/network/handler/state/StateObserver.kt +++ b/mirai-core/src/commonMain/kotlin/network/handler/state/StateObserver.kt @@ -13,6 +13,8 @@ import net.mamoe.mirai.internal.network.component.ComponentKey import net.mamoe.mirai.internal.network.handler.NetworkHandler import net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport import net.mamoe.mirai.internal.network.handler.state.CombinedStateObserver.Companion.plus +import net.mamoe.mirai.utils.MiraiLogger +import net.mamoe.mirai.utils.systemProp /** * Stateless observer of state changes. @@ -65,5 +67,27 @@ internal interface StateObserver { acc + stateObserver } ?: NOP } + + val LOGGING: StateObserver? = when (systemProp( + "mirai.debug.network.state.observer.logging", + "off" + ).toLowerCase()) { + "full" -> { + SafeStateObserver( + LoggingStateObserver(MiraiLogger.create("States"), true), + MiraiLogger.create("LoggingStateObserver errors") + ) + } + "off", "false" -> { + null + } + "on", "true" -> { + SafeStateObserver( + LoggingStateObserver(MiraiLogger.create("States"), false), + MiraiLogger.create("LoggingStateObserver errors") + ) + } + else -> null + } } } diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt index 0156e41e4..dd9d947a7 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt @@ -37,6 +37,7 @@ import net.mamoe.mirai.internal.message.toMessageChainOnline import net.mamoe.mirai.internal.network.MultiPacket import net.mamoe.mirai.internal.network.Packet import net.mamoe.mirai.internal.network.QQAndroidClient +import net.mamoe.mirai.internal.network.components.ContactUpdater import net.mamoe.mirai.internal.network.components.SsoProcessor import net.mamoe.mirai.internal.network.handler.logger import net.mamoe.mirai.internal.network.protocol.data.proto.FrdSysMsg @@ -251,7 +252,7 @@ private fun MsgComm.Msg.getNewMemberInfo(): MemberInfo { internal suspend fun MsgComm.Msg.transform(bot: QQAndroidBot, fromSync: Boolean = false): Packet? { when (msgHead.msgType) { - 33 -> bot.groupListModifyLock.withLock { + 33 -> bot.components[ContactUpdater].groupListModifyLock.withLock { msgBody.msgContent.read { val groupUin = Mirai.calculateGroupUinByGroupCode(readUInt().toLong()) val group = bot.getGroupByUinOrNull(groupUin) ?: bot.createGroupForBot(groupUin) ?: return null @@ -308,12 +309,12 @@ internal suspend fun MsgComm.Msg.transform(bot: QQAndroidBot, fromSync: Boolean return null } - 38 -> bot.groupListModifyLock.withLock { // 建群 + 38 -> bot.components[ContactUpdater].groupListModifyLock.withLock { // 建群 return bot.createGroupForBot(msgHead.fromUin) ?.let { BotJoinGroupEvent.Active(it) } } - 85 -> bot.groupListModifyLock.withLock { // 其他客户端入群 + 85 -> bot.components[ContactUpdater].groupListModifyLock.withLock { // 其他客户端入群 // msgHead.authUin: 处理人 return if (msgHead.toUin == bot.id) { 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 e4f077c93..816cc132f 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 @@ -19,7 +19,10 @@ import kotlinx.io.core.* import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import net.mamoe.mirai.Mirai -import net.mamoe.mirai.contact.* +import net.mamoe.mirai.contact.Member +import net.mamoe.mirai.contact.MemberPermission +import net.mamoe.mirai.contact.NormalMember +import net.mamoe.mirai.contact.User import net.mamoe.mirai.data.GroupHonorType import net.mamoe.mirai.event.events.* import net.mamoe.mirai.internal.QQAndroidBot @@ -29,22 +32,27 @@ import net.mamoe.mirai.internal.contact.info.MemberInfoImpl import net.mamoe.mirai.internal.network.MultiPacketBySequence import net.mamoe.mirai.internal.network.Packet import net.mamoe.mirai.internal.network.QQAndroidClient +import net.mamoe.mirai.internal.network.components.ContactUpdater import net.mamoe.mirai.internal.network.handler.logger import net.mamoe.mirai.internal.network.protocol.data.jce.MsgInfo import net.mamoe.mirai.internal.network.protocol.data.jce.MsgType0x210 import net.mamoe.mirai.internal.network.protocol.data.jce.OnlinePushPack import net.mamoe.mirai.internal.network.protocol.data.jce.RequestPacket -import net.mamoe.mirai.internal.network.protocol.data.proto.* +import net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x115 +import net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x122 import net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x27.SubMsgType0x27.* import net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x44.Submsgtype0x44 +import net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0xb3 +import net.mamoe.mirai.internal.network.protocol.data.proto.TroopTips0x857 import net.mamoe.mirai.internal.network.protocol.packet.IncomingPacketFactory import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket import net.mamoe.mirai.internal.network.protocol.packet.buildResponseUniPacket import net.mamoe.mirai.internal.network.protocol.packet.list.FriendList import net.mamoe.mirai.internal.network.protocol.packet.sendAndExpect -import net.mamoe.mirai.internal.utils.* +import net.mamoe.mirai.internal.utils._miraiContentToString import net.mamoe.mirai.internal.utils.io.ProtoBuf import net.mamoe.mirai.internal.utils.io.serialization.* +import net.mamoe.mirai.internal.utils.parseToMessageDataList import net.mamoe.mirai.utils.* @@ -619,7 +627,7 @@ internal object Transformers528 : Map by mapOf( if (msg.msgGroupMsgSync != null) { when (msg.msgGroupMsgSync.msgType) { 1, 2 -> { - bot.groupListModifyLock.withLock { + bot.components[ContactUpdater].groupListModifyLock.withLock { bot.createGroupForBot(Mirai.calculateGroupUinByGroupCode(msg.msgGroupMsgSync.grpCode))?.let { packetList.add(BotJoinGroupEvent.Active(it)) }