Skip to content

Commit b20012f

Browse files
committed
Move init logic to .seal.kt
1 parent d94ddfd commit b20012f

3 files changed

Lines changed: 96 additions & 10 deletions

File tree

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

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,7 @@ import org.ntqqrev.acidify.exception.WtLoginException
1212
import org.ntqqrev.ktfs.withFs
1313
import org.ntqqrev.yogurt.YogurtApp.config
1414
import org.ntqqrev.yogurt.YogurtApp.t
15-
import org.ntqqrev.yogurt.util.SealUrlSignProvider
1615
import org.ntqqrev.yogurt.util.logHandler
17-
import org.ntqqrev.yogurt.util.readEnvironmentVariable
18-
import org.ntqqrev.yogurt.util.setEnvironmentVariable
1916

2017
suspend fun Application.initializePC(): Bot = withFs {
2118
val sessionStore: SessionStore = if (sessionStorePath.exists) {
@@ -42,14 +39,12 @@ suspend fun Application.initializePC(): Bot = withFs {
4239
require(config.protocol.uin != 0L) {
4340
"使用 Lagrange Sign API 时,请在配置文件中填写 uin 字段"
4441
}
45-
val launcherSignature = readEnvironmentVariable("APP_LAUNCHER_SIG")
46-
val jwtToken = readEnvironmentVariable("APP_JWT_TOKEN")
4742
appInfo = when (config.protocol.version) {
4843
"fetched" -> throw IllegalStateException("在使用 Lagrange Sign API 时,必须显式指定 AppInfo 版本或自行提供 AppInfo 文件,无法使用 fetched 版本")
4944
"custom" -> readCustomAppInfo()
5045
else -> readBundledAppInfo()
5146
}
52-
signProvider = SealUrlSignProvider(
47+
signProvider = LagrangeUrlSignProvider(
5348
url = config.protocol.signApiUrl,
5449
token = config.protocol.pcLagrangeSignToken,
5550
uin = config.protocol.uin,
@@ -62,9 +57,6 @@ suspend fun Application.initializePC(): Bot = withFs {
6257
else -> throw IllegalStateException()
6358
}
6459
}_NQ_${appInfo.currentVersion.replace('-', '_')}_GW_B",
65-
jwtToken = jwtToken,
66-
launcherSignature = launcherSignature,
67-
onJwtTokenUpdated = { setEnvironmentVariable("APP_JWT_TOKEN", it) },
6860
)
6961
} else {
7062
signProvider = UrlSignProvider(config.protocol.signApiUrl)
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package org.ntqqrev.yogurt
2+
3+
import io.ktor.server.application.Application
4+
import io.ktor.server.plugins.di.dependencies
5+
import kotlinx.coroutines.runBlocking
6+
import org.ntqqrev.acidify.AbstractBot
7+
import org.ntqqrev.acidify.Bot
8+
import org.ntqqrev.acidify.common.AppInfo
9+
import org.ntqqrev.acidify.common.SessionStore
10+
import org.ntqqrev.acidify.common.SignProvider
11+
import org.ntqqrev.acidify.common.UrlSignProvider
12+
import org.ntqqrev.acidify.offline
13+
import org.ntqqrev.ktfs.withFs
14+
import org.ntqqrev.yogurt.YogurtApp.config
15+
import org.ntqqrev.yogurt.YogurtApp.t
16+
import org.ntqqrev.yogurt.util.SealUrlSignProvider
17+
import org.ntqqrev.yogurt.util.logHandler
18+
import org.ntqqrev.yogurt.util.readEnvironmentVariable
19+
import org.ntqqrev.yogurt.util.setEnvironmentVariable
20+
21+
suspend fun Application.initializeSeal(): Bot = withFs {
22+
val sessionStore: SessionStore = if (sessionStorePath.exists) {
23+
SessionStore.fromJson(sessionStorePath.readText())
24+
} else SessionStore.empty()
25+
26+
var signProvider: SignProvider
27+
var appInfo: AppInfo
28+
29+
fun readCustomAppInfo(): AppInfo {
30+
return if (customAppInfoPath.exists) {
31+
AppInfo.fromJson(customAppInfoPath.readText())
32+
} else {
33+
throw IllegalStateException("未在 $customAppInfoPath 下找到自定义 AppInfo 文件")
34+
}
35+
}
36+
37+
fun readBundledAppInfo(): AppInfo {
38+
return bundledPCAppInfo["${config.protocol.os}/${config.protocol.version}"]
39+
?: throw IllegalStateException("未找到匹配的内置 AppInfo,请检查配置的 OS 和 Version 是否正确")
40+
}
41+
42+
if (config.protocol.pcLagrangeSignToken.isNotEmpty()) {
43+
require(config.protocol.uin != 0L) {
44+
"使用 Lagrange Sign API 时,请在配置文件中填写 uin 字段"
45+
}
46+
val launcherSignature = readEnvironmentVariable("APP_LAUNCHER_SIG")
47+
val jwtToken = readEnvironmentVariable("APP_JWT_TOKEN")
48+
appInfo = when (config.protocol.version) {
49+
"fetched" -> throw IllegalStateException("在使用 Lagrange Sign API 时,必须显式指定 AppInfo 版本或自行提供 AppInfo 文件,无法使用 fetched 版本")
50+
"custom" -> readCustomAppInfo()
51+
else -> readBundledAppInfo()
52+
}
53+
signProvider = SealUrlSignProvider(
54+
url = config.protocol.signApiUrl,
55+
token = config.protocol.pcLagrangeSignToken,
56+
uin = config.protocol.uin,
57+
guid = sessionStore.guid.toHexString(),
58+
qua = "V1_${
59+
when (config.protocol.os) {
60+
"Windows" -> "WIN"
61+
"Mac" -> "MAC"
62+
"Linux" -> "LNX"
63+
else -> throw IllegalStateException()
64+
}
65+
}_NQ_${appInfo.currentVersion.replace('-', '_')}_GW_B",
66+
jwtToken = jwtToken,
67+
launcherSignature = launcherSignature,
68+
onJwtTokenUpdated = { setEnvironmentVariable("APP_JWT_TOKEN", it) },
69+
)
70+
} else {
71+
signProvider = UrlSignProvider(config.protocol.signApiUrl)
72+
appInfo = when (config.protocol.version) {
73+
"fetched" -> signProvider.getAppInfo()
74+
?: throw IllegalStateException("通过 Sign API 获取 AppInfo 失败,请检查地址是否正确并且支持获取 AppInfo 功能")
75+
76+
"custom" -> readCustomAppInfo()
77+
else -> readBundledAppInfo()
78+
}
79+
}
80+
81+
t.println("使用协议 ${appInfo.os} ${appInfo.currentVersion} (AppId: ${appInfo.subAppId})")
82+
val bot = Bot(
83+
appInfo = appInfo,
84+
sessionStore = sessionStore,
85+
signProvider = signProvider,
86+
scope = this@initializeSeal, // application is a CoroutineScope
87+
minLogLevel = config.logging.coreLogLevel,
88+
logHandler = YogurtApp.logHandler,
89+
)
90+
dependencies {
91+
provide<AbstractBot> { bot } cleanup { runBlocking { it.offline() } }
92+
}
93+
return bot
94+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ object YogurtApp {
9090
}
9191

9292
when {
93-
isPC -> initializePC()
93+
isPC -> initializeSeal()
9494
isAndroid -> initializeAndroid()
9595
else -> throw IllegalStateException(
9696
"不支持的协议 ${config.protocol.os},当前仅支持 Windows、Mac、Linux、AndroidPhone、AndroidPad"

0 commit comments

Comments
 (0)