mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2026-03-15 03:53:16 +08:00
♻️ Yae数据传递移至App层,重构命令处理逻辑
This commit is contained in:
@@ -67,7 +67,7 @@ fn read_exact_vec<R: Read>(r: &mut R, len: usize) -> io::Result<Vec<u8>> {
|
||||
|
||||
/// 调用 dll
|
||||
#[tauri::command]
|
||||
pub fn call_yae_dll(app_handle: AppHandle, game_path: String) -> Result<(), String> {
|
||||
pub fn call_yae_dll(app_handle: AppHandle, game_path: String, uid: String) -> Result<(), String> {
|
||||
let dll_path = app_handle.path().resource_dir().unwrap().join("resources/YaeAchievementLib.dll");
|
||||
dbg!(&dll_path);
|
||||
// 0. 创建 YaeAchievementPipe 的 命名管道,获取句柄
|
||||
@@ -130,7 +130,9 @@ pub fn call_yae_dll(app_handle: AppHandle, game_path: String) -> Result<(), Stri
|
||||
Ok(list) => {
|
||||
println!("解码成功,成就列表长度: {}", list.len());
|
||||
let json = serde_json::to_string_pretty(&list).unwrap();
|
||||
let _ = app_handle.emit("yae_achi_list", json);
|
||||
let payload =
|
||||
serde_json::json!({"type":"achievement","data":json,"uid":&uid});
|
||||
let _ = app_handle.emit("yae_read", payload);
|
||||
}
|
||||
Err(e) => println!("解析失败: {:?}", e),
|
||||
}
|
||||
@@ -152,7 +154,8 @@ pub fn call_yae_dll(app_handle: AppHandle, game_path: String) -> Result<(), Stri
|
||||
Ok(list) => {
|
||||
println!("解码成功,物品列表长度: {}", list.len());
|
||||
let json = serde_json::to_string_pretty(&list).unwrap();
|
||||
let _ = app_handle.emit("yae_store_list", json);
|
||||
let payload = serde_json::json!({"type":"store","data":json,"uid":&uid});
|
||||
let _ = app_handle.emit("yae_read", payload);
|
||||
}
|
||||
Err(e) => println!("解析失败: {:?}", e),
|
||||
}
|
||||
|
||||
199
src/App.vue
199
src/App.vue
@@ -14,10 +14,13 @@
|
||||
import TBackTop from "@comp/app/t-backTop.vue";
|
||||
import TSidebar from "@comp/app/t-sidebar.vue";
|
||||
import showDialog from "@comp/func/dialog.js";
|
||||
import showLoading from "@comp/func/loading.js";
|
||||
import showSnackbar from "@comp/func/snackbar.js";
|
||||
import OtherApi from "@req/otherReq.js";
|
||||
import TGSqlite from "@Sql/index.js";
|
||||
import TSUserAccount from "@Sqlm/userAccount.js";
|
||||
import TSUserAchi from "@Sqlm/userAchi.js";
|
||||
import TSUserBagMaterial from "@Sqlm/userBagMaterial.js";
|
||||
import useAppStore from "@store/app.js";
|
||||
import useUserStore from "@store/user.js";
|
||||
import { app, core, event, webviewWindow } from "@tauri-apps/api";
|
||||
@@ -35,40 +38,31 @@ import { useRouter } from "vue-router";
|
||||
const router = useRouter();
|
||||
const { theme, needResize, deviceInfo, isLogin, userDir, buildTime } = storeToRefs(useAppStore());
|
||||
const { uid, briefInfo, account, cookie } = storeToRefs(useUserStore());
|
||||
|
||||
const isMain = ref<boolean>(false);
|
||||
const vuetifyTheme = computed<string>(() => (theme.value === "dark" ? "dark" : "light"));
|
||||
|
||||
let themeListener: UnlistenFn | null = null;
|
||||
let urlListener: UnlistenFn | null = null;
|
||||
let dpListener: UnlistenFn | null = null;
|
||||
let resizeListener: UnlistenFn | null = null;
|
||||
let yaeListener: UnlistenFn | null = null;
|
||||
let yaeFlag: Array<string> = [];
|
||||
|
||||
onMounted(async () => {
|
||||
const win = getCurrentWindow();
|
||||
const webview = webviewWindow.getCurrentWebviewWindow();
|
||||
isMain.value = win.label === "TeyvatGuide";
|
||||
if (isMain.value) {
|
||||
const title = "Teyvat Guide v" + (await app.getVersion()) + " Beta";
|
||||
await win.setTitle(title);
|
||||
await listenOnInit();
|
||||
await core.invoke("init_app");
|
||||
urlListener = await getDeepLink();
|
||||
dpListener = await event.listen<string>("active_deep_link", handleDpListen);
|
||||
yaeListener = await event.listen<TGApp.Plugins.Yae.RsEvent>("yae_read", handleYaeListen);
|
||||
}
|
||||
if (needResize.value !== "false") await resizeWindow();
|
||||
document.documentElement.className = theme.value;
|
||||
themeListener = await event.listen<string>("readTheme", (e: Event<string>) => {
|
||||
theme.value = e.payload;
|
||||
document.documentElement.className = theme.value;
|
||||
});
|
||||
resizeListener = await event.listen<string>("needResize", async (e: Event<string>) => {
|
||||
if (e.payload !== "false") {
|
||||
await resizeWindow();
|
||||
} else {
|
||||
const size = getWindowSize(webview.label);
|
||||
await win.setSize(new LogicalSize(size.width, size.height));
|
||||
await webview.setZoom(1);
|
||||
}
|
||||
await win.center();
|
||||
});
|
||||
themeListener = await event.listen<string>("readTheme", handleThemeListen);
|
||||
resizeListener = await event.listen<string>("needResize", handleResizeListen);
|
||||
const isShow = await win.isVisible();
|
||||
if (!isShow) {
|
||||
await win.center();
|
||||
@@ -76,6 +70,146 @@ onMounted(async () => {
|
||||
}
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
if (dpListener !== null) {
|
||||
dpListener();
|
||||
dpListener = null;
|
||||
}
|
||||
if (yaeListener !== null) {
|
||||
yaeListener();
|
||||
yaeListener = null;
|
||||
}
|
||||
if (themeListener !== null) {
|
||||
themeListener();
|
||||
themeListener = null;
|
||||
}
|
||||
if (resizeListener !== null) {
|
||||
resizeListener();
|
||||
resizeListener = null;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 自定义URL协议监听处理
|
||||
* @param {Event<string>} event - 事件
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async function handleDpListen(event: Event<string>): Promise<void> {
|
||||
const windowGet = new webviewWindow.WebviewWindow("TeyvatGuide");
|
||||
if (await windowGet.isMinimized()) await windowGet.unminimize();
|
||||
await windowGet.setFocus();
|
||||
const payload = await parseDeepLink(event.payload);
|
||||
if (payload === false) {
|
||||
showSnackbar.error("无效的 deep link!", 3000);
|
||||
await TGLogger.Error(`[App][getDeepLink] 无效的 deep link! ${JSON.stringify(event.payload)}`);
|
||||
return;
|
||||
}
|
||||
await TGLogger.Info(`[App][getDeepLink] ${event.payload}`);
|
||||
await handleDeepLink(payload);
|
||||
}
|
||||
|
||||
/**
|
||||
* Yae监听处理
|
||||
* @param {Event<TGApp.Plugins.Yae.RsEvent>} event
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async function handleYaeListen(event: Event<TGApp.Plugins.Yae.RsEvent>): Promise<void> {
|
||||
if (event.payload.type === "achievement") {
|
||||
await loadYaeAchi(event.payload.uid, JSON.parse(event.payload.data));
|
||||
if (!yaeFlag.includes("achievement")) yaeFlag.push("achievement");
|
||||
} else if (event.payload.type === "store") {
|
||||
await loadYaeBag(event.payload.uid, JSON.parse(event.payload.data));
|
||||
if (!yaeFlag.includes("store")) yaeFlag.push("store");
|
||||
}
|
||||
if (yaeFlag.length === 2) {
|
||||
yaeFlag = [];
|
||||
showSnackbar.success(`导入Yae数据完成,即将刷新页面`);
|
||||
await showLoading.end();
|
||||
await new Promise((resolve) => setTimeout(resolve, 1000));
|
||||
window.location.reload();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入成就
|
||||
* @param {string} uid - 存档UID
|
||||
* @param {TGApp.Plugins.Yae.AchiListRes} data - 成就数据
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async function loadYaeAchi(uid: string, data: TGApp.Plugins.Yae.AchiListRes): Promise<void> {
|
||||
await showLoading.start("正在导入成就数据", `UID:${uid},数量:${data.length}`);
|
||||
await TGLogger.Info(`[App][loadYaeAchi] 开始处理 ${uid} 的 ${data.length} 条成就数据`);
|
||||
try {
|
||||
await TSUserAchi.mergeUiaf(data, Number(uid));
|
||||
showSnackbar.success(`成功导入 ${uid} 的 ${data.length}条成就数据`);
|
||||
await TGLogger.Info(`[App][loadYaeAchi] 成功导入 ${uid} 的 ${data.length} 条成就数据`);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
await TGLogger.Error(`[App][loadYaeAchi] 成就导入失败:${e}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入材料
|
||||
* @param {string} uid
|
||||
* @param {TGApp.Plugins.Yae.BagListRes} data - 背包数据
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async function loadYaeBag(uid: string, data: TGApp.Plugins.Yae.BagListRes): Promise<void> {
|
||||
const listM = data.filter((i) => i.kind === "material");
|
||||
const listW = data.filter((i) => i.kind === "weapon");
|
||||
const listR = data.filter((i) => i.kind === "reliquary");
|
||||
await TGLogger.Info(`[App][loadYaeBag] 接收到 ${uid} 的背包数据`);
|
||||
await TGLogger.Info(
|
||||
`[App][loadYaeBag] 材料:${listM.length},武器:${listW.length},圣遗物:${listR.length}`,
|
||||
);
|
||||
await showLoading.start("正在导入材料数据", `UID:${uid},数量:${listM.length}`);
|
||||
try {
|
||||
const now = new Date();
|
||||
const skip = await TSUserBagMaterial.saveYaeData(Number(uid), listM);
|
||||
const cost = new Date().getTime() - now.getTime();
|
||||
await TGLogger.Info(`[App][loadYaeBag] Skip: ${skip}`);
|
||||
if (skip === 0) {
|
||||
showSnackbar.success(`成功导入 ${listM.length} 条数据,耗时 ${Math.floor(cost / 1000)}s`);
|
||||
} else if (skip === listM.length) {
|
||||
showSnackbar.success(`未检测到数据更新,耗时 ${Math.floor(cost / 1000)}s`);
|
||||
} else {
|
||||
showSnackbar.success(`成功更新 ${listM.length - skip} 条数据`);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
await TGLogger.Error(`[App][loadYaeBag] 导入材料失败:${e}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 主题监听处理
|
||||
* @param {Event<string>} event - 事件
|
||||
* @returns {void}
|
||||
*/
|
||||
function handleThemeListen(event: Event<string>): void {
|
||||
theme.value = event.payload;
|
||||
document.documentElement.className = theme.value;
|
||||
}
|
||||
|
||||
/**
|
||||
* 窗口适配监听处理
|
||||
* @param {Event<string>} event 事件
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async function handleResizeListen(event: Event<string>): Promise<void> {
|
||||
const win = getCurrentWindow();
|
||||
const webview = webviewWindow.getCurrentWebviewWindow();
|
||||
if (event.payload !== "false") {
|
||||
await resizeWindow();
|
||||
} else {
|
||||
const size = getWindowSize(webview.label);
|
||||
await win.setSize(new LogicalSize(size.width, size.height));
|
||||
await webview.setZoom(1);
|
||||
}
|
||||
await win.center();
|
||||
}
|
||||
|
||||
// 启动后只执行一次的监听
|
||||
async function listenOnInit(): Promise<void> {
|
||||
console.info("[App][listenOnInit] 监听初始化事件!");
|
||||
@@ -160,22 +294,6 @@ async function checkUserLoad(): Promise<void> {
|
||||
await new Promise<void>((resolve) => setTimeout(resolve, 1000));
|
||||
}
|
||||
|
||||
async function getDeepLink(): Promise<UnlistenFn> {
|
||||
return await event.listen<string>("active_deep_link", async (e: Event<string>) => {
|
||||
const windowGet = new webviewWindow.WebviewWindow("TeyvatGuide");
|
||||
if (await windowGet.isMinimized()) await windowGet.unminimize();
|
||||
await windowGet.setFocus();
|
||||
const payload = await parseDeepLink(e.payload);
|
||||
if (payload === false) {
|
||||
showSnackbar.error("无效的 deep link!", 3000);
|
||||
await TGLogger.Error(`[App][getDeepLink] 无效的 deep link! ${JSON.stringify(e.payload)}`);
|
||||
return;
|
||||
}
|
||||
await TGLogger.Info(`[App][getDeepLink] ${e.payload}`);
|
||||
await handleDeepLink(payload);
|
||||
});
|
||||
}
|
||||
|
||||
async function parseDeepLink(payload: string | string[]): Promise<string | false> {
|
||||
try {
|
||||
if (typeof payload === "string") return payload;
|
||||
@@ -239,21 +357,6 @@ async function checkUpdate(): Promise<void> {
|
||||
await openUrl("https://app.btmuli.ink/docs/TeyvatGuide/changelogs.html");
|
||||
}
|
||||
}
|
||||
|
||||
onUnmounted(() => {
|
||||
if (themeListener !== null) {
|
||||
themeListener();
|
||||
themeListener = null;
|
||||
}
|
||||
if (urlListener !== null) {
|
||||
urlListener();
|
||||
urlListener = null;
|
||||
}
|
||||
if (resizeListener !== null) {
|
||||
resizeListener();
|
||||
resizeListener = null;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<style lang="css" scoped>
|
||||
.app-container {
|
||||
|
||||
@@ -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 { type Event, listen, type UnlistenFn } from "@tauri-apps/api/event";
|
||||
import { 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";
|
||||
@@ -103,7 +103,6 @@ const router = useRouter();
|
||||
const { gameDir } = storeToRefs(useAppStore());
|
||||
|
||||
let achiListener: UnlistenFn | null = null;
|
||||
let yaeListener: UnlistenFn | null = null;
|
||||
|
||||
const search = ref<string>("");
|
||||
const isSearch = ref<boolean>(false);
|
||||
@@ -131,14 +130,6 @@ onMounted(async () => {
|
||||
await handleImportOuter(route.query.app);
|
||||
}
|
||||
achiListener = await listen<void>("updateAchi", async () => await refreshOverview());
|
||||
yaeListener = await listen<string>("yae_achi_list", async (e: Event<string>) => {
|
||||
try {
|
||||
await tryParseYaeAchi(JSON.parse(e.payload));
|
||||
} catch (err) {
|
||||
await TGLogger.Error(`[Achievements][yae_achi_list] 解析Yae成就数据失败: ${err}`);
|
||||
showSnackbar.error(`解析Yae成就数据失败:${err}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
onUnmounted(async () => {
|
||||
@@ -146,10 +137,6 @@ onUnmounted(async () => {
|
||||
achiListener();
|
||||
achiListener = null;
|
||||
}
|
||||
if (yaeListener !== null) {
|
||||
yaeListener();
|
||||
yaeListener = null;
|
||||
}
|
||||
});
|
||||
|
||||
watch(() => uidCur.value, refreshOverview);
|
||||
@@ -340,21 +327,6 @@ async function toYae(): Promise<void> {
|
||||
return;
|
||||
}
|
||||
}
|
||||
try {
|
||||
await invoke("call_yae_dll", { gamePath: gamePath });
|
||||
} catch (err) {
|
||||
showSnackbar.error(`调用Yae DLL失败: ${err}`);
|
||||
await TGLogger.Error(`[pageAchi][toYae]调用Yae DLL失败: ${err}`);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
async function tryParseYaeAchi(payload: TGApp.Plugins.Yae.AchiListRes): Promise<void> {
|
||||
console.log(payload);
|
||||
if (payload.length === 0) {
|
||||
showSnackbar.warn(`未从Yae获取到成就数据`);
|
||||
return;
|
||||
}
|
||||
const input = await showDialog.input("请输入存档UID", "UID:", uidCur.value.toString());
|
||||
if (!input) {
|
||||
showSnackbar.cancel("已取消存档导入");
|
||||
@@ -364,14 +336,13 @@ async function tryParseYaeAchi(payload: TGApp.Plugins.Yae.AchiListRes): Promise<
|
||||
showSnackbar.warn("请输入合法数字");
|
||||
return;
|
||||
}
|
||||
await showLoading.start("正在导入成就数据", `UID:${input},数量:${payload.length}`);
|
||||
await TSUserAchi.mergeUiaf(payload, Number(input));
|
||||
await showLoading.end();
|
||||
showSnackbar.success("导入成功,即将刷新页面");
|
||||
await TGLogger.Info("[Achievements][handleImportOuter] 导入成功");
|
||||
await new Promise<void>((resolve) => setTimeout(resolve, 1500));
|
||||
await router.push("/achievements");
|
||||
window.location.reload();
|
||||
try {
|
||||
await invoke("call_yae_dll", { gamePath: gamePath, uid: input });
|
||||
} catch (err) {
|
||||
showSnackbar.error(`调用Yae DLL失败: ${err}`);
|
||||
await TGLogger.Error(`[pageAchi][toYae]调用Yae DLL失败: ${err}`);
|
||||
return;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
|
||||
@@ -86,14 +86,13 @@ import PbMaterialItem from "@comp/pageBag/pb-materialItem.vue";
|
||||
import PboMaterial from "@comp/pageBag/pbo-material.vue";
|
||||
import TSUserBagMaterial from "@Sqlm/userBagMaterial.js";
|
||||
import useAppStore from "@store/app.js";
|
||||
import { event, path } from "@tauri-apps/api";
|
||||
import { path } from "@tauri-apps/api";
|
||||
import { invoke } from "@tauri-apps/api/core";
|
||||
import type { Event, UnlistenFn } from "@tauri-apps/api/event";
|
||||
import { exists } from "@tauri-apps/plugin-fs";
|
||||
import { platform } from "@tauri-apps/plugin-os";
|
||||
import TGLogger from "@utils/TGLogger.js";
|
||||
import { storeToRefs } from "pinia";
|
||||
import { nextTick, onMounted, onUnmounted, ref, shallowRef, watch } from "vue";
|
||||
import { nextTick, onMounted, ref, shallowRef, watch } from "vue";
|
||||
|
||||
import { WikiMaterialData } from "@/data/index.js";
|
||||
|
||||
@@ -114,8 +113,6 @@ export type MaterialInfo = {
|
||||
|
||||
const { gameDir } = storeToRefs(useAppStore());
|
||||
|
||||
let yaeListener: UnlistenFn | null = null;
|
||||
|
||||
const curUid = ref<number>();
|
||||
const selectType = ref<string | null>(null);
|
||||
const search = ref<string>();
|
||||
@@ -134,18 +131,6 @@ onMounted(async () => {
|
||||
// TODO: 如果用户已登录,优先当前登录UID
|
||||
if (uidList.value.length > 0) curUid.value = uidList.value[0];
|
||||
else await showLoading.end();
|
||||
yaeListener = await event.listen<string>("yae_store_list", async (e: Event<string>) => {
|
||||
const parse: TGApp.Plugins.Yae.BagListRes = JSON.parse(e.payload);
|
||||
const materialList = parse.filter((i) => i.kind === "material");
|
||||
await tryImport(materialList);
|
||||
});
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
if (yaeListener) {
|
||||
yaeListener();
|
||||
yaeListener = null;
|
||||
}
|
||||
});
|
||||
|
||||
watch(
|
||||
@@ -254,25 +239,6 @@ async function tryCallYae(): Promise<void> {
|
||||
return;
|
||||
}
|
||||
}
|
||||
try {
|
||||
await invoke("call_yae_dll", { gamePath: gamePath });
|
||||
} catch (err) {
|
||||
showSnackbar.error(`调用Yae DLL失败: ${err}`);
|
||||
await TGLogger.Error(`[pageAchi][toYae]调用Yae DLL失败: ${err}`);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 尝试导入材料
|
||||
* @param {Array<TGApp.Plugins.Yae.BagItem<"material">>} data 材料数据
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async function tryImport(data: Array<TGApp.Plugins.Yae.BagItem<"material">>): Promise<void> {
|
||||
if (data.length === 0) {
|
||||
showSnackbar.warn("获取材料数据为空");
|
||||
return;
|
||||
}
|
||||
const input = await showDialog.input("请输入存档UID", "UID:", curUid.value?.toString());
|
||||
if (!input) {
|
||||
showSnackbar.cancel("已取消存档导入");
|
||||
@@ -282,17 +248,12 @@ async function tryImport(data: Array<TGApp.Plugins.Yae.BagItem<"material">>): Pr
|
||||
showSnackbar.warn("请输入合法数字");
|
||||
return;
|
||||
}
|
||||
await showLoading.start("正在导入材料数据", `UID:${input},数量:${data.length}`);
|
||||
const now = new Date();
|
||||
const skip = await TSUserBagMaterial.saveYaeData(Number(input), data);
|
||||
await showLoading.end();
|
||||
const cost = new Date().getTime() - now.getTime();
|
||||
if (skip === 0) {
|
||||
showSnackbar.success(`成功导入 ${data.length} 条数据,耗时 ${Math.floor(cost / 1000)}s`);
|
||||
} else if (skip === data.length) {
|
||||
showSnackbar.success(`未检测到数据更新,耗时 ${Math.floor(cost / 1000)}s`);
|
||||
} else {
|
||||
showSnackbar.success(`成功更新 ${data.length - skip} 条数据`);
|
||||
try {
|
||||
await invoke("call_yae_dll", { gamePath: gamePath, uid: input.toString() });
|
||||
} catch (err) {
|
||||
showSnackbar.error(`调用Yae DLL失败: ${err}`);
|
||||
await TGLogger.Error(`[pageAchi][toYae]调用Yae DLL失败: ${err}`);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -54,6 +54,7 @@ async function test(): Promise<void> {
|
||||
try {
|
||||
await invoke("call_yae_dll", {
|
||||
gamePath: "D:\\Games\\Genshin Impact bilibili\\games\\Genshin Impact Game\\YuanShen.exe",
|
||||
uid: "500299765",
|
||||
});
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
|
||||
29
src/types/Plugins/Yae.d.ts
vendored
29
src/types/Plugins/Yae.d.ts
vendored
@@ -4,6 +4,19 @@
|
||||
*/
|
||||
|
||||
declare namespace TGApp.Plugins.Yae {
|
||||
/**
|
||||
* 后端返的事件数据
|
||||
* @since Beta v0.9.0
|
||||
*/
|
||||
type RsEvent = {
|
||||
/** 数据,序列化后的JSON */
|
||||
data: string;
|
||||
/** 类型,成就或背包 */
|
||||
type: "achievement" | "store";
|
||||
/** 存档UID,需要预先输入 */
|
||||
uid: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* 后端返的成就列表数据
|
||||
* @since Beta v0.7.8
|
||||
@@ -22,8 +35,8 @@ declare namespace TGApp.Plugins.Yae {
|
||||
*/
|
||||
type BagItemUnion =
|
||||
| BagItemMaterial
|
||||
| BagItem<"weapon">
|
||||
| BagItem<"reliquary">
|
||||
| BagItemWeapon
|
||||
| BagItemRelic
|
||||
| BagItem<"furniture">
|
||||
| BagItem<"virtual">
|
||||
| BagItem<"unknown">;
|
||||
@@ -34,6 +47,18 @@ declare namespace TGApp.Plugins.Yae {
|
||||
*/
|
||||
type BagItemMaterial = BagItem<"material">;
|
||||
|
||||
/**
|
||||
* 背包物品-武器
|
||||
* @since Beta v0.9.0
|
||||
*/
|
||||
type BagItemWeapon = BagItem<"weapon">;
|
||||
|
||||
/**
|
||||
* 背包物品-圣遗物
|
||||
* @since Beta v0.9.0
|
||||
*/
|
||||
type BagItemRelic = BagItem<"reliquary">;
|
||||
|
||||
/**
|
||||
* 背包物品信息
|
||||
* @since Beta v0.9.0
|
||||
|
||||
Reference in New Issue
Block a user