From c6075ec29986ba73e93539dc5d708540a9738940 Mon Sep 17 00:00:00 2001 From: Him188 Date: Sat, 5 Jun 2021 13:46:54 +0800 Subject: [PATCH] Refine state observer for events --- mirai-core/src/commonMain/kotlin/QQAndroidBot.kt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt b/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt index 207bf1e5a..08cd10233 100644 --- a/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt +++ b/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt @@ -30,6 +30,7 @@ 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.NetworkException import net.mamoe.mirai.internal.network.handler.selector.SelectorNetworkHandler import net.mamoe.mirai.internal.network.handler.state.StateChangedObserver import net.mamoe.mirai.internal.network.handler.state.StateObserver @@ -83,18 +84,20 @@ internal open class QQAndroidBot constructor( previous: BaseStateImpl, new: BaseStateImpl ) { - components.eventDispatcher.broadcastAsync(BotOnlineEvent(bot)).successThen { + components.eventDispatcher.broadcastAsync(BotOnlineEvent(bot)).onSuccess { if (!shouldBroadcastRelogin.compareAndSet(false, true)) { components.eventDispatcher.broadcastAsync(BotReloginEvent(bot, new.getCause())) } } } }, - StateChangedObserver(State.OK, State.CONNECTING) { new -> - components.eventDispatcher.broadcastAsync(BotOfflineEvent.Dropped(bot, new.getCause())) - }, StateChangedObserver(State.OK, State.CLOSED) { new -> - components.eventDispatcher.broadcastAsync(BotOfflineEvent.Active(bot, new.getCause())) + val cause = new.getCause() + if (cause is NetworkException && cause.recoverable) { + components.eventDispatcher.broadcastAsync(BotOfflineEvent.Dropped(bot, new.getCause())) + } else { + components.eventDispatcher.broadcastAsync(BotOfflineEvent.Active(bot, new.getCause())) + } }, StateChangedObserver(to = State.OK) { new -> components[BotOfflineEventMonitor].attachJob(bot, new)