♻️ 迁移hutaoReq

This commit is contained in:
BTMuli
2026-04-15 14:10:14 +08:00
parent 96d63e8e8c
commit f370953d43
16 changed files with 767 additions and 587 deletions

View File

@@ -73,6 +73,8 @@ import TOverlay from "@comp/app/t-overlay.vue";
import showSnackbar from "@comp/func/snackbar.js"; import showSnackbar from "@comp/func/snackbar.js";
import hutao from "@Hutao/index.js"; import hutao from "@Hutao/index.js";
import useHutaoStore from "@store/hutao.js"; import useHutaoStore from "@store/hutao.js";
import TGHttps from "@utils/TGHttps.js";
import TGLogger from "@utils/TGLogger.js";
import { validEmail } from "@utils/toolFunc.js"; import { validEmail } from "@utils/toolFunc.js";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
import { onUnmounted, ref, shallowRef, useTemplateRef } from "vue"; import { onUnmounted, ref, shallowRef, useTemplateRef } from "vue";
@@ -113,11 +115,20 @@ async function tryGetCode(): Promise<void> {
const check = await usernameRef.value.validate(); const check = await usernameRef.value.validate();
if (check.length > 0) return; if (check.length > 0) return;
codeLoad.value = true; codeLoad.value = true;
const resp = await hutao.Account.verify.pwd(username.value!); try {
if (resp.retcode !== 0) { const resp = await hutao.Account.verify.pwd(username.value!);
showSnackbar.warn(`[${resp.retcode}] ${resp.message}`); if (resp.retcode !== 0) {
} else { showSnackbar.warn(`[${resp.retcode}] ${resp.message}`);
showSnackbar.success(`${resp.message}`); await TGLogger.Warn(
`[tco-hutaoVerify][tryGetCode] 获取验证码失败:${resp.retcode} ${resp.message}`,
);
} else {
showSnackbar.success(`${resp.message}`);
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取验证码失败:${errMsg}`);
await TGLogger.Error(`[tco-hutaoVerify][tryGetCode] 获取验证码异常:${errMsg}`);
} }
codeLoad.value = false; codeLoad.value = false;
codeDisabled.value = true; codeDisabled.value = true;
@@ -146,17 +157,28 @@ async function onSubmit(): Promise<void> {
if (!check.valid) return; if (!check.valid) return;
formDisabled.value = true; formDisabled.value = true;
formLoad.value = true; formLoad.value = true;
const resp = await hutao.Account.reset.pwd(username.value!, verifyCode.value!, pwd.value!); try {
formLoad.value = false; const resp = await hutao.Account.reset.pwd(username.value!, verifyCode.value!, pwd.value!);
if (resp.retcode !== 0) { formLoad.value = false;
showSnackbar.warn(`[${resp.retcode}] ${resp.message}`); if (resp.retcode !== 0) {
showSnackbar.warn(`[${resp.retcode}] ${resp.message}`);
await TGLogger.Warn(
`[tco-hutaoVerify][onSubmit] 重置密码失败:${resp.retcode} ${resp.message}`,
);
formDisabled.value = false;
return;
}
showSnackbar.success(`${resp.message}`);
await hutaoStore.autoLogin(username.value!, pwd.value!);
formDisabled.value = false;
visible.value = false;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
formLoad.value = false;
showSnackbar.error(`重置密码失败:${errMsg}`);
await TGLogger.Error(`[tco-hutaoVerify][onSubmit] 重置密码异常:${errMsg}`);
formDisabled.value = false; formDisabled.value = false;
return;
} }
showSnackbar.success(`${resp.message}`);
await hutaoStore.autoLogin(username.value!, pwd.value!);
formDisabled.value = false;
visible.value = false;
} }
onUnmounted(() => { onUnmounted(() => {

View File

@@ -37,6 +37,8 @@ import showSnackbar from "@comp/func/snackbar.js";
import hutao from "@Hutao/index.js"; import hutao from "@Hutao/index.js";
import TSUserGacha from "@Sqlm/userGacha.js"; import TSUserGacha from "@Sqlm/userGacha.js";
import useHutaoStore from "@store/hutao.js"; import useHutaoStore from "@store/hutao.js";
import TGHttps from "@utils/TGHttps.js";
import TGLogger from "@utils/TGLogger.js";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
import { computed, ref, shallowRef, watch } from "vue"; import { computed, ref, shallowRef, watch } from "vue";
@@ -103,13 +105,23 @@ async function loadDownload(): Promise<void> {
if (!accessToken.value) return; if (!accessToken.value) return;
try { try {
const info = await hutao.Gacha.entry(accessToken.value); const info = await hutao.Gacha.entry(accessToken.value);
if ("retcode" in info) { if (info.retcode !== 0) {
showSnackbar.warn(`[${info.retcode}] ${info.message}`); showSnackbar.warn(`[${info.retcode}] ${info.message}`);
await TGLogger.Warn(
`[ugo-hutao-du][loadDownload] 获取入口数据失败:${info.retcode} ${info.message}`,
);
return; return;
} }
uidList.value = info.map((i) => ({ uid: i.Uid, cnt: i.ItemCount })); if (!info.data) {
showSnackbar.warn("获取入口数据返回为空");
await TGLogger.Warn(`[ugo-hutao-du][loadDownload] 获取入口数据返回为空`);
return;
}
uidList.value = info.data.map((i) => ({ uid: i.Uid, cnt: i.ItemCount }));
} catch (e) { } catch (e) {
console.error(e); const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取入口数据失败:${errMsg}`);
await TGLogger.Error(`[ugo-hutao-du][loadDownload] 获取入口数据异常:${errMsg}`);
} }
} }

View File

