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+ }
0 commit comments