Skip to content

Commit 0c8e7ea

Browse files
committed
feat(yogurt): provide more human-readable error msg
1 parent 11d8247 commit 0c8e7ea

File tree

5 files changed

+59
-6
lines changed

5 files changed

+59
-6
lines changed

yogurt/src/commonMain/kotlin/org/ntqqrev/yogurt/Initialization.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.ntqqrev.yogurt
22

3+
import com.github.ajalt.mordant.platform.MultiplatformSystem.exitProcess
4+
import com.github.ajalt.mordant.rendering.TextColors
35
import io.ktor.server.application.*
46
import io.ktor.server.plugins.di.*
57
import kotlinx.coroutines.flow.*
@@ -17,6 +19,7 @@ import org.ntqqrev.acidify.common.android.AndroidSessionStore
1719
import org.ntqqrev.acidify.common.android.AndroidSignProvider
1820
import org.ntqqrev.acidify.common.android.AndroidUrlSignProvider
1921
import org.ntqqrev.acidify.exception.UnstableNetworkException
22+
import org.ntqqrev.acidify.exception.WtLoginException
2023
import org.ntqqrev.milky.Event
2124
import org.ntqqrev.yogurt.YogurtApp.config
2225
import 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
}

yogurt/src/commonMain/kotlin/org/ntqqrev/yogurt/Main.kt

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,36 @@
22

33
package org.ntqqrev.yogurt
44

5+
import com.github.ajalt.mordant.platform.MultiplatformSystem.exitProcess
6+
import com.github.ajalt.mordant.rendering.TextColors
57
import kotlinx.coroutines.delay
68
import kotlinx.coroutines.runBlocking
9+
import org.ntqqrev.yogurt.YogurtApp.config
10+
import org.ntqqrev.yogurt.YogurtApp.t
11+
import org.ntqqrev.yogurt.util.isCausedByAddrInUse
712
import kotlin.jvm.JvmName
813

914
fun 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
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package org.ntqqrev.yogurt.util
2+
3+
expect fun Throwable.isCausedByAddrInUse(): Boolean
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
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+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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+
}

0 commit comments

Comments
 (0)