From a12a12e786c854c9db41f4843fd731d27626e501 Mon Sep 17 00:00:00 2001 From: BTMuli Date: Tue, 2 Dec 2025 00:19:11 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A8=20=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/commands.rs | 4 +-- src-tauri/src/yae/mod.rs | 8 ++---- src-tauri/src/yae/proto.rs | 1 - src/pages/common/PageAchi.vue | 54 +++++++++++++++++++++-------------- 4 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 657fff1d..4202ab67 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -75,7 +75,7 @@ pub async fn get_dir_size(path: String) -> u64 { pub fn is_in_admin() -> bool { #[cfg(not(target_os = "windows"))] { - Err("This function is only supported on Windows.".into()) + return Err("This function is only supported on Windows.".into()); } use windows_sys::Win32::Foundation::HANDLE; @@ -121,7 +121,7 @@ pub fn is_in_admin() -> bool { pub fn run_with_admin() -> Result<(), String> { #[cfg(not(target_os = "windows"))] { - Err("This function is only supported on Windows.".into()) + return Err("This function is only supported on Windows.".into()); } use std::ffi::OsStr; diff --git a/src-tauri/src/yae/mod.rs b/src-tauri/src/yae/mod.rs index 8e698c71..99020cb4 100644 --- a/src-tauri/src/yae/mod.rs +++ b/src-tauri/src/yae/mod.rs @@ -5,13 +5,10 @@ pub mod inject; pub mod proto; use inject::{call_yaemain, create_named_pipe, find_module_base, inject_dll, spawn_process}; -use prost::encoding::{decode_key, WireType}; use proto::parse_achi_list; use serde_json::Value; -use std::collections::HashMap; use std::fs::File; -use std::io; -use std::io::{Read, Write}; +use std::io::{self, Read, Write}; use std::os::windows::io::{FromRawHandle, RawHandle}; use std::sync::Arc; use tauri::{AppHandle, Emitter, Manager}; @@ -69,8 +66,9 @@ fn read_exact_vec(r: &mut R, len: usize) -> io::Result> { pub fn call_yae_dll(app_handle: AppHandle, game_path: String) -> () { #[cfg(not(target_os = "windows"))] { - Err("This function is only supported on Windows.".into()) + return Err("This function is only supported on Windows.".into()); } + let dll_path = app_handle.path().resource_dir().unwrap().join("resources/YaeAchievementLib.dll"); dbg!(&dll_path); // 0. 创建 YaeAchievementPipe 的 命名管道,获取句柄 diff --git a/src-tauri/src/yae/proto.rs b/src-tauri/src/yae/proto.rs index a54b151d..0696e660 100644 --- a/src-tauri/src/yae/proto.rs +++ b/src-tauri/src/yae/proto.rs @@ -141,7 +141,6 @@ pub fn parse_achi_list(bytes: &[u8]) -> Result, DecodeError> { } if !dict.is_empty() { - println!("Raw dict: {:?}", dict); dicts.push(dict); } } diff --git a/src/pages/common/PageAchi.vue b/src/pages/common/PageAchi.vue index f01634c7..b3684f69 100644 --- a/src/pages/common/PageAchi.vue +++ b/src/pages/common/PageAchi.vue @@ -5,10 +5,10 @@ icon 我的成就
@@ -52,10 +52,10 @@ @@ -79,7 +79,7 @@ import TSUserAchi from "@Sqlm/userAchi.js"; import useAppStore from "@store/app.js"; import { path } from "@tauri-apps/api"; import { invoke } from "@tauri-apps/api/core"; -import { listen, type UnlistenFn, type Event } from "@tauri-apps/api/event"; +import { type Event, listen, type UnlistenFn } from "@tauri-apps/api/event"; import { open, save } from "@tauri-apps/plugin-dialog"; import { exists, writeTextFile } from "@tauri-apps/plugin-fs"; import { platform } from "@tauri-apps/plugin-os"; @@ -131,17 +131,14 @@ onMounted(async () => { await handleImportOuter(route.query.app); } achiListener = await listen("updateAchi", async () => await refreshOverview()); - yaeListener = await listen( - "yae_achi_list", - async (e: Event) => { - try { - await tryParseYaeAchi(JSON.parse(e.payload)); - } catch (err) { - await TGLogger.Error(`[Achievements][yae_achi_list] 解析Yae成就数据失败: ${err}`); - showSnackbar.error(`解析Yae成就数据失败:${err}`); - } - }, - ); + yaeListener = await listen("yae_achi_list", async (e: Event) => { + try { + await tryParseYaeAchi(JSON.parse(e.payload)); + } catch (err) { + await TGLogger.Error(`[Achievements][yae_achi_list] 解析Yae成就数据失败: ${err}`); + showSnackbar.error(`解析Yae成就数据失败:${err}`); + } + }); }); onUnmounted(async () => { @@ -308,7 +305,7 @@ async function deleteUid(): Promise { async function toYae(): Promise { if (platform() !== "windows") { - showSnackbar.warn("MacOS暂不支持该功能"); + showSnackbar.warn("该功能仅支持Windows系统"); return; } if (gameDir.value === "未设置") { @@ -321,20 +318,35 @@ async function toYae(): Promise { return; } // 判断是否是管理员权限 - const isAdmin = await invoke("is_in_admin"); + let isAdmin = false; + try { + isAdmin = await invoke("is_in_admin"); + } catch (err) { + showSnackbar.error("检测管理员权限失败:" + (err?.message || err)); + return; + } if (!isAdmin) { const check = await showDialog.check("是否以管理员模式重启?", "该功能需要管理员权限才能使用"); if (!check) { showSnackbar.cancel("已取消以管理员模式重启"); return; } - await invoke("run_with_admin"); + try { + await invoke("run_with_admin"); + } catch (err) { + showSnackbar.error("以管理员模式重启失败:" + (err?.message || err)); + return; + } + } + try { + await invoke("call_yae_dll", { gamePath: gamePath }); + } catch (err) { + showSnackbar.error("调用Yae DLL失败:" + (err?.message || err)); + return; } - await invoke("call_yae_dll", { gamePath: gamePath }); } async function tryParseYaeAchi(payload: TGApp.Plugins.Yae.AchiListRes): Promise { - console.log(typeof payload, payload); if (payload.length === 0) { showSnackbar.warn(`未从Yae获取到成就数据`); return; @@ -349,7 +361,7 @@ async function tryParseYaeAchi(payload: TGApp.Plugins.Yae.AchiListRes): Promise< return; } await showLoading.start("正在导入成就数据", `UID:${input},数量:${payload.length}`); - await TSUserAchi.mergeUiaf(payload, input); + await TSUserAchi.mergeUiaf(payload, Number(input)); await showLoading.end(); showSnackbar.success("导入成功,即将刷新页面"); await TGLogger.Info("[Achievements][handleImportOuter] 导入成功");