From 05c73017ffd82976ecdd66ba1f28931acd1cc93b Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Mon, 7 Oct 2019 12:52:28 +0800
Subject: [PATCH] Login timeout

---
 .../protocol/tim/TIMBotNetworkHandler.kt        | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/TIMBotNetworkHandler.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/TIMBotNetworkHandler.kt
index 6ecddcc4f..77145abe4 100644
--- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/TIMBotNetworkHandler.kt
+++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/TIMBotNetworkHandler.kt
@@ -23,6 +23,7 @@ import java.net.DatagramPacket
 import java.net.DatagramSocket
 import java.net.InetSocketAddress
 import java.util.*
+import java.util.concurrent.atomic.AtomicBoolean
 import javax.imageio.ImageIO
 
 /**
@@ -61,11 +62,11 @@ internal class TIMBotNetworkHandler(private val bot: Bot) : BotNetworkHandler {
         val ip = ipQueue.poll() ?: return LoginState.UNKNOWN//所有服务器均返回 UNKNOWN
 
         return socket.touch(ip).let { state ->
-            //if (state == LoginState.UNKNOWN || state == LoginState.TIMEOUT) {
-            //    loginInternal(ipQueue)//超时或未知, 重试连接下一个服务器
-            //} else {
-            state
-            // }
+            if (state == LoginState.UNKNOWN || state == LoginState.TIMEOUT) {
+                loginInternal(ipQueue)//超时或未知, 重试连接下一个服务器
+            } else {
+                state
+            }
         }
     }
 
@@ -187,17 +188,17 @@ internal class TIMBotNetworkHandler(private val bot: Bot) : BotNetworkHandler {
             //bot.waitForPacket(ServerTouchResponsePacket::class, timeoutMillis) {
             //    loginResult?.complete(LoginState.TIMEOUT)
             //}
-            var received = false
+            val received = AtomicBoolean(false)
             ServerPacketReceivedEvent.subscribe {
                 if (it.packet is ServerTouchResponsePacket && it.bot === bot) {
-                    received = true
+                    received.set(true)
                     ListeningStatus.STOPPED
                 } else
                     ListeningStatus.LISTENING
             }
             NetworkScope.launch {
                 delay(2000)
-                if (!received) {
+                if (!received.get()) {
                     loginResult.complete(LoginState.TIMEOUT)
                 }
             }