Extract some logic out of QQAndroidBot

This commit is contained in:
Him188 2021-04-26 23:49:23 +08:00
parent 58d2081494
commit 61bc657417
5 changed files with 50 additions and 64 deletions

View File

@ -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 <E : Packet> OutgoingPacketWithRespType<E>.sendAndExpect(
timeoutMillis: Long = 5000,
retry: Int = 2
): E = network.run { sendAndExpect(timeoutMillis, retry) }
suspend inline fun <E : Packet> 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)

View File

@ -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()

View File

@ -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
}
}
}

View File

@ -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) {

View File

@ -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<Long, Lambda528> 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))
}