diff --git a/mirai-core-api/src/commonMain/kotlin/event/Event.kt b/mirai-core-api/src/commonMain/kotlin/event/Event.kt index cdf4a1620..5408c99aa 100644 --- a/mirai-core-api/src/commonMain/kotlin/event/Event.kt +++ b/mirai-core-api/src/commonMain/kotlin/event/Event.kt @@ -14,9 +14,13 @@ package net.mamoe.mirai.event import kotlinx.coroutines.runBlocking import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock +import net.mamoe.mirai.event.events.BotEvent import net.mamoe.mirai.internal.event.broadcastInternal +import net.mamoe.mirai.internal.network.Packet import net.mamoe.mirai.utils.JavaFriendlyAPI import net.mamoe.mirai.utils.MiraiExperimentalApi +import net.mamoe.mirai.utils.MiraiLogger +import net.mamoe.mirai.utils.verbose /** * 可被监听的类, 可以是任何 class 或 object. @@ -149,6 +153,14 @@ public suspend fun E.broadcast(): E = apply { } this.broadCastLock.withLock { this._intercepted = false + if (EventDisabled) return@withLock + if (this is Packet.NoEventLog) return@withLock + if (this is Packet) return@withLock // all [Packet]s are logged in [LoggingPacketHandler] + if (this is BotEvent) { + this.bot.logger.verbose { "Event: $this" } + } else { + MiraiLogger.TopLevel.verbose { "Event: $this" } + } this.broadcastInternal() // inline, no extra cost } } diff --git a/mirai-core-api/src/commonMain/kotlin/internal/event/InternalEventListeners.kt b/mirai-core-api/src/commonMain/kotlin/internal/event/InternalEventListeners.kt index 55eca1865..c43f1dd63 100644 --- a/mirai-core-api/src/commonMain/kotlin/internal/event/InternalEventListeners.kt +++ b/mirai-core-api/src/commonMain/kotlin/internal/event/InternalEventListeners.kt @@ -100,7 +100,6 @@ internal object GlobalEventListeners { // inline: NO extra Continuation @Suppress("UNCHECKED_CAST") internal suspend inline fun AbstractEvent.broadcastInternal() { - if (EventDisabled) return callAndRemoveIfRequired(this@broadcastInternal) } diff --git a/mirai-core/src/commonMain/kotlin/MiraiImpl.kt b/mirai-core/src/commonMain/kotlin/MiraiImpl.kt index b3c5bf731..72b539da5 100644 --- a/mirai-core/src/commonMain/kotlin/MiraiImpl.kt +++ b/mirai-core/src/commonMain/kotlin/MiraiImpl.kt @@ -21,6 +21,7 @@ import kotlinx.serialization.json.* import net.mamoe.mirai.* import net.mamoe.mirai.contact.* import net.mamoe.mirai.data.* +import net.mamoe.mirai.event.broadcast import net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent import net.mamoe.mirai.event.events.FriendAddEvent import net.mamoe.mirai.event.events.MemberJoinRequestEvent @@ -43,7 +44,6 @@ import net.mamoe.mirai.internal.network.protocol.packet.login.StatSvc import net.mamoe.mirai.internal.network.protocol.packet.sendAndExpect import net.mamoe.mirai.internal.network.protocol.packet.summarycard.SummaryCard import net.mamoe.mirai.internal.utils.MiraiProtocolInternal -import net.mamoe.mirai.internal.utils.broadcastWithBot import net.mamoe.mirai.internal.utils.crypto.TEA import net.mamoe.mirai.internal.utils.io.serialization.loadAs import net.mamoe.mirai.internal.utils.io.serialization.toByteArray @@ -156,7 +156,7 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor { ) event.bot.getFriend(event.fromId)?.let { friend -> - FriendAddEvent(friend).broadcastWithBot(event.bot) + FriendAddEvent(friend).broadcast() } } diff --git a/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt b/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt index 78f56f089..9dd82469c 100644 --- a/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt +++ b/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt @@ -10,6 +10,7 @@ package net.mamoe.mirai.internal +import kotlinx.atomicfu.atomic import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.sync.Mutex @@ -30,6 +31,8 @@ import net.mamoe.mirai.internal.network.context.SsoProcessorContextImpl import net.mamoe.mirai.internal.network.handler.NetworkHandler import net.mamoe.mirai.internal.network.handler.NetworkHandler.State import net.mamoe.mirai.internal.network.handler.NetworkHandlerContextImpl +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.* @@ -103,11 +106,18 @@ internal open class QQAndroidBot constructor( val components = this return StateObserver.chainOfNotNull( components[BotInitProcessor].asObserver(), - StateChangedObserver(to = State.OK) { new -> - bot.launch(logger.asCoroutineExceptionHandler()) { - BotOnlineEvent(bot).broadcast() - if (bot.components[SsoProcessor].firstLoginSucceed) { // TODO: 2021/4/21 actually no use - BotReloginEvent(bot, new.getCause()).broadcast() + object : StateChangedObserver(State.OK) { + private val shouldBroadcastRelogin = atomic(false) + override fun stateChanged0( + networkHandler: NetworkHandlerSupport, + previous: BaseStateImpl, + new: BaseStateImpl + ) { + bot.launch(logger.asCoroutineExceptionHandler()) { + BotOnlineEvent(bot).broadcast() + if (shouldBroadcastRelogin.compareAndSet(false, true)) { + BotReloginEvent(bot, new.getCause()).broadcast() + } } } }, @@ -155,8 +165,9 @@ internal open class QQAndroidBot constructor( set(ServerList, ServerListImpl()) set( PacketHandler, PacketHandlerChain( - LoggingPacketHandler(bot, components, networkLogger), - EventBroadcasterPacketHandler(bot, components, logger) + LoggingPacketHandler(bot, networkLogger), + EventBroadcasterPacketHandler(networkLogger), + CallPacketFactoryPacketHandler(bot) ) ) set(PacketCodec, PacketCodecImpl()) diff --git a/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt b/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt index f1d5ffd4e..6d2b56bc9 100644 --- a/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt @@ -38,7 +38,6 @@ import net.mamoe.mirai.internal.network.protocol.packet.chat.voice.voiceCodec import net.mamoe.mirai.internal.network.protocol.packet.list.ProfileService import net.mamoe.mirai.internal.utils.GroupPkgMsgParsingCache import net.mamoe.mirai.internal.utils.RemoteFileImpl -import net.mamoe.mirai.internal.utils.broadcastWithBot import net.mamoe.mirai.internal.utils.io.serialization.toByteArray import net.mamoe.mirai.message.MessageReceipt import net.mamoe.mirai.message.data.* @@ -111,7 +110,7 @@ internal class GroupImpl( } } } - BotLeaveEvent.Active(this).broadcastWithBot(bot) + BotLeaveEvent.Active(this).broadcast() return true } diff --git a/mirai-core/src/commonMain/kotlin/contact/NormalMemberImpl.kt b/mirai-core/src/commonMain/kotlin/contact/NormalMemberImpl.kt index 80aff92f3..8faaf3705 100644 --- a/mirai-core/src/commonMain/kotlin/contact/NormalMemberImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/NormalMemberImpl.kt @@ -13,16 +13,18 @@ package net.mamoe.mirai.internal.contact import kotlinx.atomicfu.AtomicInt import kotlinx.atomicfu.atomic -import kotlinx.coroutines.* +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch import net.mamoe.mirai.LowLevelApi import net.mamoe.mirai.contact.* import net.mamoe.mirai.data.MemberInfo +import net.mamoe.mirai.event.broadcast import net.mamoe.mirai.event.events.* import net.mamoe.mirai.internal.message.OnlineMessageSourceToTempImpl import net.mamoe.mirai.internal.network.protocol.packet.chat.TroopManagement -import net.mamoe.mirai.internal.utils.broadcastWithBot import net.mamoe.mirai.message.MessageReceipt -import net.mamoe.mirai.message.data.* +import net.mamoe.mirai.message.data.Message import net.mamoe.mirai.utils.cast import net.mamoe.mirai.utils.currentTimeSeconds import kotlin.contracts.ExperimentalContracts @@ -99,7 +101,7 @@ internal class NormalMemberImpl constructor( newValue ).sendWithoutExpect() } - MemberCardChangeEvent(oldValue, newValue, this@NormalMemberImpl).broadcastWithBot(bot) + MemberCardChangeEvent(oldValue, newValue, this@NormalMemberImpl).broadcast() } } } @@ -119,7 +121,7 @@ internal class NormalMemberImpl constructor( newValue ).sendWithoutExpect() } - MemberSpecialTitleChangeEvent(oldValue, newValue, this@NormalMemberImpl, null).broadcastWithBot(bot) + MemberSpecialTitleChangeEvent(oldValue, newValue, this@NormalMemberImpl, null).broadcast() } } } @@ -142,7 +144,7 @@ internal class NormalMemberImpl constructor( } @Suppress("RemoveRedundantQualifierName") // or unresolved reference - net.mamoe.mirai.event.events.MemberMuteEvent(this@NormalMemberImpl, durationSeconds, null).broadcastWithBot(bot) + (net.mamoe.mirai.event.events.MemberMuteEvent(this@NormalMemberImpl, durationSeconds, null).broadcast()) this._muteTimestamp = currentTimeSeconds().toInt() + durationSeconds } @@ -158,7 +160,7 @@ internal class NormalMemberImpl constructor( } @Suppress("RemoveRedundantQualifierName") // or unresolved reference - net.mamoe.mirai.event.events.MemberUnmuteEvent(this@NormalMemberImpl, null).broadcastWithBot(bot) + (net.mamoe.mirai.event.events.MemberUnmuteEvent(this@NormalMemberImpl, null).broadcast()) this._muteTimestamp = 0 } @@ -179,7 +181,7 @@ internal class NormalMemberImpl constructor( @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") group.members.delegate.removeIf { it.id == this@NormalMemberImpl.id } this@NormalMemberImpl.cancel(CancellationException("Kicked by bot")) - MemberLeaveEvent.Kick(this@NormalMemberImpl, null).broadcastWithBot(bot) + MemberLeaveEvent.Kick(this@NormalMemberImpl, null).broadcast() } } @@ -208,7 +210,7 @@ internal class NormalMemberImpl constructor( this@NormalMemberImpl.permission = new - MemberPermissionChangeEvent(this@NormalMemberImpl, origin, new).broadcastWithBot(bot) + MemberPermissionChangeEvent(this@NormalMemberImpl, origin, new).broadcast() } } } diff --git a/mirai-core/src/commonMain/kotlin/network/components/BdhSessionSyncer.kt b/mirai-core/src/commonMain/kotlin/network/components/BdhSessionSyncer.kt index 36929429d..86258893e 100644 --- a/mirai-core/src/commonMain/kotlin/network/components/BdhSessionSyncer.kt +++ b/mirai-core/src/commonMain/kotlin/network/components/BdhSessionSyncer.kt @@ -27,7 +27,7 @@ private val ServerListSerializer: KSerializer> = SetSerializer(ServerAddress.serializer()) internal interface BdhSessionSyncer { - var bdhSession: CompletableDeferred + val bdhSession: CompletableDeferred val hasSession: Boolean fun overrideSession( @@ -47,8 +47,9 @@ internal interface BdhSessionSyncer { internal class BdhSessionSyncerImpl( private val configuration: BotConfiguration, private val logger: MiraiLogger, - private val componentStorage: ComponentStorage, + private val context: ComponentStorage, ) : BdhSessionSyncer { + @Volatile override var bdhSession: CompletableDeferred = CompletableDeferred() override val hasSession: Boolean get() = kotlin.runCatching { bdhSession.getCompleted() }.isSuccess @@ -75,7 +76,7 @@ internal class BdhSessionSyncerImpl( logger.verbose("Loading server list from cache.") kotlin.runCatching { val list = JsonForCache.decodeFromString(ServerListSerializer, serverListCacheFile.readText()) - componentStorage[ServerList].setPreferred(list.map { ServerAddress(it.host, it.port) }) + context[ServerList].setPreferred(list.map { ServerAddress(it.host, it.port) }) }.onFailure { logger.warning("Error in loading server list from cache", it) } @@ -111,7 +112,7 @@ internal class BdhSessionSyncerImpl( serverListCacheFile.writeText( JsonForCache.encodeToString( ServerListSerializer, - componentStorage[ServerList].getPreferred() + context[ServerList].getPreferred() ) ) }.onFailure { diff --git a/mirai-core/src/commonMain/kotlin/network/components/BotInitProcessor.kt b/mirai-core/src/commonMain/kotlin/network/components/BotInitProcessor.kt index 864371a04..3512dfcfe 100644 --- a/mirai-core/src/commonMain/kotlin/network/components/BotInitProcessor.kt +++ b/mirai-core/src/commonMain/kotlin/network/components/BotInitProcessor.kt @@ -70,7 +70,8 @@ internal class BotInitProcessorImpl( // do them parallel. supervisorScope { -// launch { syncMessageSvc() } + launch { syncMessageSvc() } + launch { context[BdhSessionSyncer].loadFromCache() } launch { context[OtherClientUpdater].update() } launch { context[ContactUpdater].loadAll(registerResp.origin) } } diff --git a/mirai-core/src/commonMain/kotlin/network/components/BotOfflineEventMonitor.kt b/mirai-core/src/commonMain/kotlin/network/components/BotOfflineEventMonitor.kt index 527ae4a06..3aac0c109 100644 --- a/mirai-core/src/commonMain/kotlin/network/components/BotOfflineEventMonitor.kt +++ b/mirai-core/src/commonMain/kotlin/network/components/BotOfflineEventMonitor.kt @@ -18,7 +18,7 @@ import net.mamoe.mirai.event.ConcurrencyKind import net.mamoe.mirai.event.EventPriority import net.mamoe.mirai.event.events.BotOfflineEvent import net.mamoe.mirai.event.subscribeAlways -import net.mamoe.mirai.internal.QQAndroidBot +import net.mamoe.mirai.internal.AbstractBot import net.mamoe.mirai.internal.asQQAndroidBot import net.mamoe.mirai.internal.network.component.ComponentKey import net.mamoe.mirai.internal.network.handler.NetworkHandler @@ -37,13 +37,13 @@ internal interface BotOfflineEventMonitor { /** * Attach a listener to the [scope]. [scope] is usually the scope of [NetworkHandler.State.OK]. */ - fun attachJob(bot: QQAndroidBot, scope: CoroutineScope) + fun attachJob(bot: AbstractBot, scope: CoroutineScope) } private data class BotClosedByEvent(val event: BotOfflineEvent) : RuntimeException("Bot is closed by event '$event'.") internal class BotOfflineEventMonitorImpl : BotOfflineEventMonitor { - override fun attachJob(bot: QQAndroidBot, scope: CoroutineScope) { + override fun attachJob(bot: AbstractBot, scope: CoroutineScope) { bot.eventChannel.parentScope(scope).subscribeAlways( ::onEvent, priority = EventPriority.MONITOR, @@ -79,23 +79,17 @@ internal class BotOfflineEventMonitorImpl : BotOfflineEventMonitor { is BotOfflineEvent.Force -> { bot.logger.info { "Connection occupied by another android device: ${event.message}" } closeNetwork() - if (event.reconnect) { - bot.logger.info { "Reconnecting..." } - } else { - } } is BotOfflineEvent.MsfOffline, is BotOfflineEvent.Dropped, is BotOfflineEvent.RequireReconnect, -> { - // nothing to do + val causeMessage = event.castOrNull()?.cause?.toString() ?: event.toString() + bot.logger.info { "Connection lost, retrying login ($causeMessage)." } } } if (event.reconnect) { - val causeMessage = event.castOrNull()?.cause?.toString() ?: event.toString() - bot.logger.info { "Connection lost, retrying login ($causeMessage)." } - bot.launch { val success: Boolean val time = measureTime { diff --git a/mirai-core/src/commonMain/kotlin/network/components/PacketHandler.kt b/mirai-core/src/commonMain/kotlin/network/components/PacketHandler.kt index 12f250371..01dc13e32 100644 --- a/mirai-core/src/commonMain/kotlin/network/components/PacketHandler.kt +++ b/mirai-core/src/commonMain/kotlin/network/components/PacketHandler.kt @@ -20,9 +20,9 @@ import net.mamoe.mirai.internal.contact.replaceMagicCodes import net.mamoe.mirai.internal.network.Packet import net.mamoe.mirai.internal.network.ParseErrorPacket import net.mamoe.mirai.internal.network.component.ComponentKey -import net.mamoe.mirai.internal.network.component.ComponentStorage -import net.mamoe.mirai.internal.network.protocol.packet.IncomingPacket +import net.mamoe.mirai.internal.network.protocol.packet.* import net.mamoe.mirai.utils.MiraiLogger +import net.mamoe.mirai.utils.cast import net.mamoe.mirai.utils.verbose internal interface PacketHandler { @@ -32,11 +32,10 @@ internal interface PacketHandler { } internal class PacketHandlerChain( - private val instances: Collection, - primaryConstructorMark: Any? + private val instances: Collection ) : PacketHandler { - constructor(vararg instances: PacketHandler?) : this(instances.filterNotNull(), null) - constructor(instances: Iterable) : this(instances.filterNotNull(), null) + constructor(vararg instances: PacketHandler?) : this(instances.filterNotNull()) + constructor(instances: Iterable) : this(instances.filterNotNull()) override suspend fun handlePacket(incomingPacket: IncomingPacket) { for (instance in instances) { @@ -55,8 +54,7 @@ internal data class ExceptionInPacketHandlerException( ) : IllegalStateException("Exception in PacketHandler '$packetHandler'.") internal class LoggingPacketHandler( - val bot: QQAndroidBot, - val context: ComponentStorage, + private val bot: QQAndroidBot, private val logger: MiraiLogger, ) : PacketHandler { override suspend fun handlePacket(incomingPacket: IncomingPacket) { @@ -66,10 +64,10 @@ internal class LoggingPacketHandler( packet is ParseErrorPacket -> { packet.direction.getLogger(bot).error(packet.error) } + packet is MessageEvent -> packet.logMessageReceived() packet is Packet.NoLog -> { // nothing to do } - packet is MessageEvent -> packet.logMessageReceived() packet is Event && packet !is Packet.NoEventLog -> bot.logger.verbose { "Event: $packet".replaceMagicCodes() } @@ -81,8 +79,6 @@ internal class LoggingPacketHandler( } internal class EventBroadcasterPacketHandler( - val bot: QQAndroidBot, - val context: ComponentStorage, private val logger: MiraiLogger, ) : PacketHandler { @@ -110,4 +106,26 @@ internal class EventBroadcasterPacketHandler( } override fun toString(): String = "LoggingPacketHandler" +} + +internal class CallPacketFactoryPacketHandler( + private val bot: QQAndroidBot, +) : PacketHandler { + + override suspend fun handlePacket(incomingPacket: IncomingPacket) { + val factory = KnownPacketFactories.findPacketFactory(incomingPacket.commandName) ?: return + factory.cast>().run { + when (this) { + is IncomingPacketFactory -> { + val r = bot.handle(incomingPacket.data, incomingPacket.sequenceId) + if (r != null) { + bot.network.sendWithoutExpect(r) + } + } + is OutgoingPacketFactory -> bot.handle(incomingPacket.data) + } + } + } + + override fun toString(): String = "CallPacketFactoryPacketHandler" } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/network/components/SsoProcessor.kt b/mirai-core/src/commonMain/kotlin/network/components/SsoProcessor.kt index 82926722e..baa159c0e 100644 --- a/mirai-core/src/commonMain/kotlin/network/components/SsoProcessor.kt +++ b/mirai-core/src/commonMain/kotlin/network/components/SsoProcessor.kt @@ -39,7 +39,7 @@ import net.mamoe.mirai.utils.info import net.mamoe.mirai.utils.withExceptionCollector /** - * Handles login, and acts also as a mediator of [BotInitProcessor], [] + * Handles login, and acts also as a mediator of [BotInitProcessor] */ internal interface SsoProcessor { val client: QQAndroidClient @@ -108,6 +108,7 @@ internal class SsoProcessorImpl( */ @Throws(LoginFailedException::class) override suspend fun login(handler: NetworkHandler) = withExceptionCollector { + ssoContext.bot.components[BdhSessionSyncer].loadServerListFromCache() if (client.wLoginSigInfoInitialized) { kotlin.runCatching { FastLoginImpl(handler).doLogin() @@ -121,7 +122,7 @@ internal class SsoProcessorImpl( } ssoContext.accountSecretsManager.saveSecrets(ssoContext.account, AccountSecretsImpl(client)) registerClientOnline(handler) - ssoContext.bot.logger.info { "SSO login successful." } + ssoContext.bot.logger.info { "Login successful." } } private suspend fun registerClientOnline(handler: NetworkHandler): StatSvc.Register.Response { diff --git a/mirai-core/src/commonMain/kotlin/network/handler/NetworkHandlerSupport.kt b/mirai-core/src/commonMain/kotlin/network/handler/NetworkHandlerSupport.kt index 791c4f488..1781a1af7 100644 --- a/mirai-core/src/commonMain/kotlin/network/handler/NetworkHandlerSupport.kt +++ b/mirai-core/src/commonMain/kotlin/network/handler/NetworkHandlerSupport.kt @@ -21,6 +21,7 @@ import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket import net.mamoe.mirai.utils.* import java.util.concurrent.ConcurrentLinkedQueue import kotlin.coroutines.CoroutineContext +import kotlin.reflect.KClass /** * Implements basic logics of [NetworkHandler] @@ -184,12 +185,16 @@ internal abstract class NetworkHandlerSupport( val new: BaseStateImpl, ) : CancellationException("State is switched from $old to $new") + + protected inline fun setState(noinline new: () -> S): S? = setState(S::class, new) + /** * Calculate [new state][new] and set it as the current, returning the new state, or `null` if state has concurrently been set to CLOSED. * * You may need to call [BaseStateImpl.resumeConnection] to activate the new state, as states are lazy. */ - protected fun setState(new: () -> S): S? = synchronized(this) { + protected fun setState(newType: KClass, new: () -> S): S? = synchronized(this) { + if (_state::class == newType) return@synchronized null // already set to expected state by another thread. if (_state.correspondingState == NetworkHandler.State.CLOSED) return null // error("Cannot change state while it has already been CLOSED.") val stateObserver = context.getOrNull(StateObserver) diff --git a/mirai-core/src/commonMain/kotlin/network/impl/netty/NettyNetworkHandler.kt b/mirai-core/src/commonMain/kotlin/network/impl/netty/NettyNetworkHandler.kt index 1fdd2a9a3..6f873960d 100644 --- a/mirai-core/src/commonMain/kotlin/network/impl/netty/NettyNetworkHandler.kt +++ b/mirai-core/src/commonMain/kotlin/network/impl/netty/NettyNetworkHandler.kt @@ -30,10 +30,7 @@ import net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport import net.mamoe.mirai.internal.network.handler.logger import net.mamoe.mirai.internal.network.handler.state.StateObserver import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket -import net.mamoe.mirai.utils.ExceptionCollector -import net.mamoe.mirai.utils.childScope -import net.mamoe.mirai.utils.debug -import net.mamoe.mirai.utils.systemProp +import net.mamoe.mirai.utils.* import java.net.SocketAddress import kotlin.coroutines.CoroutineContext import io.netty.channel.Channel as NettyChannel @@ -218,7 +215,9 @@ internal open class NettyNetworkHandler( context[SsoProcessor].login(this@NettyNetworkHandler) }.apply { invokeOnCompletion { error -> - if (error != null) { + if (error == null) { + this@NettyNetworkHandler.launch { resumeConnection() } + } else { if (error is StateSwitchingException && error.new is StateConnecting) { return@invokeOnCompletion // already been switching to CONNECTING } @@ -303,7 +302,7 @@ internal open class NettyNetworkHandler( }.apply { invokeOnCompletion { e -> if (e != null) { - logger.debug { "x" } + logger.info { "Heartbeat failed: $e." } } } } 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 0fc32e77d..9e9a26bb7 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 @@ -25,6 +25,7 @@ import net.mamoe.mirai.contact.NormalMember import net.mamoe.mirai.data.MemberInfo import net.mamoe.mirai.event.AbstractEvent import net.mamoe.mirai.event.Event +import net.mamoe.mirai.event.broadcast import net.mamoe.mirai.event.events.* import net.mamoe.mirai.internal.QQAndroidBot import net.mamoe.mirai.internal.contact.* @@ -46,7 +47,6 @@ import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory import net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket import net.mamoe.mirai.internal.network.protocol.packet.chat.NewContact import net.mamoe.mirai.internal.network.protocol.packet.list.FriendList -import net.mamoe.mirai.internal.utils.broadcastWithBot import net.mamoe.mirai.internal.utils.io.serialization.loadAs import net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf import net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf @@ -203,7 +203,7 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory() + ).sendAndExpect() } return } @@ -214,7 +214,7 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory() + ).sendAndExpect() } return } @@ -568,7 +568,7 @@ internal suspend fun MsgComm.Msg.transform(bot: QQAndroidBot, fromSync: Boolean Mirai.newStranger(bot, StrangerInfoImpl(id, nick, fromGroup)).let { bot.getStranger(id)?.let { previous -> bot.strangers.remove(id) - StrangerRelationChangeEvent.Deleted(previous).broadcastWithBot(bot) + StrangerRelationChangeEvent.Deleted(previous).broadcast() } bot.strangers.delegate.add(it) diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt index ebbb2c3b5..e88ad0e98 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt @@ -15,6 +15,7 @@ import kotlinx.io.core.ByteReadPacket import net.mamoe.mirai.contact.Member import net.mamoe.mirai.event.AbstractEvent import net.mamoe.mirai.event.Event +import net.mamoe.mirai.event.broadcast import net.mamoe.mirai.event.events.GroupMessageEvent import net.mamoe.mirai.event.events.GroupMessageSyncEvent import net.mamoe.mirai.event.events.MemberCardChangeEvent @@ -33,9 +34,8 @@ import net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm import net.mamoe.mirai.internal.network.protocol.data.proto.MsgOnlinePush import net.mamoe.mirai.internal.network.protocol.data.proto.Oidb0x8fc import net.mamoe.mirai.internal.network.protocol.packet.IncomingPacketFactory -import net.mamoe.mirai.internal.network.protocol.packet.chat.receive.OnlinePushPbPushGroupMsg.MemberNick.Companion.generateMemberNickFromMember -import net.mamoe.mirai.internal.utils.broadcastWithBot import net.mamoe.mirai.internal.utils.io.serialization.loadAs +import net.mamoe.mirai.internal.network.protocol.packet.chat.receive.OnlinePushPbPushGroupMsg.MemberNick.Companion.generateMemberNickFromMember import net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf import net.mamoe.mirai.message.data.MessageSourceKind.GROUP import net.mamoe.mirai.utils.* @@ -162,14 +162,14 @@ internal object OnlinePushPbPushGroupMsg : IncomingPacketFactory("Onlin new.nick.let { name -> if (currentNameCard != name) { sender._nameCard = name - MemberCardChangeEvent(currentNameCard, name, sender).broadcastWithBot(sender.bot) + MemberCardChangeEvent(currentNameCard, name, sender).broadcast() } } } else { // 说明删除了群名片 if (currentNameCard.isNotEmpty()) { sender._nameCard = "" - MemberCardChangeEvent(currentNameCard, "", sender).broadcastWithBot(sender.bot) + MemberCardChangeEvent(currentNameCard, "", sender).broadcast() } } } diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/list/StrangerList.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/list/StrangerList.kt index 374fab303..e791dc333 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/list/StrangerList.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/list/StrangerList.kt @@ -11,6 +11,7 @@ package net.mamoe.mirai.internal.network.protocol.packet.list import kotlinx.io.core.ByteReadPacket import net.mamoe.mirai.contact.Stranger +import net.mamoe.mirai.event.broadcast import net.mamoe.mirai.event.events.StrangerRelationChangeEvent import net.mamoe.mirai.internal.QQAndroidBot import net.mamoe.mirai.internal.network.Packet @@ -20,7 +21,6 @@ import net.mamoe.mirai.internal.network.protocol.data.proto.Oidb0x5d4 import net.mamoe.mirai.internal.network.protocol.data.proto.OidbSso import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory import net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket -import net.mamoe.mirai.internal.utils.broadcastWithBot import net.mamoe.mirai.internal.utils.io.serialization.loadAs import net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf import net.mamoe.mirai.internal.utils.io.serialization.toByteArray @@ -96,7 +96,7 @@ internal class StrangerList { pkg.bodybuffer.loadAs(Oidb0x5d4.RspBody.serializer()).result.forEach { delResult -> bot.getStranger(delResult.uin)?.let { bot.strangers.remove(delResult.uin) - StrangerRelationChangeEvent.Deleted(it).broadcastWithBot(bot) + StrangerRelationChangeEvent.Deleted(it).broadcast() } } } diff --git a/mirai-core/src/commonMain/kotlin/utils/events.kt b/mirai-core/src/commonMain/kotlin/utils/events.kt index 36bee4b8b..3dd27ed87 100644 --- a/mirai-core/src/commonMain/kotlin/utils/events.kt +++ b/mirai-core/src/commonMain/kotlin/utils/events.kt @@ -16,10 +16,12 @@ import net.mamoe.mirai.internal.contact.replaceMagicCodes import net.mamoe.mirai.internal.network.Packet import net.mamoe.mirai.utils.verbose +@Deprecated("broad", ReplaceWith("this.broadcast()", "net.mamoe.mirai.event.broadcast")) internal suspend fun T.broadcastWithBot(bot: Bot): T { this.let log@{ event -> val logger = bot.logger if (event is Packet.NoLog) return@log + if (event is Packet.NoEventLog) return@log if (event is Packet.NoEventLog) { logger.verbose { "Recv: $event".replaceMagicCodes() } } else { diff --git a/mirai-core/src/commonTest/kotlin/network/framework/AbstractRealNetworkHandlerTest.kt b/mirai-core/src/commonTest/kotlin/network/framework/AbstractRealNetworkHandlerTest.kt index c47d47104..c3cc07f2a 100644 --- a/mirai-core/src/commonTest/kotlin/network/framework/AbstractRealNetworkHandlerTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/framework/AbstractRealNetworkHandlerTest.kt @@ -10,6 +10,7 @@ package net.mamoe.mirai.internal.network.framework import kotlinx.coroutines.CoroutineScope +import net.mamoe.mirai.internal.AbstractBot import net.mamoe.mirai.internal.MockBot import net.mamoe.mirai.internal.QQAndroidBot import net.mamoe.mirai.internal.network.QQAndroidClient @@ -109,13 +110,13 @@ internal abstract class AbstractRealNetworkHandlerTest : Abs set(ContactUpdater, ContactUpdaterImpl(bot, components, networkLogger)) set(BdhSessionSyncer, BdhSessionSyncerImpl(configuration, networkLogger, components)) set(ServerList, ServerListImpl()) - set(PacketHandler, LoggingPacketHandler(bot, components, networkLogger)) + set(PacketHandler, LoggingPacketHandler(bot, networkLogger)) set(PacketCodec, PacketCodecImpl()) set(OtherClientUpdater, OtherClientUpdaterImpl(bot, components, bot.logger)) set(ConfigPushSyncer, ConfigPushSyncerImpl()) set(BotOfflineEventMonitor, object : BotOfflineEventMonitor { - override fun attachJob(bot: QQAndroidBot, scope: CoroutineScope) { + override fun attachJob(bot: AbstractBot, scope: CoroutineScope) { } }) set(StateObserver, bot.run { stateObserverChain() })