mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-10 04:00:08 +08:00
Extract some logic out of QQAndroidBot
This commit is contained in:
parent
58d2081494
commit
61bc657417
@ -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)
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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))
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user