File tree Expand file tree Collapse file tree 5 files changed +59
-6
lines changed
commonMain/kotlin/org/ntqqrev/yogurt
jvmMain/kotlin/org/ntqqrev/yogurt/util
nativeMain/kotlin/org/ntqqrev/yogurt/util Expand file tree Collapse file tree 5 files changed +59
-6
lines changed Original file line number Diff line number Diff line change 11package org.ntqqrev.yogurt
22
3+ import com.github.ajalt.mordant.platform.MultiplatformSystem.exitProcess
4+ import com.github.ajalt.mordant.rendering.TextColors
35import io.ktor.server.application.*
46import io.ktor.server.plugins.di.*
57import kotlinx.coroutines.flow.*
@@ -17,6 +19,7 @@ import org.ntqqrev.acidify.common.android.AndroidSessionStore
1719import org.ntqqrev.acidify.common.android.AndroidSignProvider
1820import org.ntqqrev.acidify.common.android.AndroidUrlSignProvider
1921import org.ntqqrev.acidify.exception.UnstableNetworkException
22+ import org.ntqqrev.acidify.exception.WtLoginException
2023import org.ntqqrev.milky.Event
2124import org.ntqqrev.yogurt.YogurtApp.config
2225import org.ntqqrev.yogurt.YogurtApp.t
@@ -177,6 +180,8 @@ suspend fun Application.botLogin() {
177180 t.println (e.manualVerifyUrl)
178181 readln()
179182 botLogin()
183+ } catch (e: WtLoginException ) {
184+ t.println (TextColors .red(" ${e.tag} (code=${e.code} ):${e.msg} " ))
180185 }
181186 }
182187 }
Original file line number Diff line number Diff line change 22
33package org.ntqqrev.yogurt
44
5+ import com.github.ajalt.mordant.platform.MultiplatformSystem.exitProcess
6+ import com.github.ajalt.mordant.rendering.TextColors
57import kotlinx.coroutines.delay
68import kotlinx.coroutines.runBlocking
9+ import org.ntqqrev.yogurt.YogurtApp.config
10+ import org.ntqqrev.yogurt.YogurtApp.t
11+ import org.ntqqrev.yogurt.util.isCausedByAddrInUse
712import kotlin.jvm.JvmName
813
914fun main () {
1015 val server = YogurtApp .createServer()
11- server.start(wait = false )
12- server.onSigint {
13- server.stop(gracePeriodMillis = 2000L , timeoutMillis = 5000L )
14- }
15- runBlocking {
16- delay(Long .MAX_VALUE )
16+ try {
17+ server.start(wait = false )
18+ server.onSigint {
19+ server.stop(gracePeriodMillis = 2000L , timeoutMillis = 5000L )
20+ }
21+ runBlocking {
22+ delay(Long .MAX_VALUE )
23+ }
24+ } catch (e: Throwable ) {
25+ if (e.isCausedByAddrInUse()) {
26+ t.println (
27+ TextColors .red(
28+ """
29+ 无法启动服务器,可能是 ${config.httpConfig.host} :${config.httpConfig.port} 已被占用。
30+ 请检查是否有其他程序正在使用该地址,或者修改配置文件中的 host 和 port 后重试。
31+ """ .trimIndent()
32+ )
33+ )
34+ }
35+ throw e
1736 }
1837}
Original file line number Diff line number Diff line change 1+ package org.ntqqrev.yogurt.util
2+
3+ expect fun Throwable.isCausedByAddrInUse (): Boolean
Original file line number Diff line number Diff line change 1+ package org.ntqqrev.yogurt.util
2+
3+ actual tailrec fun Throwable.isCausedByAddrInUse (): Boolean {
4+ if (this is java.net.BindException ) {
5+ return true
6+ }
7+ return cause?.isCausedByAddrInUse() ? : false
8+ }
Original file line number Diff line number Diff line change 1+ package org.ntqqrev.yogurt.util
2+
3+ import io.ktor.utils.io.errors.PosixException
4+
5+ val addrInUsePosixCodes = setOf (
6+ 48 , // macOS - EADDRINUSE
7+ 98 , // Linux - EADDRINUSE
8+ 10048 , // Windows - WSAEADDRINUSE
9+ )
10+
11+ actual tailrec fun Throwable.isCausedByAddrInUse (): Boolean {
12+ if (this is PosixException .PosixErrnoException ) {
13+ if (errno in addrInUsePosixCodes) {
14+ return true
15+ }
16+ }
17+ return cause?.isCausedByAddrInUse() ? : false
18+ }
You can’t perform that action at this time.
0 commit comments