mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2026-04-15 21:03:29 +08:00
✨ 添加游戏配置文件类型定义并优化读取逻辑
This commit is contained in:
41
src/types/Game/Config.d.ts
vendored
Normal file
41
src/types/Game/Config.d.ts
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
/**
|
||||
* 游戏配置文件相关
|
||||
* @since Beta v0.9.9
|
||||
*/
|
||||
|
||||
declare namespace TGApp.Game.Config {
|
||||
/**
|
||||
* Config.ini 文件
|
||||
* @since Beta v0.9.9
|
||||
*/
|
||||
type GameConf = {
|
||||
/** 通用配置 */
|
||||
general: GeneralConf;
|
||||
};
|
||||
|
||||
/**
|
||||
* Config.ini 配置
|
||||
* @since Beta v0.9.9
|
||||
*/
|
||||
type GeneralConf = {
|
||||
/** channel */
|
||||
channel: string;
|
||||
/** cps */
|
||||
cps: string;
|
||||
/** downloading_mode */
|
||||
downloading_mode: string;
|
||||
/** game_version */
|
||||
game_version: string;
|
||||
/** plugin_sdk_version */
|
||||
plugin_sdk_version: string;
|
||||
/** sub_channel */
|
||||
sub_channel: string;
|
||||
/**
|
||||
* uapc
|
||||
* @remarks 序列化的JSON字符串
|
||||
*/
|
||||
uapc: string;
|
||||
/** wpf_version */
|
||||
wpf_version: string;
|
||||
};
|
||||
}
|
||||
@@ -1,26 +1,33 @@
|
||||
/**
|
||||
* 游戏文件相关功能
|
||||
* @since Beta v0.9.8
|
||||
* @since Beta v0.9.9
|
||||
*/
|
||||
|
||||
import showDialog from "@comp/func/dialog.js";
|
||||
import showSnackbar from "@comp/func/snackbar.js";
|
||||
import { parse } from "ini";
|
||||
import { invoke } from "@tauri-apps/api/core";
|
||||
import { documentDir, resourceDir, sep } from "@tauri-apps/api/path";
|
||||
import {
|
||||
copyFile,
|
||||
exists,
|
||||
mkdir,
|
||||
readDir,
|
||||
readTextFile,
|
||||
readTextFileLines,
|
||||
} from "@tauri-apps/plugin-fs";
|
||||
import { copyFile, exists, mkdir, readDir, readTextFile } from "@tauri-apps/plugin-fs";
|
||||
import { platform } from "@tauri-apps/plugin-os";
|
||||
import TGLogger from "@utils/TGLogger.js";
|
||||
|
||||
// YAE支持的游戏版本
|
||||
export const YAE_GAME_VER: Readonly<string> = "6.4.0";
|
||||
|
||||
/**
|
||||
* 验证游戏格式
|
||||
* @since Beta v0.9.9
|
||||
* @param data - ini数据
|
||||
* @returns 类型收束
|
||||
*/
|
||||
function verifyConfigIni(data: object): data is TGApp.Game.Config.GameConf {
|
||||
if (!("general" in data) || typeof data.general !== "object" || data.general === null) return false;
|
||||
if (!("game_version" in data.general) || typeof data.general.game_version !== "string") return false;
|
||||
// 简单验证general跟game_version
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 尝试获取游戏版本
|
||||
* @since Beta v0.9.1
|
||||
@@ -37,14 +44,12 @@ export async function tryReadGameVer(gameDir: string): Promise<false | string> {
|
||||
}
|
||||
const iniPath = `${gameDir}${sep()}config.ini`;
|
||||
if (await exists(iniPath)) {
|
||||
const iniRead = await readTextFileLines(iniPath);
|
||||
while (true) {
|
||||
const line = await iniRead.next();
|
||||
const lineRead = line.value;
|
||||
if (typeof lineRead === "string" && lineRead.startsWith("game_version=")) {
|
||||
return lineRead.split("=")[1];
|
||||
}
|
||||
if (line.done) break;
|
||||
const iniRead = await readTextFile(iniPath);
|
||||
try {
|
||||
const iniParse = parse(iniRead);
|
||||
if (verifyConfigIni(iniParse)) return iniParse.general.game_version;
|
||||
} catch (e) {
|
||||
showSnackbar.warn("config.ini 配置格式异常");
|
||||
}
|
||||
}
|
||||
const scriptPath = `${gameDir}${sep()}YuanShen_Data${sep()}Persistent${sep()}ScriptVersion`;
|
||||
@@ -56,12 +61,11 @@ export async function tryReadGameVer(gameDir: string): Promise<false | string> {
|
||||
|
||||
/**
|
||||
* 判断是否是管理员模式
|
||||
* @since Beta v0.9.1
|
||||
* @since Beta v0.9.9
|
||||
*/
|
||||
export async function isRunInAdmin(): Promise<boolean> {
|
||||
try {
|
||||
const isAdmin = await invoke<boolean>("is_in_admin");
|
||||
return isAdmin;
|
||||
return await invoke<boolean>("is_in_admin");
|
||||
} catch (err) {
|
||||
showSnackbar.error(`检测管理员权限失败:${err}`);
|
||||
await TGLogger.Error(`[TGGame][isRunInAdmin]检测管理员权限失败:${err}`);
|
||||
|
||||
Reference in New Issue
Block a user