@@ -340,7 +340,7 @@ async function tryReadAbyss(): Promise<void> {
showSnackbar.warn("文件数据格式错误"); showSnackbar.warn("文件数据格式错误");
return; return;
} }
if (!Hutao.raw.valid.abyss(fileData)) { if (!Hutao.valid.abyss(fileData)) {
await showLoading.end(); await showLoading.end();
showSnackbar.warn("深渊数据验证失败,请检查数据格式"); showSnackbar.warn("深渊数据验证失败,请检查数据格式");
return; return;
@@ -355,7 +355,6 @@ async function tryReadAbyss(): Promise<void> {
await new Promise<void>((resolve) => setTimeout(resolve, 1000)); await new Promise<void>((resolve) => setTimeout(resolve, 1000));
window.location.reload(); window.location.reload();
} catch (e) { } catch (e) {
console.error(e);
await TGLogger.Error(`[UserAbyss][tryReadAbyss] 导入深渊数据失败: ${e}`); await TGLogger.Error(`[UserAbyss][tryReadAbyss] 导入深渊数据失败: ${e}`);
await showLoading.end(); await showLoading.end();
showSnackbar.error("导入深渊数据失败,请检查文件格式是否正确"); showSnackbar.error("导入深渊数据失败,请检查文件格式是否正确");
@@ -390,7 +389,6 @@ async function uploadAbyss(): Promise<void> {
return; return;
} }
const gcFind = await TSUserAccount.game.getAccountByGid(uidCur.value!.toString()); const gcFind = await TSUserAccount.game.getAccountByGid(uidCur.value!.toString());
console.log(uidCur.value, gcFind);
if (!gcFind) { if (!gcFind) {
showSnackbar.warn(`未找到 ${uidCur.value} 对应 UID无法刷新角色数据进行上传`); showSnackbar.warn(`未找到 ${uidCur.value} 对应 UID无法刷新角色数据进行上传`);
return; return;
@@ -400,42 +398,58 @@ async function uploadAbyss(): Promise<void> {
showSnackbar.warn(`未找到 ${uidCur.value} 对应 CK无法刷新角色数据进行上传`); showSnackbar.warn(`未找到 ${uidCur.value} 对应 CK无法刷新角色数据进行上传`);
return; return;
} }
await showLoading.start(`正在上传 ${gcFind.gameUid} 的深渊数据`, `期数:${abyssData.id}`);
const transAbyss = Hutao.Abyss.utils.transData(abyssData);
if (userName.value) transAbyss.ReservedUserName = userName.value;
const check = await refreshAvatars(acFind.cookie!, gcFind);
if (!check) {
await showLoading.end();
return;
}
let roles: Array<TGApp.Sqlite.Character.TableTrans> | undefined;
try { try {
await showLoading.start(`正在上传 ${gcFind.gameUid} 的深渊数据`, `期数:${abyssData.id}`); roles = await TSUserAvatar.getAvatars(Number(gcFind.gameUid));
const transAbyss = Hutao.Abyss.utils.transData(abyssData);
if (userName.value) transAbyss.ReservedUserName = userName.value;
const check = await refreshAvatars(acFind.cookie!, gcFind);
if (!check) return;
const roles = await TSUserAvatar.getAvatars(Number(gcFind.gameUid));
if (!roles) { if (!roles) {
await showLoading.end(); await showLoading.end();
showSnackbar.warn("未找到角色数据"); showSnackbar.warn("未找到角色数据");
return; return;
} }
await showLoading.update("正在转换角色数据"); } catch (e) {
transAbyss.Avatars = Hutao.Abyss.utils.transAvatars(roles); const errMsg = TGHttps.getErrMsg(e);
await showLoading.update("正在上传深渊数据"); await showLoading.end();
console.log("uploadAbyss", transAbyss); showSnackbar.error(`获取角色数据失败:${errMsg}`);
await TGLogger.Error(`[Abyss][uploadAbyss] 获取角色数据异常:${errMsg}`);
return;
}
await showLoading.update("正在转换角色数据");
transAbyss.Avatars = Hutao.Abyss.utils.transAvatars(roles);
await showLoading.update("正在上传深渊数据");
try {
const res = await Hutao.Abyss.upload(transAbyss); const res = await Hutao.Abyss.upload(transAbyss);
if (res.retcode !== 0) { if (res.retcode !== 0) {
showSnackbar.error(`[${res.retcode}]${res.message}`); await showLoading.end();
await TGLogger.Warn("[Abyss][uploadAbyss] 上传深渊数据失败"); showSnackbar.warn(`[${res.retcode}]${res.message}`);
await TGLogger.Warn(`[Abyss][uploadAbyss] ${res.retcode} ${res.message}`); await TGLogger.Warn(`[Abyss][uploadAbyss] 上传深渊数据失败:${res.retcode} ${res.message}`);
return; return;
} }
showSnackbar.success(res.message ?? "上传深渊数据成功,即将刷新祈愿时长"); showSnackbar.success(res.message ?? "上传深渊数据成功,即将刷新祈愿时长");
await TGLogger.Info("[Abyss][uploadAbyss] 上传深渊数据成功"); await TGLogger.Info("[Abyss][uploadAbyss] 上传深渊数据成功");
await TGLogger.Info(`[${res.retcode}] ${res.message}`); await TGLogger.Info(`[${res.retcode}] ${res.message}`);
// 等待5s刷新时长 } catch (e) {
await showLoading.update("正在刷新胡桃云数据"); const errMsg = TGHttps.getErrMsg(e);
await new Promise<void>((resolve) => setTimeout(resolve, 5000)); await showLoading.end();
showSnackbar.error(`上传深渊数据失败:${errMsg}`);
await TGLogger.Error(`[Abyss][uploadAbyss] 上传深渊数据异常:${errMsg}`);
return;
}
await showLoading.update("正在刷新胡桃云数据");
await new Promise<void>((resolve) => setTimeout(resolve, 5000));
try {
await hutaoStore.tryRefreshInfo(); await hutaoStore.tryRefreshInfo();
} catch (e) { } catch (e) {
if (e instanceof Error) { const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(e.message); showSnackbar.error(`刷新胡桃云数据失败:${errMsg}`);
await TGLogger.Error("[Abyss][uploadAbyss] 上传深渊数据失败"); await TGLogger.Error(`[Abyss][uploadAbyss] 刷新胡桃云数据异常:${errMsg}`);
await TGLogger.Error(`[Abyss][uploadAbyss] ${e.message}`);
}
} }
await showLoading.end(); await showLoading.end();
} }

View File

@@ -394,7 +394,7 @@ async function tryReadChallenge(): Promise<void> {
showSnackbar.warn("文件数据格式错误"); showSnackbar.warn("文件数据格式错误");
return; return;
} }
if (!Hutao.raw.valid.challenge(fileData)) { if (!Hutao.valid.challenge(fileData)) {
await showLoading.end(); await showLoading.end();
showSnackbar.warn("危战数据验证失败,请检查数据格式"); showSnackbar.warn("危战数据验证失败,请检查数据格式");
return; return;

View File

@@ -241,13 +241,20 @@ async function hideAllOverlay(): Promise<void> {
async function loadWiki(): Promise<void> { async function loadWiki(): Promise<void> {
await showLoading.start("正在加载统计数据"); await showLoading.start("正在加载统计数据");
const res = await Hutao.Combat.data(); try {
if (res === undefined) showSnackbar.error("未获取到剧诗数据"); const res = await Hutao.Combat.data();
else if ("retcode" in res) { if (res.retcode !== 0) {
showSnackbar.warn(`[${res.retcode}] ${res.message}`); showSnackbar.warn(`[${res.retcode}] ${res.message}`);
await TGLogger.Warn(`[Combat][loadWiki] ${JSON.stringify(res)}`); await TGLogger.Warn(`[Combat][loadWiki] ${res.retcode} ${res.message}`);
} else cloudCombat.value = res; } else {
showSnackbar.success("成功获取统计数据"); cloudCombat.value = res.data;
showSnackbar.success("成功获取统计数据");
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取统计数据失败:${errMsg}`);
await TGLogger.Error(`[Combat][loadWiki] 获取统计数据异常:${errMsg}`);
}
await hideAllOverlay(); await hideAllOverlay();
await showLoading.end(); await showLoading.end();
showStat.value = true; showStat.value = true;
@@ -474,16 +481,15 @@ async function uploadCombat(): Promise<void> {
showSnackbar.success(res.message ?? "上传剧诗数据成功"); showSnackbar.success(res.message ?? "上传剧诗数据成功");
await TGLogger.Info("[UserCombat][uploadCombat] 上传剧诗数据成功"); await TGLogger.Info("[UserCombat][uploadCombat] 上传剧诗数据成功");
} else { } else {
showSnackbar.error(`[${res.retcode}]${res.message}`); showSnackbar.warn(`[${res.retcode}]${res.message}`);
await TGLogger.Error("[UserCombat][uploadCombat] 上传剧诗数据失败"); await TGLogger.Warn(
await TGLogger.Error(`[UserCombat][uploadCombat] ${res.retcode} ${res.message}`); `[UserCombat][uploadCombat] 上传剧诗数据失败:${res.retcode} ${res.message}`,
);
} }
} catch (e) { } catch (e) {
if (e instanceof Error) { const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(e.message); showSnackbar.error(`上传剧诗数据失败:${errMsg}`);
await TGLogger.Error("[UserCombat][uploadCombat] 上传剧诗数据失败"); await TGLogger.Error(`[UserCombat][uploadCombat] 上传剧诗数据异常:${errMsg}`);
await TGLogger.Error(`[UserCombat][uploadCombat] ${e.message}`);
}
} }
await showLoading.end(); await showLoading.end();
} }
@@ -521,7 +527,7 @@ async function tryReadCombat(): Promise<void> {
showSnackbar.warn("文件数据格式错误"); showSnackbar.warn("文件数据格式错误");
return; return;
} }
if (!Hutao.raw.valid.combat(fileData)) { if (!Hutao.valid.combat(fileData)) {
await showLoading.end(); await showLoading.end();
showSnackbar.warn("剧诗数据验证失败,请检查数据格式"); showSnackbar.warn("剧诗数据验证失败,请检查数据格式");
return; return;
@@ -536,7 +542,6 @@ async function tryReadCombat(): Promise<void> {
await new Promise<void>((resolve) => setTimeout(resolve, 1000)); await new Promise<void>((resolve) => setTimeout(resolve, 1000));
window.location.reload(); window.location.reload();
} catch (e) { } catch (e) {
console.error(e);
await TGLogger.Error(`[UserCombat][tryReadCombat] 导入剧诗数据失败: ${e}`); await TGLogger.Error(`[UserCombat][tryReadCombat] 导入剧诗数据失败: ${e}`);
await showLoading.end(); await showLoading.end();
showSnackbar.error("导入剧诗数据失败,请检查文件格式是否正确"); showSnackbar.error("导入剧诗数据失败,请检查文件格式是否正确");

View File

@@ -284,10 +284,21 @@ async function handleHutaoUpload(uids: Array<string>): Promise<void> {
"302": 0, "302": 0,
"500": 0, "500": 0,
}; };
const endIdResp = await hutao.Gacha.endIds(accessToken.value!, u); try {
if ("retcode" in endIdResp) { const endIdResp = await hutao.Gacha.endIds(accessToken.value!, u);
showSnackbar.warn(`[${endIdResp.retcode}] ${endIdResp.message}`); if (endIdResp.retcode !== 0) {
} else endIdRes = endIdResp; showSnackbar.warn(`[${endIdResp.retcode}] ${endIdResp.message}`);
await TGLogger.Warn(
`[Gacha][handleHutaoUpload] 获取EndId失败${endIdResp.retcode} ${endIdResp.message}`,
);
} else if (endIdResp.data) {
endIdRes = endIdResp.data;
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取EndId失败${errMsg}`);
await TGLogger.Error(`[Gacha][handleHutaoUpload] 获取EndId异常${errMsg}`);
}
const dataRaw: Array<TGApp.Sqlite.Gacha.Gacha> = []; const dataRaw: Array<TGApp.Sqlite.Gacha.Gacha> = [];
for (const [k, v] of Object.entries(endIdRes)) { for (const [k, v] of Object.entries(endIdRes)) {
const gachaRead = await TSUserGacha.record.endId(u, k, v.toString()); const gachaRead = await TSUserGacha.record.endId(u, k, v.toString());
@@ -304,11 +315,18 @@ async function handleHutaoUpload(uids: Array<string>): Promise<void> {
Id: i.id.toString(), Id: i.id.toString(),
})), })),
}; };
const resp = await hutao.Gacha.upload(accessToken.value!, data); try {
if (resp.retcode === 0) { const resp = await hutao.Gacha.upload(accessToken.value!, data);
showSnackbar.success(`成功上传祈愿数据:${resp.message}`); if (resp.retcode === 0) {
} else { showSnackbar.success(`成功上传祈愿数据:${resp.message}`);
showSnackbar.warn(`[${resp.retcode}] ${resp.message}`); } else {
showSnackbar.warn(`[${resp.retcode}] ${resp.message}`);
await TGLogger.Warn(`[Gacha][handleHutaoUpload] 上传失败:${resp.retcode} ${resp.message}`);
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`上传祈愿数据失败:${errMsg}`);
await TGLogger.Error(`[Gacha][handleHutaoUpload] 上传异常:${errMsg}`);
} }
} }
await showLoading.end(); await showLoading.end();
@@ -333,67 +351,102 @@ async function handleHutaoDownload(uids: Array<string>): Promise<void> {
await showLoading.start("正在下载胡桃云祈愿记录...", "正在刷新Token"); await showLoading.start("正在下载胡桃云祈愿记录...", "正在刷新Token");
for (const u of uids) { for (const u of uids) {
await showLoading.start(`正在下载UID:${u}的祈愿记录`, "正在获取EndIds"); await showLoading.start(`正在下载UID:${u}的祈愿记录`, "正在获取EndIds");
const endIdResp = await hutao.Gacha.endIds(accessToken.value!, u); try {
if ("retcode" in endIdResp) { const endIdResp = await hutao.Gacha.endIds(accessToken.value!, u);
showSnackbar.warn(`[${endIdResp.retcode}] ${endIdResp.message}`); if (endIdResp.retcode !== 0) {
continue; showSnackbar.warn(`[${endIdResp.retcode}] ${endIdResp.message}`);
} await TGLogger.Warn(
for (const [p, i] of Object.entries(endIdResp)) { `[Gacha][handleHutaoDownload] 获取EndIds失败${endIdResp.retcode} ${endIdResp.message}`,
if (i === 0) continue; );
let endId: string | undefined = undefined; continue;
let flag = true;
const pageSize = 200;
await showLoading.start(`正在下载卡池 ${p}`);
const uigfList: Array<TGApp.Plugins.UIGF.GachaItem> = [];
while (flag) {
await showLoading.update(`EndId:${endId ?? "无"}`);
await hutaoStore.tryRefreshToken();
const gachaResp = await hutao.Gacha.logs(accessToken.value!, u, Number(p), pageSize, endId);
if (gachaResp.retcode !== 0) {
showSnackbar.warn(`[${gachaResp.retcode}] ${gachaResp.message}`);
break;
}
const data: TGApp.Plugins.Hutao.Gacha.GachaLogRes = gachaResp.data ?? [];
if (data.length === pageSize) {
endId = data[data.length - 1].Id.toString();
} else flag = false;
for (const item of data) {
const tempItem: TGApp.Plugins.UIGF.GachaItem = {
gacha_type: item.GachaType.toString(),
item_id: item.ItemId.toString(),
count: "1",
time: item.Time,
name: "",
item_type: "",
rank_type: "",
id: BigInt(item.Id).toString(),
uigf_gacha_type: item.QueryType.toString(),
};
const find = AppCalendarData.find((i) => i.id.toString() === item.ItemId.toString());
if (find) {
tempItem.name = find.name;
tempItem.item_type = find.itemType;
tempItem.rank_type = find.star.toString();
} else {
if (yattaData.value.length === 0) {
await showLoading.update(`未查找到 ${tempItem.item_id} 的 信息,正在获取 Yatta 数据`);
await loadYatta();
}
const findH = yattaData.value.find((i) => i.id.toString() === item.ItemId.toString());
if (findH) {
tempItem.name = findH.name;
tempItem.item_type = findH.type;
tempItem.rank_type = findH.star.toString();
} else {
showSnackbar.warn(`无法搜索到 ${item.ItemId} 的信息,请等待元数据更新`);
continue;
}
}
uigfList.push(tempItem);
}
} }
await showLoading.start(`正在写入卡池 ${p}-${uigfList.length}`); if (!endIdResp.data) {
await TSUserGacha.mergeUIGF(u, uigfList, true); showSnackbar.warn("获取EndIds返回数据为空");
await TGLogger.Warn(`[Gacha][handleHutaoDownload] 获取EndIds返回数据为空`);
continue;
}
const endIdRes = endIdResp.data;
for (const [p, i] of Object.entries(endIdRes)) {
if (i === 0) continue;
let endId: string | undefined = undefined;
let flag = true;
const pageSize = 200;
await showLoading.start(`正在下载卡池 ${p}`);
const uigfList: Array<TGApp.Plugins.UIGF.GachaItem> = [];
while (flag) {
await showLoading.update(`EndId:${endId ?? "无"}`);
await hutaoStore.tryRefreshToken();
try {
const gachaResp = await hutao.Gacha.logs(
accessToken.value!,
u,
Number(p),
pageSize,
endId,
);
if (gachaResp.retcode !== 0) {
showSnackbar.warn(`[${gachaResp.retcode}] ${gachaResp.message}`);
await TGLogger.Warn(
`[Gacha][handleHutaoDownload] 获取记录失败:${gachaResp.retcode} ${gachaResp.message}`,
);
break;
}
const data: TGApp.Plugins.Hutao.Gacha.GachaLogRes = gachaResp.data ?? [];
if (data.length === pageSize) {
endId = data[data.length - 1].Id.toString();
} else flag = false;
for (const item of data) {
const tempItem: TGApp.Plugins.UIGF.GachaItem = {
gacha_type: item.GachaType.toString(),
item_id: item.ItemId.toString(),
count: "1",
time: item.Time,
name: "",
item_type: "",
rank_type: "",
id: BigInt(item.Id).toString(),
uigf_gacha_type: item.QueryType.toString(),
};
const find = AppCalendarData.find((i) => i.id.toString() === item.ItemId.toString());
if (find) {
tempItem.name = find.name;
tempItem.item_type = find.itemType;
tempItem.rank_type = find.star.toString();
} else {
if (yattaData.value.length === 0) {
await showLoading.update(
`未查找到 ${tempItem.item_id} 的 信息,正在获取 Yatta 数据`,
);
await loadYatta();
}
const findH = yattaData.value.find(
(i) => i.id.toString() === item.ItemId.toString(),
);
if (findH) {
tempItem.name = findH.name;
tempItem.item_type = findH.type;
tempItem.rank_type = findH.star.toString();
} else {
showSnackbar.warn(`无法搜索到 ${item.ItemId} 的信息,请等待元数据更新`);
continue;
}
}
uigfList.push(tempItem);
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取祈愿记录失败:${errMsg}`);
await TGLogger.Error(`[Gacha][handleHutaoDownload] 获取记录异常:${errMsg}`);
break;
}
}
await showLoading.start(`正在写入卡池 ${p}-${uigfList.length}`);
await TSUserGacha.mergeUIGF(u, uigfList, true);
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`下载祈愿记录失败:${errMsg}`);
await TGLogger.Error(`[Gacha][handleHutaoDownload] 下载异常:${errMsg}`);
} }
} }
await showLoading.end(); await showLoading.end();
@@ -423,11 +476,20 @@ async function handleHutaoDelete(uids: Array<string>): Promise<void> {
await showLoading.start("正在删除胡桃云祈愿记录"); await showLoading.start("正在删除胡桃云祈愿记录");
for (const u of uids) { for (const u of uids) {
await showLoading.update(`UID:${u}`); await showLoading.update(`UID:${u}`);
const deleteResp = await hutao.Gacha.delete(accessToken.value!, u); try {
if (deleteResp.retcode === 0) { const deleteResp = await hutao.Gacha.delete(accessToken.value!, u);
showSnackbar.success(`删除记录成功:${deleteResp.message}`); if (deleteResp.retcode === 0) {
} else { showSnackbar.success(`删除记录成功:${deleteResp.message}`);
showSnackbar.warn(`[${deleteResp.retcode}] ${deleteResp.message}`); } else {
showSnackbar.warn(`[${deleteResp.retcode}] ${deleteResp.message}`);
await TGLogger.Warn(
`[Gacha][handleHutaoDelete] 删除失败:${deleteResp.retcode} ${deleteResp.message}`,
);
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`删除记录失败:${errMsg}`);
await TGLogger.Error(`[Gacha][handleHutaoDelete] 删除异常:${errMsg}`);
} }
} }
await showLoading.end(); await showLoading.end();
@@ -465,7 +527,6 @@ async function confirmRefresh(force: boolean): Promise<void> {
} }
} else { } else {
const gcFind = await TSUserAccount.game.getAccountByGid(uidCur.value.toString()); const gcFind = await TSUserAccount.game.getAccountByGid(uidCur.value.toString());
console.log(uidCur.value, gcFind);
if (!gcFind) { if (!gcFind) {
const check = await showDialog.check( const check = await showDialog.check(
`确定刷新?`, `确定刷新?`,

View File

@@ -53,6 +53,8 @@ import HtaTabTeam from "@comp/hutaoAbyss/hta-tab-team.vue";
import HtaTabUp from "@comp/hutaoAbyss/hta-tab-up.vue"; import HtaTabUp from "@comp/hutaoAbyss/hta-tab-up.vue";
import HtaTabUse from "@comp/hutaoAbyss/hta-tab-use.vue"; import HtaTabUse from "@comp/hutaoAbyss/hta-tab-use.vue";
import hutao from "@Hutao/index.js"; import hutao from "@Hutao/index.js";
import TGHttps from "@utils/TGHttps.js";
import TGLogger from "@utils/TGLogger.js";
import { timestampToDate } from "@utils/toolFunc.js"; import { timestampToDate } from "@utils/toolFunc.js";
import { onMounted, reactive, ref, type ShallowRef, shallowRef, watch } from "vue"; import { onMounted, reactive, ref, type ShallowRef, shallowRef, watch } from "vue";
@@ -120,17 +122,35 @@ async function getOverview(): Promise<void> {
await showLoading.start("正在获取深渊概览"); await showLoading.start("正在获取深渊概览");
let cur: TGApp.Plugins.Hutao.Abyss.OverviewData | undefined = undefined; let cur: TGApp.Plugins.Hutao.Abyss.OverviewData | undefined = undefined;
let last: TGApp.Plugins.Hutao.Abyss.OverviewData | undefined = undefined; let last: TGApp.Plugins.Hutao.Abyss.OverviewData | undefined = undefined;
const curResp = await hutao.Abyss.overview(); try {
if ("retcode" in curResp) { const curResp = await hutao.Abyss.overview();
await showLoading.update(`[${curResp.retcode}] ${curResp.message}`); if (curResp.retcode !== 0) {
} else { await showLoading.update(`[${curResp.retcode}] ${curResp.message}`);
cur = curResp; await TGLogger.Warn(
`[WIKI/Abyss][getOverview] 获取本期概览失败:${curResp.retcode} ${curResp.message}`,
);
} else {
cur = curResp.data;
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.update(`获取本期概览失败:${errMsg}`);
await TGLogger.Error(`[WIKI/Abyss][getOverview] 获取本期概览异常:${errMsg}`);
} }
const lastResp = await hutao.Abyss.overview(true); try {
if ("retcode" in lastResp) { const lastResp = await hutao.Abyss.overview(true);
await showLoading.update(`[${lastResp.retcode}] ${lastResp.message}`); if (lastResp.retcode !== 0) {
} else { await showLoading.update(`[${lastResp.retcode}] ${lastResp.message}`);
last = lastResp; await TGLogger.Warn(
`[WIKI/Abyss][getOverview] 获取上期概览失败:${lastResp.retcode} ${lastResp.message}`,
);
} else {
last = lastResp.data;
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.update(`获取上期概览失败:${errMsg}`);
await TGLogger.Error(`[WIKI/Abyss][getOverview] 获取上期概览异常:${errMsg}`);
} }
if (cur && last) overview.value = { cur, last }; if (cur && last) overview.value = { cur, last };
else overview.value = undefined; else overview.value = undefined;
@@ -140,17 +160,35 @@ async function getUseData(): Promise<void> {
await showLoading.start("正在获取角色使用率数据"); await showLoading.start("正在获取角色使用率数据");
let cur: Array<TGApp.Plugins.Hutao.Abyss.AvatarUse> = []; let cur: Array<TGApp.Plugins.Hutao.Abyss.AvatarUse> = [];
let last: Array<TGApp.Plugins.Hutao.Abyss.AvatarUse> = []; let last: Array<TGApp.Plugins.Hutao.Abyss.AvatarUse> = [];
const curResp = await hutao.Abyss.avatar.use(); try {
if (!Array.isArray(curResp)) { const curResp = await hutao.Abyss.avatar.use();
await showLoading.update(`[${curResp.retcode}] ${curResp.message}`); if (curResp.retcode !== 0) {
} else { await showLoading.update(`[${curResp.retcode}] ${curResp.message}`);
cur = curResp; await TGLogger.Warn(
`[WIKI/Abyss][getUseData] 获取本期使用率失败:${curResp.retcode} ${curResp.message}`,
);
} else if (curResp.data) {
cur = curResp.data;
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.update(`获取本期使用率失败:${errMsg}`);
await TGLogger.Error(`[WIKI/Abyss][getUseData] 获取本期使用率异常:${errMsg}`);
} }
const lastResp = await hutao.Abyss.avatar.use(true); try {
if (!Array.isArray(lastResp)) { const lastResp = await hutao.Abyss.avatar.use(true);
await showLoading.update(`[${lastResp.retcode}] ${lastResp.message}`); if (lastResp.retcode !== 0) {
} else { await showLoading.update(`[${lastResp.retcode}] ${lastResp.message}`);
last = lastResp; await TGLogger.Warn(
`[WIKI/Abyss][getUseData] 获取上期使用率失败:${lastResp.retcode} ${lastResp.message}`,
);
} else if (lastResp.data) {
last = lastResp.data;
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.update(`获取上期使用率失败:${errMsg}`);
await TGLogger.Error(`[WIKI/Abyss][getUseData] 获取上期使用率异常:${errMsg}`);
} }
abyssData.use = { cur, last }; abyssData.use = { cur, last };
} }
@@ -159,28 +197,55 @@ async function getUpData(): Promise<void> {
await showLoading.start("正在获取角色出场率数据"); await showLoading.start("正在获取角色出场率数据");
let cur: Array<TGApp.Plugins.Hutao.Abyss.AvatarUp> = []; let cur: Array<TGApp.Plugins.Hutao.Abyss.AvatarUp> = [];
let last: Array<TGApp.Plugins.Hutao.Abyss.AvatarUp> = []; let last: Array<TGApp.Plugins.Hutao.Abyss.AvatarUp> = [];
const curResp = await hutao.Abyss.avatar.up(); try {
if (!Array.isArray(curResp)) { const curResp = await hutao.Abyss.avatar.up();
await showLoading.update(`[${curResp.retcode}] ${curResp.message}`); if (curResp.retcode !== 0) {
} else { await showLoading.update(`[${curResp.retcode}] ${curResp.message}`);
cur = curResp; await TGLogger.Warn(
`[WIKI/Abyss][getUpData] 获取本期出场率失败:${curResp.retcode} ${curResp.message}`,
);
} else if (curResp.data) {
cur = curResp.data;
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.update(`获取本期出场率失败:${errMsg}`);
await TGLogger.Error(`[WIKI/Abyss][getUpData] 获取本期出场率异常:${errMsg}`);
} }
const lastResp = await hutao.Abyss.avatar.use(true); try {
if (!Array.isArray(lastResp)) { const lastResp = await hutao.Abyss.avatar.up(true);
await showLoading.update(`[${lastResp.retcode}] ${lastResp.message}`); if (lastResp.retcode !== 0) {
} else { await showLoading.update(`[${lastResp.retcode}] ${lastResp.message}`);
last = lastResp; await TGLogger.Warn(
`[WIKI/Abyss][getUpData] 获取上期出场率失败:${lastResp.retcode} ${lastResp.message}`,
);
} else if (lastResp.data) {
last = lastResp.data;
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.update(`获取上期出场率失败:${errMsg}`);
await TGLogger.Error(`[WIKI/Abyss][getUpData] 获取上期出场率异常:${errMsg}`);
} }
abyssData.up = { cur, last }; abyssData.up = { cur, last };
} }
async function getTeamData(): Promise<void> { async function getTeamData(): Promise<void> {
await showLoading.start("正在获取队伍出场数据"); await showLoading.start("正在获取队伍出场数据");
const teamResp = await hutao.Abyss.team(); try {
if ("retcode" in teamResp) { const teamResp = await hutao.Abyss.team();
await showLoading.update(`[${teamResp.retcode}] ${teamResp.message}`); if (teamResp.retcode !== 0) {
} else { await showLoading.update(`[${teamResp.retcode}] ${teamResp.message}`);
abyssData.team = teamResp; await TGLogger.Warn(
`[WIKI/Abyss][getTeamData] 获取队伍数据失败:${teamResp.retcode} ${teamResp.message}`,
);
} else if (teamResp.data) {
abyssData.team = teamResp.data;
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.update(`获取队伍数据失败:${errMsg}`);
await TGLogger.Error(`[WIKI/Abyss][getTeamData] 获取队伍数据异常:${errMsg}`);
} }
} }
@@ -188,17 +253,35 @@ async function getHoldData(): Promise<void> {
await showLoading.start("正在获取角色持有数据"); await showLoading.start("正在获取角色持有数据");
let cur: Array<TGApp.Plugins.Hutao.Abyss.AvatarHold> = []; let cur: Array<TGApp.Plugins.Hutao.Abyss.AvatarHold> = [];
let last: Array<TGApp.Plugins.Hutao.Abyss.AvatarHold> = []; let last: Array<TGApp.Plugins.Hutao.Abyss.AvatarHold> = [];
const curResp = await hutao.Abyss.avatar.hold(); try {
if (!Array.isArray(curResp)) { const curResp = await hutao.Abyss.avatar.hold();
await showLoading.update(`[${curResp.retcode}] ${curResp.message}`); if (curResp.retcode !== 0) {
} else { await showLoading.update(`[${curResp.retcode}] ${curResp.message}`);
cur = curResp; await TGLogger.Warn(
`[WIKI/Abyss][getHoldData] 获取本期持有率失败:${curResp.retcode} ${curResp.message}`,
);
} else if (curResp.data) {
cur = curResp.data;
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.update(`获取本期持有率失败:${errMsg}`);
await TGLogger.Error(`[WIKI/Abyss][getHoldData] 获取本期持有率异常:${errMsg}`);
} }
const lastResp = await hutao.Abyss.avatar.hold(true); try {
if (!Array.isArray(lastResp)) { const lastResp = await hutao.Abyss.avatar.hold(true);
await showLoading.update(`[${lastResp.retcode}] ${lastResp.message}`); if (lastResp.retcode !== 0) {
} else { await showLoading.update(`[${lastResp.retcode}] ${lastResp.message}`);
last = lastResp; await TGLogger.Warn(
`[WIKI/Abyss][getHoldData] 获取上期持有率失败:${lastResp.retcode} ${lastResp.message}`,
);
} else if (lastResp.data) {
last = lastResp.data;
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.update(`获取上期持有率失败:${errMsg}`);
await TGLogger.Error(`[WIKI/Abyss][getHoldData] 获取上期持有率异常:${errMsg}`);
} }
abyssData.hold = { cur, last }; abyssData.hold = { cur, last };
} }

View File

@@ -1,90 +1,27 @@
/** /**
* Hutao 插件入口 * Hutao 插件入口
* @since Beta v0.9.1 * @since Beta v0.10.1
*/ */
import { import AbyssReq from "./request/abyssReq.js";
getAbyssOverview, import AccountReq from "./request/accountReq.js";
getAvatarCollect, import CombatReq from "./request/combatReq.js";
getAvatarHoldRate, import GachaReq from "./request/gachaReq.js";
getAvatarUpRate, import HutaoValid from "./utils/RawValidator.js";
getAvatarUseRate,
getTeamCollect,
uploadAbyssData,
} from "./request/abyssReq.js";
import {
getResetPwdCode,
getUserInfo,
loginPassport,
refreshToken,
resetPwd,
} from "./request/accountReq.js";
import { getCombatStatistic, uploadCombatData } from "./request/combatReq.js";
import {
deleteGachaLogs,
getEndIds,
getEntries,
getGachaLogs,
uploadGachaLogs,
} from "./request/gachaReq.js";
import { transAbyssAvatars, transAbyssLocal } from "./utils/abyssUtil.js";
import { transCombatLocal } from "./utils/combatUtil.js";
import { RawValidator } from "./utils/RawValidator.js";
const _ = "Not Implemented"; const _ = "Not Implemented";
const Hutao = { const Hutao = {
Abyss: { Abyss: AbyssReq,
avatar: { Combat: CombatReq,
collect: getAvatarCollect, Account: AccountReq,
hold: getAvatarHoldRate,
up: getAvatarUpRate,
use: getAvatarUseRate,
},
overview: getAbyssOverview,
team: getTeamCollect,
upload: uploadAbyssData,
utils: {
transData: transAbyssLocal,
transAvatars: transAbyssAvatars,
},
},
Combat: {
upload: uploadCombatData,
data: getCombatStatistic,
trans: transCombatLocal,
},
Account: {
register: _,
login: loginPassport,
verify: {
username: _,
usernameNew: _,
pwd: getResetPwdCode,
cancel: _,
},
cancel: _,
reset: {
username: _,
pwd: resetPwd,
},
info: getUserInfo,
},
Token: { Token: {
refresh: refreshToken, refresh: AccountReq.refresh,
revoke: _, revoke: _,
revokeAll: _, revokeAll: _,
}, },
Gacha: { Gacha: GachaReq,
entry: getEntries, valid: HutaoValid,
endIds: getEndIds,
logs: getGachaLogs,
upload: uploadGachaLogs,
delete: deleteGachaLogs,
},
raw: {
valid: RawValidator,
},
}; };
export default Hutao; export default Hutao;

View File

@@ -1,133 +1,246 @@
/** /**
* 深渊相关请求 * 深渊相关请求
* @since Beta v0.9.1 * @since Beta v0.10.1
*/ */
import TGHttp from "@utils/TGHttp.js"; import TGHttps from "@utils/TGHttps.js";
const AbyssUrl: Readonly<string> = `https://homa.gentle.house/Statistics/`; const AbyssUrl: Readonly<string> = `https://homa.gentle.house/Statistics/`;
/** /**
* 获取深渊概览数据 * 获取深渊概览数据
* @since Beta v0.9.1 * @since Beta v0.10.1
* @param isLast - 是否获取上期数据 * @param isLast - 是否获取上期数据
* @returns 深渊概览数据 * @returns 深渊概览响应
*/ */
export async function getAbyssOverview( async function getOverview(
isLast: boolean = false, isLast: boolean = false,
): Promise<TGApp.Plugins.Hutao.Abyss.OverviewData | TGApp.Plugins.Hutao.Base.Resp> { ): Promise<TGApp.Plugins.Hutao.Abyss.OverviewResp> {
const url = `${AbyssUrl}Overview`; const url = `${AbyssUrl}Overview`;
const resp = await TGHttp<TGApp.Plugins.Hutao.Abyss.OverviewResp>(url, { const resp = await TGHttps.get<TGApp.Plugins.Hutao.Abyss.OverviewResp>(url, {
method: "GET",
query: { Last: isLast }, query: { Last: isLast },
}); });
if (resp.data) return resp.data; return resp.data;
return { retcode: resp.retcode, message: resp.message };
} }
/** /**
* 获取角色搭配数据 * 获取角色搭配数据
* @since Beta v0.9.1 * @since Beta v0.10.1
* @param isLast - 是否获取上期数据 * @param isLast - 是否获取上期数据
* @returns 角色搭配数据 * @returns 角色搭配响应
*/ */
export async function getAvatarCollect( async function getAvatarCollect(
isLast: boolean = false, isLast: boolean = false,
): Promise<Array<TGApp.Plugins.Hutao.Abyss.AvatarCollocation> | TGApp.Plugins.Hutao.Base.Resp> { ): Promise<TGApp.Plugins.Hutao.Abyss.AvatarCollectResp> {
const url = `${AbyssUrl}Avatar/AvatarCollocation`; const url = `${AbyssUrl}Avatar/AvatarCollocation`;
const resp = await TGHttp<TGApp.Plugins.Hutao.Abyss.AvatarCollectResp>(url, { const resp = await TGHttps.get<TGApp.Plugins.Hutao.Abyss.AvatarCollectResp>(url, {
method: "GET",
query: { Last: isLast }, query: { Last: isLast },
}); });
if (resp.data) return resp.data; return resp.data;
return { retcode: resp.retcode, message: resp.message };
} }
/** /**
* 获取角色持有率数据 * 获取角色持有率数据
* @since Beta v0.9.1 * @since Beta v0.10.1
* @param isLast - 是否获取上期数据 * @param isLast - 是否获取上期数据
* @returns 角色持有率数据 * @returns 角色持有率响应
*/ */
export async function getAvatarHoldRate( async function getAvatarHoldRate(
isLast: boolean = false, isLast: boolean = false,
): Promise<Array<TGApp.Plugins.Hutao.Abyss.AvatarHold> | TGApp.Plugins.Hutao.Base.Resp> { ): Promise<TGApp.Plugins.Hutao.Abyss.AvatarHoldResp> {
const url = `${AbyssUrl}Avatar/HoldingRate`; const url = `${AbyssUrl}Avatar/HoldingRate`;
const resp = await TGHttp<TGApp.Plugins.Hutao.Abyss.AvatarHoldResp>(url, { const resp = await TGHttps.get<TGApp.Plugins.Hutao.Abyss.AvatarHoldResp>(url, {
method: "GET",
query: { Last: isLast }, query: { Last: isLast },
}); });
if (resp.data) return resp.data; return resp.data;
return { retcode: resp.retcode, message: resp.message };
} }
/** /**
* 获取角色上场率数据 * 获取角色上场率数据
* @since Beta v0.9.1 * @since Beta v0.10.1
* @param isLast - 是否获取上期数据 * @param isLast - 是否获取上期数据
* @returns 角色上场率数据 * @returns 角色上场率响应
*/ */
export async function getAvatarUpRate( async function getAvatarUpRate(
isLast: boolean = false, isLast: boolean = false,
): Promise<Array<TGApp.Plugins.Hutao.Abyss.AvatarUp> | TGApp.Plugins.Hutao.Base.Resp> { ): Promise<TGApp.Plugins.Hutao.Abyss.AvatarUpResp> {
const url = `${AbyssUrl}Avatar/AttendanceRate`; const url = `${AbyssUrl}Avatar/AttendanceRate`;
const resp = await TGHttp<TGApp.Plugins.Hutao.Abyss.AvatarUpResp>(url, { const resp = await TGHttps.get<TGApp.Plugins.Hutao.Abyss.AvatarUpResp>(url, {
method: "GET",
query: { Last: isLast }, query: { Last: isLast },
}); });
if (resp.data) return resp.data; return resp.data;
return { retcode: resp.retcode, message: resp.message };
} }
/** /**
* 获取角色使用率 * 获取角色使用率
* @since Beta v0.9.1 * @since Beta v0.10.1
* @param isLast - 是否获取上期数据 * @param isLast - 是否获取上期数据
* @returns 角色使用率 * @returns 角色使用率响应
*/ */
export async function getAvatarUseRate( async function getAvatarUseRate(
isLast: boolean = false, isLast: boolean = false,
): Promise<Array<TGApp.Plugins.Hutao.Abyss.AvatarUse> | TGApp.Plugins.Hutao.Base.Resp> { ): Promise<TGApp.Plugins.Hutao.Abyss.AvatarUseResp> {
const url = `${AbyssUrl}Avatar/UtilizationRate`; const url = `${AbyssUrl}Avatar/UtilizationRate`;
const resp = await TGHttp<TGApp.Plugins.Hutao.Abyss.AvatarUseResp>(url, { const resp = await TGHttps.get<TGApp.Plugins.Hutao.Abyss.AvatarUseResp>(url, {
method: "GET",
query: { Last: isLast }, query: { Last: isLast },
}); });
if (resp.data) return resp.data; return resp.data;
return { retcode: resp.retcode, message: resp.message };
} }
/** /**
* 获取队伍搭配数据 * 获取队伍搭配数据
* @since Beta v0.9.1 * @since Beta v0.10.1
* @param isLast - 是否获取上期数据 * @param isLast - 是否获取上期数据
* @returns 队伍搭配数据 * @returns 队伍搭配响应
*/ */
export async function getTeamCollect( async function getTeamCollect(
isLast: boolean = false, isLast: boolean = false,
): Promise<Array<TGApp.Plugins.Hutao.Abyss.TeamCombination> | TGApp.Plugins.Hutao.Base.Resp> { ): Promise<TGApp.Plugins.Hutao.Abyss.TeamCombineResp> {
const url = `${AbyssUrl}Team/Combination`; const url = `${AbyssUrl}Team/Combination`;
const resp = await TGHttp<TGApp.Plugins.Hutao.Abyss.TeamCombineResp>(url, { const resp = await TGHttps.get<TGApp.Plugins.Hutao.Abyss.TeamCombineResp>(url, {
method: "GET",
query: { Last: isLast }, query: { Last: isLast },
}); });
if (resp.data) return resp.data; return resp.data;
return { retcode: resp.retcode, message: resp.message };
} }
/** /**
* 上传用户数据 * 上传用户数据
* @since Beta v0.5.0 * @since Beta v0.10.1
* @param data - 用户数据 * @param data - 用户数据
* @returns 上传结果 * @returns 上传结果
*/ */
export async function uploadAbyssData( async function uploadData(
data: TGApp.Plugins.Hutao.Abyss.RecordUpload, data: TGApp.Plugins.Hutao.Abyss.RecordUpload,
): Promise<TGApp.Plugins.Hutao.Abyss.UploadResp> { ): Promise<TGApp.Plugins.Hutao.Abyss.UploadResp> {
const url = "https://homa.gentle.house/Record/Upload"; const url = "https://homa.gentle.house/Record/Upload";
return await TGHttp<TGApp.Plugins.Hutao.Abyss.UploadResp>(url, { const resp = await TGHttps.post<TGApp.Plugins.Hutao.Abyss.UploadResp>(url, {
method: "POST", body: data,
body: JSON.stringify(data),
query: { returningRank: false }, query: { returningRank: false },
headers: { "Content-Type": "application/json" }, headers: { "Content-Type": "application/json" },
}); });
return resp.data;
} }
/**
* 将本地数据转为上传用的数据
* @since Beta v0.6.3
* @param data - 本地数据
* @returns 上传用的数据
*/
function transData(data: TGApp.Sqlite.Abyss.TableTrans): TGApp.Plugins.Hutao.Abyss.RecordUpload {
return {
Uid: data.uid,
Identity: "TeyvatGuide",
SpiralAbyss: transAbyssData(data),
Avatars: [],
ReservedUserName: "",
};
}
/**
* 转换深渊数据
* @since Beta v0.6.3
* @param data - 本地数据
* @returns 上传用的数据
*/
function transAbyssData(data: TGApp.Sqlite.Abyss.TableTrans): TGApp.Plugins.Hutao.Abyss.RecordData {
return {
ScheduleId: data.id,
TotalBattleTimes: data.totalBattleTimes,
TotalWinTimes: data.totalWinTimes,
Defeat: {
AvatarId: data.defeatRank[0].id,
Value: data.defeatRank[0].value,
},
EnergySkill: {
AvatarId: data.energySkillRank[0].id,
Value: data.energySkillRank[0].value,
},
NormalSkill: {
AvatarId: data.normalSkillRank[0].id,
Value: data.normalSkillRank[0].value,
},
Damage: {
AvatarId: data.damageRank[0].id,
Value: data.damageRank[0].value,
},
TakeDamage: {
AvatarId: data.takeDamageRank[0].id,
Value: data.takeDamageRank[0].value,
},
Floors: data.floors.map((floor: TGApp.Sqlite.Abyss.Floor) => transFloor(floor)),
};
}
/**
* 转换层数数据
* @since Alpha v0.2.1
* @param data - 本地数据
* @returns 上传用的数据
*/
function transFloor(data: TGApp.Sqlite.Abyss.Floor): TGApp.Plugins.Hutao.Abyss.Floor {
return {
Index: data.id,
Star: data.winStar,
Levels: data.levels.map((level) => transLevel(level)),
};
}
/**
* 转换层-关卡数据
* @since Alpha v0.2.1
* @param data - 本地数据
* @returns 上传用的数据
*/
function transLevel(data: TGApp.Sqlite.Abyss.Level): TGApp.Plugins.Hutao.Abyss.Level {
const battles: Array<{ Index: number; Avatars: Array<number> }> = [];
battles.push({
Index: 1,
Avatars: data.upBattle!.characters.map((character) => character.id),
});
battles.push({
Index: 2,
Avatars: data.downBattle!.characters.map((character) => character.id),
});
return {
Index: data.id,
Star: data.winStar,
Battles: battles,
};
}
/**
* 转换角色数据
* @since Beta v0.5.5
* @param avatars - 角色数据
* @returns 上传用的数据
*/
function transAvatars(
avatars: Array<TGApp.Sqlite.Character.TableTrans>,
): Array<TGApp.Plugins.Hutao.Abyss.Avatar> {
return avatars.map((avatar) => {
return {
AvatarId: avatar.avatar.id,
WeaponId: avatar.weapon.id,
ReliquarySetIds: avatar.relics.map((relic) => relic.set.id),
ActivedConstellationNumber: avatar.avatar.actived_constellation_num,
};
});
}
const AbyssReq = {
avatar: {
collect: getAvatarCollect,
hold: getAvatarHoldRate,
up: getAvatarUpRate,
use: getAvatarUseRate,
},
overview: getOverview,
team: getTeamCollect,
upload: uploadData,
utils: {
transData,
transAvatars,
},
};
export default AbyssReq;

View File

@@ -1,9 +1,9 @@
/** /**
* 账号相关请求 * 账号相关请求
* @since Beta v0.9.1 * @since Beta v0.10.1
*/ */
import TGHttp from "@utils/TGHttp.js"; import TGHttps from "@utils/TGHttps.js";
import { getReqHeader, rsaEncrypt } from "../utils/authUtils.js"; import { getReqHeader, rsaEncrypt } from "../utils/authUtils.js";
@@ -11,73 +11,67 @@ const PassportUrl = "https://homa.gentle.house/Passport/v2/";
/** /**
* 登录 * 登录
* @since Beta v0.9.1 * @since Beta v0.10.1
* @param username - 用户名(邮箱) * @param username - 用户名(邮箱)
* @param password - 密码 * @param password - 密码
* @returns 登录返回 * @returns 登录响应
*/ */
export async function loginPassport( async function login(
username: string, username: string,
password: string, password: string,
): Promise<TGApp.Plugins.Hutao.Account.LoginRes | TGApp.Plugins.Hutao.Base.Resp> { ): Promise<TGApp.Plugins.Hutao.Account.LoginResp> {
const url = `${PassportUrl}Login`; const url = `${PassportUrl}Login`;
const data = { const data = {
UserName: rsaEncrypt(username), UserName: rsaEncrypt(username),
Password: rsaEncrypt(password), Password: rsaEncrypt(password),
}; };
const header = await getReqHeader(); const header = await getReqHeader();
const resp = await TGHttp<TGApp.Plugins.Hutao.Account.LoginResp>(url, { const resp = await TGHttps.post<TGApp.Plugins.Hutao.Account.LoginResp>(url, {
method: "POST",
headers: header, headers: header,
body: JSON.stringify(data), body: data,
}); });
if (resp.retcode !== 0) return <TGApp.Plugins.Hutao.Base.Resp>resp; return resp.data;
return <TGApp.Plugins.Hutao.Account.LoginRes>resp.data;
} }
/** /**
* 刷新访问令牌 * 刷新访问令牌
* @since Beta v0.9.1 * @since Beta v0.10.1
* @returns 令牌返回 * @param token - 刷新令牌
* @returns 令牌响应
*/ */
export async function refreshToken(token: string) { async function refresh(token: string): Promise<TGApp.Plugins.Hutao.Account.RefreshTokenResp> {
const url = `${PassportUrl}RefreshToken`; const url = `${PassportUrl}RefreshToken`;
const header = await getReqHeader(); const header = await getReqHeader();
const data = { RefreshToken: rsaEncrypt(token) }; const data = { RefreshToken: rsaEncrypt(token) };
const resp = await TGHttp<TGApp.Plugins.Hutao.Account.RefreshTokenResp>(url, { const resp = await TGHttps.post<TGApp.Plugins.Hutao.Account.RefreshTokenResp>(url, {
method: "POST",
headers: header, headers: header,
body: JSON.stringify(data), body: data,
}); });
if (resp.retcode !== 0) return <TGApp.Plugins.Hutao.Base.Resp>resp; return resp.data;
return <TGApp.Plugins.Hutao.Account.RefreshTokenRes>resp.data;
} }
/** /**
* 获取用户信息 * 获取用户信息
* @since Beta v0.9.1 * @since Beta v0.10.1
* @returns 用户信息返回 * @param token - 访问令牌
* @returns 用户信息响应
*/ */
export async function getUserInfo( async function info(token: string): Promise<TGApp.Plugins.Hutao.Account.InfoResp> {
token: string,
): Promise<TGApp.Plugins.Hutao.Account.InfoRes | TGApp.Plugins.Hutao.Base.Resp> {
const url = `${PassportUrl}UserInfo`; const url = `${PassportUrl}UserInfo`;
const header = await getReqHeader(token); const header = await getReqHeader(token);
const resp = await TGHttp<TGApp.Plugins.Hutao.Account.InfoResp>(url, { const resp = await TGHttps.get<TGApp.Plugins.Hutao.Account.InfoResp>(url, {
method: "GET",
headers: header, headers: header,
}); });
if (resp.retcode !== 0) return <TGApp.Plugins.Hutao.Base.Resp>resp; return resp.data;
return <TGApp.Plugins.Hutao.Account.InfoRes>resp.data;
} }
/** /**
* 获取充值密码验证码 * 获取重置密码验证码
* @since Beta v0.9.1 * @since Beta v0.10.1
* @param username - 用户 * @param username - 用户
* @returns 验证码返回 * @returns 验证码响应
*/ */
export async function getResetPwdCode(username: string): Promise<TGApp.Plugins.Hutao.Base.Resp> { async function verifyPwd(username: string): Promise<TGApp.Plugins.Hutao.Base.Resp> {
const url = `${PassportUrl}Verify`; const url = `${PassportUrl}Verify`;
const header = await getReqHeader(); const header = await getReqHeader();
const data: TGApp.Plugins.Hutao.Account.ResetPwdCodeParam = { const data: TGApp.Plugins.Hutao.Account.ResetPwdCodeParam = {
@@ -87,24 +81,22 @@ export async function getResetPwdCode(username: string): Promise<TGApp.Plugins.H
IsResetUserName: false, IsResetUserName: false,
IsResetUserNameNew: false, IsResetUserNameNew: false,
}; };
const resp = await TGHttp<TGApp.Plugins.Hutao.Base.Resp>(url, { const resp = await TGHttps.post<TGApp.Plugins.Hutao.Base.Resp>(url, {
method: "POST",
headers: header, headers: header,
body: JSON.stringify(data), body: data,
}); });
console.log(resp); return resp.data;
return resp;
} }
/** /**
* 重置密码 * 重置密码
* @since Beta v0.9.1 * @since Beta v0.10.1
* @param username - 用户 * @param username - 用户
* @param code - 验证码 * @param code - 验证码
* @param pwd - 密码 * @param pwd - 密码
* @returns 重置密码返回 * @returns 重置密码响应
*/ */
export async function resetPwd( async function resetPwd(
username: string, username: string,
code: string, code: string,
pwd: string, pwd: string,
@@ -120,11 +112,31 @@ export async function resetPwd(
IsResetUserName: false, IsResetUserName: false,
IsResetUserNameNew: false, IsResetUserNameNew: false,
}; };
const resp = await TGHttp<TGApp.Plugins.Hutao.Base.Resp>(url, { const resp = await TGHttps.post<TGApp.Plugins.Hutao.Base.Resp>(url, {
method: "POST",
headers: header, headers: header,
body: JSON.stringify(data), body: data,
}); });
console.log(resp); return resp.data;
return resp;
} }
const _ = "Not Implemented";
const AccountReq = {
register: _,
login,
refresh,
verify: {
username: _,
usernameNew: _,
pwd: verifyPwd,
cancel: _,
},
cancel: _,
reset: {
username: _,
pwd: resetPwd,
},
info,
};
export default AccountReq;

View File

@@ -1,42 +1,62 @@
/** /**
* 幻想真境剧诗相关请求 * 幻想真境剧诗相关请求
* @since Beta v0.9.1 * @since Beta v0.10.1
*/ */
import TGHttp from "@utils/TGHttp.js"; import TGHttps from "@utils/TGHttps.js";
const CombatUrl: Readonly<string> = "https://homa.gentle.house/RoleCombat/"; const CombatUrl: Readonly<string> = "https://homa.gentle.house/RoleCombat/";
/** /**
* 获取数据 * 获取剧诗统计数据
* @since Beta v0.9.1 * @since Beta v0.10.1
* @param isLast - 是否获取上期数据 * @param isLast - 是否获取上期数据
* @returns 剧诗数据 * @returns 剧诗响应
*/ */
export async function getCombatStatistic( async function data(isLast: boolean = false): Promise<TGApp.Plugins.Hutao.Combat.Response> {
isLast: boolean = false,
): Promise<TGApp.Plugins.Hutao.Combat.Data | TGApp.Plugins.Hutao.Base.Resp> {
const url = `${CombatUrl}Statistics`; const url = `${CombatUrl}Statistics`;
const resp = await TGHttp<TGApp.Plugins.Hutao.Combat.Response>(url, { const resp = await TGHttps.get<TGApp.Plugins.Hutao.Combat.Response>(url, {
method: "GET",
query: { Last: isLast }, query: { Last: isLast },
}); });
if (resp.data) return resp.data; return resp.data;
return { retcode: resp.retcode, message: resp.message };
} }
/** /**
* 上传数据 * 上传剧诗数据
* @since Beta v0.6.3 * @since Beta v0.10.1
* @param data - 数据 * @param uploadData - 上传数据
* @returns 上传返回 * @returns 上传响应
*/ */
export async function uploadCombatData( async function upload(
data: TGApp.Plugins.Hutao.Combat.UploadData, uploadData: TGApp.Plugins.Hutao.Combat.UploadData,
): Promise<TGApp.Plugins.Hutao.Combat.UploadResp> { ): Promise<TGApp.Plugins.Hutao.Combat.UploadResp> {
const url = `${CombatUrl}Upload`; const url = `${CombatUrl}Upload`;
return await TGHttp<TGApp.Plugins.Hutao.Combat.UploadResp>(url, { const resp = await TGHttps.post<TGApp.Plugins.Hutao.Combat.UploadResp>(url, {
method: "POST", body: uploadData,
body: JSON.stringify(data),
headers: { "Content-Type": "application/json" }, headers: { "Content-Type": "application/json" },
}); });
return resp.data;
} }
/**
* 将本地数据转为上传用的数据
* @since Beta v0.6.3
* @param data - 本地数据
* @returns 上传用的数据
*/
function trans(data: TGApp.Sqlite.Combat.TableTrans): TGApp.Plugins.Hutao.Combat.UploadData {
return {
Version: 1,
Uid: data.uid,
Identity: "TeyvatGuide",
BackupAvatars: data.detail.backup_avatars.map((i) => i.avatar_id),
ScheduleId: data.id,
};
}
const CombatReq = {
data,
upload,
trans,
};
export default CombatReq;

View File

@@ -1,8 +1,8 @@
/** /**
* 祈愿相关请求 * 祈愿相关请求
* @since Beta v0.10.0 * @since Beta v0.10.1
*/ */
import TGHttp from "@utils/TGHttp.js"; import TGHttps from "@utils/TGHttps.js";
import { getReqHeader } from "../utils/authUtils.js"; import { getReqHeader } from "../utils/authUtils.js";
@@ -10,54 +10,47 @@ const HUTAO_GACHA_API = "https://homa.gentle.house/GachaLog/";
/** /**
* 获取抽卡入口 * 获取抽卡入口
* @since Beta v0.10.1
* @param tk - token * @param tk - token
* @returns 抽卡记录概况 * @returns 抽卡记录概况响应
*/ */
export async function getEntries( async function entry(tk: string): Promise<TGApp.Plugins.Hutao.Gacha.EntryResp> {
tk: string,
): Promise<TGApp.Plugins.Hutao.Gacha.EntryRes | TGApp.Plugins.Hutao.Base.Resp> {
const url = `${HUTAO_GACHA_API}Entries`; const url = `${HUTAO_GACHA_API}Entries`;
const header = await getReqHeader(tk); const header = await getReqHeader(tk);
const resp = await TGHttp<TGApp.Plugins.Hutao.Gacha.EntryResp>(url, { const resp = await TGHttps.get<TGApp.Plugins.Hutao.Gacha.EntryResp>(url, {
method: "GET",
headers: header, headers: header,
}); });
if (resp.retcode !== 0) return <TGApp.Plugins.Hutao.Base.Resp>resp; return resp.data;
return <TGApp.Plugins.Hutao.Gacha.EntryRes>resp.data;
} }
/** /**
* 获取抽卡EndId * 获取抽卡EndId
* @since Beta v0.10.0 * @since Beta v0.10.1
* @param tk - token * @param tk - token
* @param uid - 记录UID * @param uid - 记录UID
* @returns EndId * @returns EndId响应
*/ */
export async function getEndIds( async function endIds(tk: string, uid: string): Promise<TGApp.Plugins.Hutao.Gacha.EndIdResp> {
tk: string,
uid: string,
): Promise<TGApp.Plugins.Hutao.Gacha.EndIdRes | TGApp.Plugins.Hutao.Base.Resp> {
const url = `${HUTAO_GACHA_API}EndIds`; const url = `${HUTAO_GACHA_API}EndIds`;
const header = await getReqHeader(tk); const header = await getReqHeader(tk);
const resp = await TGHttp<TGApp.Plugins.Hutao.Gacha.EndIdResp>(url, { const resp = await TGHttps.get<TGApp.Plugins.Hutao.Gacha.EndIdResp>(url, {
method: "GET",
headers: header, headers: header,
query: { Uid: uid }, query: { Uid: uid },
}); });
if (resp.retcode !== 0) return <TGApp.Plugins.Hutao.Base.Resp>resp; return resp.data;
return <TGApp.Plugins.Hutao.Gacha.EndIdRes>resp.data;
} }
/** /**
* 获取抽卡记录 * 获取抽卡记录
* @since Beta v0.10.0 * @since Beta v0.10.1
* @param tk - token * @param tk - token
* @param uid - 记录UID * @param uid - 记录UID
* @param gType - 祈愿类型按照EndId来 * @param gType - 祈愿类型
* @param count - 数量
* @param endId - endId * @param endId - endId
* @param count - 尺寸 * @returns 抽卡记录响应
*/ */
export async function getGachaLogs( async function logs(
tk: string, tk: string,
uid: string, uid: string,
gType: number, gType: number,
@@ -72,49 +65,56 @@ export async function getGachaLogs(
count: count, count: count,
}; };
if (endId) params.endId = endId; if (endId) params.endId = endId;
return await TGHttp<TGApp.Plugins.Hutao.Gacha.GachaLogResp>(url, { const resp = await TGHttps.get<TGApp.Plugins.Hutao.Gacha.GachaLogResp>(url, {
method: "GET",
headers: header, headers: header,
query: params, query: params,
}); });
return resp.data;
} }
/** /**
* 上传抽卡记录 * 上传抽卡记录
* @since Beta v0.9.1 * @since Beta v0.10.1
* @param tk - token * @param tk - token
* @param data - 上传数据 * @param data - 上传数据
* @returns 上传结果 * @returns 上传结果
*/ */
export async function uploadGachaLogs( async function upload(
tk: string, tk: string,
data: TGApp.Plugins.Hutao.Gacha.UploadData, data: TGApp.Plugins.Hutao.Gacha.UploadData,
): Promise<TGApp.Plugins.Hutao.Gacha.UploadResp> { ): Promise<TGApp.Plugins.Hutao.Gacha.UploadResp> {
const url = `${HUTAO_GACHA_API}Upload`; const url = `${HUTAO_GACHA_API}Upload`;
const header = await getReqHeader(tk); const header = await getReqHeader(tk);
return await TGHttp<TGApp.Plugins.Hutao.Gacha.UploadResp>(url, { const resp = await TGHttps.post<TGApp.Plugins.Hutao.Gacha.UploadResp>(url, {
method: "POST",
headers: header, headers: header,
body: JSON.stringify(data), body: data,
}); });
return resp.data;
} }
/** /**
* 删除祈愿记录 * 删除祈愿记录
* @since Beta v0.9.1 * @since Beta v0.10.1
* @param tk - token * @param tk - token
* @param uid - uid * @param uid - uid
* @returns 删除结果 * @returns 删除结果
*/ */
export async function deleteGachaLogs( async function deleteLogs(tk: string, uid: string): Promise<TGApp.Plugins.Hutao.Gacha.DeleteResp> {
tk: string,
uid: string,
): Promise<TGApp.Plugins.Hutao.Gacha.DeleteResp> {
const url = `${HUTAO_GACHA_API}Delete`; const url = `${HUTAO_GACHA_API}Delete`;
const header = await getReqHeader(tk); const header = await getReqHeader(tk);
return await TGHttp<TGApp.Plugins.Hutao.Gacha.DeleteResp>(url, { const resp = await TGHttps.get<TGApp.Plugins.Hutao.Gacha.DeleteResp>(url, {
method: "GET",
headers: header, headers: header,
query: { Uid: uid }, query: { Uid: uid },
}); });
return resp.data;
} }
const GachaReq = {
entry,
endIds,
logs,
upload,
delete: deleteLogs,
};
export default GachaReq;

View File

@@ -1,6 +1,6 @@
/** /**
* 胡桃原始数据验证器 * 胡桃原始数据验证器
* @since Beta v0.9.9 * @since Beta v0.10.1
*/ */
import showSnackbar from "@comp/func/snackbar.js"; import showSnackbar from "@comp/func/snackbar.js";
@@ -108,11 +108,7 @@ function verifyCombatArray(data: unknown): data is Array<TGApp.Plugins.Hutao.Com
return data.every(validateCombat); return data.every(validateCombat);
} }
/** const HutaoValid = {
* 原始数据验证器
* @since Beta v0.9.9
*/
export const RawValidator = {
/** 深渊数据验证 */ /** 深渊数据验证 */
abyss: verifyAbyssArray, abyss: verifyAbyssArray,
/** 危战数据验证 */ /** 危战数据验证 */
@@ -120,3 +116,5 @@ export const RawValidator = {
/** 剧诗数据验证 */ /** 剧诗数据验证 */
combat: verifyCombatArray, combat: verifyCombatArray,
}; };
export default HutaoValid;

View File

@@ -1,113 +0,0 @@
/**
* 将本地数据转为上传用的数据
* @since Beta v0.6.3
*/
/**
* 将本地数据转为上传用的数据
* @since Beta v0.6.3
* @param data - 本地数据
* @returns 上传用的数据
*/
export function transAbyssLocal(
data: TGApp.Sqlite.Abyss.TableTrans,
): TGApp.Plugins.Hutao.Abyss.RecordUpload {
return {
Uid: data.uid,
Identity: "TeyvatGuide",
SpiralAbyss: transAbyssData(data),
Avatars: [],
ReservedUserName: "",
};
}
/**
* 转换深渊数据
* @since Beta v0.6.3
* @param data - 本地数据
* @returns 上传用的数据
*/
function transAbyssData(data: TGApp.Sqlite.Abyss.TableTrans): TGApp.Plugins.Hutao.Abyss.RecordData {
return {
ScheduleId: data.id,
TotalBattleTimes: data.totalBattleTimes,
TotalWinTimes: data.totalWinTimes,
Defeat: {
AvatarId: data.defeatRank[0].id,
Value: data.defeatRank[0].value,
},
EnergySkill: {
AvatarId: data.energySkillRank[0].id,
Value: data.energySkillRank[0].value,
},
NormalSkill: {
AvatarId: data.normalSkillRank[0].id,
Value: data.normalSkillRank[0].value,
},
Damage: {
AvatarId: data.damageRank[0].id,
Value: data.damageRank[0].value,
},
TakeDamage: {
AvatarId: data.takeDamageRank[0].id,
Value: data.takeDamageRank[0].value,
},
Floors: data.floors.map((floor: TGApp.Sqlite.Abyss.Floor) => transFloor(floor)),
};
}
/**
* 转换层数数据
* @since Alpha v0.2.1
* @param data - 本地数据
* @returns 上传用的数据
*/
function transFloor(data: TGApp.Sqlite.Abyss.Floor): TGApp.Plugins.Hutao.Abyss.Floor {
return {
Index: data.id,
Star: data.winStar,
Levels: data.levels.map((level) => transLevel(level)),
};
}
/**
* 转换层-关卡数据
* @since Alpha v0.2.1
* @param data - 本地数据
* @returns 上传用的数据
*/
function transLevel(data: TGApp.Sqlite.Abyss.Level): TGApp.Plugins.Hutao.Abyss.Level {
const battles: Array<{ Index: number; Avatars: Array<number> }> = [];
battles.push({
Index: 1,
Avatars: data.upBattle!.characters.map((character) => character.id),
});
battles.push({
Index: 2,
Avatars: data.downBattle!.characters.map((character) => character.id),
});
return {
Index: data.id,
Star: data.winStar,
Battles: battles,
};
}
/**
* 转换角色数据
* @since Beta v0.5.5
* @param avatars - 角色数据
* @returns 上传用的数据
*/
export function transAbyssAvatars(
avatars: Array<TGApp.Sqlite.Character.TableTrans>,
): Array<TGApp.Plugins.Hutao.Abyss.Avatar> {
return avatars.map((avatar) => {
return {
AvatarId: avatar.avatar.id,
WeaponId: avatar.weapon.id,
ReliquarySetIds: avatar.relics.map((relic) => relic.set.id),
ActivedConstellationNumber: avatar.avatar.actived_constellation_num,
};
});
}

View File

@@ -1,22 +0,0 @@
/**
* 将本地数据转为上传用的数据
* @since Beta v0.6.3
*/
/**
* 将本地数据转为上传用的数据
* @since Beta v0.6.3
* @param data - 数据
* @returns 上传用的数据
*/
export function transCombatLocal(
data: TGApp.Sqlite.Combat.TableTrans,
): TGApp.Plugins.Hutao.Combat.UploadData {
return {
Version: 1,
Uid: data.uid,
Identity: "TeyvatGuide",
BackupAvatars: data.detail.backup_avatars.map((i) => i.avatar_id),
ScheduleId: data.id,
};
}

View File

@@ -1,12 +1,14 @@
/** /**
* 胡桃账号 * 胡桃账号
* @since Beta v0.9.1 * @since Beta v0.10.1
*/ */
import showDialog from "@comp/func/dialog.js"; import showDialog from "@comp/func/dialog.js";
import showLoading from "@comp/func/loading.js"; import showLoading from "@comp/func/loading.js";
import showSnackbar from "@comp/func/snackbar.js"; import showSnackbar from "@comp/func/snackbar.js";
import hutao from "@Hutao/index.js"; import hutao from "@Hutao/index.js";
import TGHttps from "@utils/TGHttps.js";
import TGLogger from "@utils/TGLogger.js";
import { validEmail } from "@utils/toolFunc.js"; import { validEmail } from "@utils/toolFunc.js";
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import { ref } from "vue"; import { ref } from "vue";
@@ -55,21 +57,28 @@ const useHutaoStore = defineStore(
await showLoading.start("正在登录胡桃云", inputN); await showLoading.start("正在登录胡桃云", inputN);
try { try {
const resp = await hutao.Account.login(inputN, inputP); const resp = await hutao.Account.login(inputN, inputP);
if ("retcode" in resp) { if (resp.retcode !== 0) {
showSnackbar.warn(`[${resp.retcode}] ${resp.message}`); showSnackbar.warn(`[${resp.retcode}] ${resp.message}`);
console.error(resp); await TGLogger.Warn(`[HutaoStore][tryLogin] 登录失败:${resp.retcode} ${resp.message}`);
await showLoading.end();
return;
}
if (!resp.data) {
showSnackbar.error("登录返回数据为空");
await TGLogger.Error(`[HutaoStore][tryLogin] 登录返回数据为空`);
await showLoading.end(); await showLoading.end();
return; return;
} }
isLogin.value = true; isLogin.value = true;
userName.value = inputN; userName.value = inputN;
accessToken.value = resp.AccessToken; accessToken.value = resp.data.AccessToken;
refreshToken.value = resp.RefreshToken; refreshToken.value = resp.data.RefreshToken;
accessExpire.value = Date.now() + resp.ExpiresIn * 1000; accessExpire.value = Date.now() + resp.data.ExpiresIn * 1000;
showSnackbar.success("成功登录胡桃云"); showSnackbar.success("成功登录胡桃云");
} catch (err) { } catch (e) {
console.error(err); const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error("登录胡桃云失败"); showSnackbar.error(`登录胡桃云失败${errMsg}`);
await TGLogger.Error(`[HutaoStore][tryLogin] 登录异常:${errMsg}`);
} finally { } finally {
await showLoading.end(); await showLoading.end();
} }
@@ -82,21 +91,28 @@ const useHutaoStore = defineStore(
await showLoading.start("正在登录胡桃云", username); await showLoading.start("正在登录胡桃云", username);
try { try {
const resp = await hutao.Account.login(username, pwd); const resp = await hutao.Account.login(username, pwd);
if ("retcode" in resp) { if (resp.retcode !== 0) {
showSnackbar.warn(`[${resp.retcode}] ${resp.message}`); showSnackbar.warn(`[${resp.retcode}] ${resp.message}`);
console.error(resp); await TGLogger.Warn(`[HutaoStore][autoLogin] 登录失败:${resp.retcode} ${resp.message}`);
await showLoading.end();
return;
}
if (!resp.data) {
showSnackbar.error("登录返回数据为空");
await TGLogger.Error(`[HutaoStore][autoLogin] 登录返回数据为空`);
await showLoading.end(); await showLoading.end();
return; return;
} }
isLogin.value = true; isLogin.value = true;
userName.value = username; userName.value = username;
accessToken.value = resp.AccessToken; accessToken.value = resp.data.AccessToken;
refreshToken.value = resp.RefreshToken; refreshToken.value = resp.data.RefreshToken;
accessExpire.value = Date.now() + resp.ExpiresIn * 1000; accessExpire.value = Date.now() + resp.data.ExpiresIn * 1000;
showSnackbar.success("成功登录胡桃云"); showSnackbar.success("成功登录胡桃云");
} catch (err) { } catch (e) {
console.error(err); const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error("登录胡桃云失败"); showSnackbar.error(`登录胡桃云失败${errMsg}`);
await TGLogger.Error(`[HutaoStore][autoLogin] 登录异常:${errMsg}`);
} finally { } finally {
await showLoading.end(); await showLoading.end();
} }
@@ -107,13 +123,27 @@ const useHutaoStore = defineStore(
async function tryRefreshInfo(): Promise<void> { async function tryRefreshInfo(): Promise<void> {
await tryRefreshToken(); await tryRefreshToken();
const resp = await hutao.Account.info(accessToken.value!); try {
if ("retcode" in resp) { const resp = await hutao.Account.info(accessToken.value!);
showSnackbar.warn(`刷新用户信息失败:${resp.retcode}-${resp.message}`); if (resp.retcode !== 0) {
return; showSnackbar.warn(`刷新用户信息失败:${resp.retcode}-${resp.message}`);
await TGLogger.Warn(
`[HutaoStore][tryRefreshInfo] 刷新用户信息失败:${resp.retcode} ${resp.message}`,
);
return;
}
if (!resp.data) {
showSnackbar.error("刷新用户信息返回数据为空");
await TGLogger.Error(`[HutaoStore][tryRefreshInfo] 刷新用户信息返回数据为空`);
return;
}
userInfo.value = resp.data;
showSnackbar.success("成功刷新用户信息");
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`刷新用户信息失败:${errMsg}`);
await TGLogger.Error(`[HutaoStore][tryRefreshInfo] 刷新用户信息异常:${errMsg}`);
} }
userInfo.value = resp;
showSnackbar.success("成功刷新用户信息");
} }
async function tryRefreshToken(): Promise<void> { async function tryRefreshToken(): Promise<void> {
@@ -124,18 +154,26 @@ const useHutaoStore = defineStore(
if (checkIsValid()) return; if (checkIsValid()) return;
try { try {
const resp = await hutao.Token.refresh(refreshToken.value); const resp = await hutao.Token.refresh(refreshToken.value);
if ("retcode" in resp) { if (resp.retcode !== 0) {
showSnackbar.warn(`[${resp.retcode}] ${resp.message}`); showSnackbar.warn(`[${resp.retcode}] ${resp.message}`);
console.error(resp); await TGLogger.Warn(
`[HutaoStore][tryRefreshToken] 刷新Token失败${resp.retcode} ${resp.message}`,
);
return; return;
} }
accessToken.value = resp.AccessToken; if (!resp.data) {
refreshToken.value = resp.RefreshToken; showSnackbar.error("刷新Token返回数据为空");
accessExpire.value = Date.now() + resp.ExpiresIn * 1000; await TGLogger.Error(`[HutaoStore][tryRefreshToken] 刷新Token返回数据为空`);
return;
}
accessToken.value = resp.data.AccessToken;
refreshToken.value = resp.data.RefreshToken;
accessExpire.value = Date.now() + resp.data.ExpiresIn * 1000;
showSnackbar.success("成功刷新胡桃云Token"); showSnackbar.success("成功刷新胡桃云Token");
} catch (e) { } catch (e) {
console.error(e); const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error("刷新胡桃云Token失败"); showSnackbar.error(`刷新胡桃云Token失败${errMsg}`);
await TGLogger.Error(`[HutaoStore][tryRefreshToken] 刷新Token异常${errMsg}`);
} }
} }