diff --git a/src/pages/User/Characters.vue b/src/pages/User/Characters.vue
index 9e8197cf..fe3f2a2b 100644
--- a/src/pages/User/Characters.vue
+++ b/src/pages/User/Characters.vue
@@ -5,11 +5,17 @@
{{ user.nickname }} UID:{{ user.gameUid }} 更新于 {{ getUpdateTime() }}
-
+
mdi-refresh
- 更新数据
+ 更新角色数据
+
+
+
+ mdi-refresh
+
+ 更新天赋数据
@@ -66,12 +72,12 @@ onMounted(async () => {
loadingTitle.value = "正在获取角色数据";
loading.value = true;
await loadRole();
- resizeObserve.observe(document.querySelector(".uc-grid"));
+ resizeObserve.observe(document.querySelector(".uc-grid"));
loading.value = false;
});
function getGridGap() {
- const width = document.querySelector(".uc-grid")?.clientWidth - 20;
+ const width = document.querySelector(".uc-grid")?.clientWidth - 20;
const count = Math.floor(width / 180);
gridGap.value = `${(width - count * 180) / (count - 1)}px`;
}
@@ -84,7 +90,7 @@ async function loadRole() {
}
}
-async function refresh() {
+async function refreshRoles() {
loadingTitle.value = "正在获取角色数据";
loading.value = true;
const res = await TGRequest.User.byLToken.getRoleList(roleCookie.value, user.value);
@@ -97,6 +103,38 @@ async function refresh() {
loading.value = false;
}
+async function refreshTalent() {
+ loadingTitle.value = "正在获取天赋数据";
+ loading.value = true;
+ await Promise.allSettled(
+ roleList.value.map(async (role) => {
+ const res = await TGRequest.User.calculate.getSyncAvatarDetail(
+ roleCookie.value,
+ user.value.gameUid,
+ role.cid,
+ );
+ if (!Object.hasOwnProperty("retcode")) {
+ const talent: TGApp.Sqlite.Character.RoleTalent[] = [];
+ const avatar = res;
+ avatar.skill_list.map((skill, index) => {
+ return talent.push({
+ id: skill.id,
+ pos: index,
+ level: skill.level_current,
+ max: skill.max_level,
+ name: skill.name,
+ icon: skill.icon,
+ });
+ });
+ return await TGSqlite.saveUserCharacterTalent(user.value.gameUid, role.cid, talent);
+ }
+ }),
+ );
+ loadingTitle.value = "正在更新天赋数据";
+ await loadRole();
+ loading.value = false;
+}
+
async function shareRoles() {
const rolesBox = document.querySelector(".uc-box") as HTMLElement;
const fileName = `【角色列表】-${user.value.gameUid}`;
@@ -116,6 +154,7 @@ function getUpdateTime() {
function selectRole(role: TGApp.Sqlite.Character.UserRole) {
dataVal.value = role;
+ console.log(dataVal.value);
visible.value = true;
}
diff --git a/src/plugins/Sqlite/index.ts b/src/plugins/Sqlite/index.ts
index 0c010fde..3de66bba 100644
--- a/src/plugins/Sqlite/index.ts
+++ b/src/plugins/Sqlite/index.ts
@@ -2,7 +2,7 @@
* @file plugins Sqlite index.ts
* @description Sqlite 数据库操作类
* @author BTMuli
- * @since Alpha v0.2.0
+ * @since Alpha v0.2.1
*/
// tauri
@@ -433,6 +433,27 @@ class Sqlite {
await db.close();
}
+ /**
+ * @description 保存用户角色天赋数据
+ * @since Alpha v0.2.1
+ * @param {string} uid 用户 uid
+ * @param {number} cid 角色 ID
+ * @param {TGApp.Sqlite.Character.RoleTalent[]} data 角色天赋数据
+ * @returns {Promise}
+ */
+ public async saveUserCharacterTalent(
+ uid: string,
+ cid: number,
+ data: TGApp.Sqlite.Character.RoleTalent[],
+ ): Promise {
+ const db = await Database.load(this.dbPath);
+ const sql = `UPDATE UserCharacters
+ SET talent = '${JSON.stringify(data)}', updated = datetime('now', 'localtime')
+ WHERE uid = '${uid}' AND cid = ${cid}`;
+ await db.execute(sql);
+ await db.close();
+ }
+
/**
* @description 获取用户角色数据
* @since Alpha v0.2.0
diff --git a/src/plugins/Sqlite/sql/insertData.ts b/src/plugins/Sqlite/sql/insertData.ts
index b39ae169..d7dbc566 100644
--- a/src/plugins/Sqlite/sql/insertData.ts
+++ b/src/plugins/Sqlite/sql/insertData.ts
@@ -2,7 +2,7 @@
* @file plugins Sqlite sql insertData.ts
* @description Sqlite 插入数据 sql 语句
* @author BTMuli
- * @since Alpha v0.2.0
+ * @since Alpha v0.2.1
*/
// utils
@@ -237,7 +237,7 @@ export function insertRecordData(data: TGApp.Game.Record.FullData, uid: string):
/**
* @description 插入用户角色数据
- * @since Alpha v0.2.0
+ * @since Alpha v0.2.1
* @param {string} uid 用户 UID
* @param {TGApp.User.Character.Item[]} data 角色数据
* @returns {string} sql
@@ -247,10 +247,10 @@ export function insertRoleData(uid: string, data: TGApp.Game.Character.ListItem[
const role = transUserRoles(item);
return `
INSERT INTO UserCharacters (uid, cid, name, img, name, fetter, level, element, star, weapon, reliquary,
- constellation, activeConstellation, costume, talent, updated)
+ constellation, activeConstellation, costume, updated)
VALUES (${uid}, ${role.cid}, '${role.name}', '${role.img}', '${role.name}', ${role.fetter}, ${role.level},
'${role.element}', ${role.star}, '${role.weapon}', '${role.reliquary}', '${role.constellation}',
- ${role.activeConstellation}, '${role.costume}', '${role.talent}', datetime('now', 'localtime'))
+ ${role.activeConstellation}, '${role.costume}', datetime('now', 'localtime'))
ON CONFLICT(uid, cid) DO UPDATE
SET name = '${role.name}',
img = '${role.img}',
@@ -264,7 +264,6 @@ export function insertRoleData(uid: string, data: TGApp.Game.Character.ListItem[
constellation = '${role.constellation}',
activeConstellation = ${role.activeConstellation},
costume = '${role.costume}',
- talent = '${role.talent}',
updated = datetime('now', 'localtime');
`;
});
diff --git a/src/types/Sqlite/Character.d.ts b/src/types/Sqlite/Character.d.ts
index 2410c585..bee2a76d 100644
--- a/src/types/Sqlite/Character.d.ts
+++ b/src/types/Sqlite/Character.d.ts
@@ -35,7 +35,7 @@ declare namespace TGApp.Sqlite.Character {
/**
* @description 用户角色列表的角色类型
- * @since Alpha v0.2.0
+ * @since Alpha v0.2.1
* @interface UserRole
* @property {number} uid- 用户 ID
* @property {number} cid - 角色 ID
@@ -50,7 +50,7 @@ declare namespace TGApp.Sqlite.Character {
* @property {RoleConstellation[]} constellation - 角色命座 // 数据库中以字符串形式存储
* @property {number} activeConstellation - 角色激活命座
* @property {RoleCostume} costume - 角色时装 // 数据库中以字符串形式存储
- * @property {string} talent - 角色天赋 // TODO: 天赋数据缺失来源
+ * @property {RoleTalent[]} talent - 角色天赋 // 数据库中以字符串形式存储
* @property {string} updated - 数据更新时间
* @return UserRole
*/
@@ -167,4 +167,25 @@ declare namespace TGApp.Sqlite.Character {
name: string;
icon: string;
}
+
+ /**
+ * @description 角色列表的天赋数据类型
+ * @since Alpha v0.2.1
+ * @interface RoleTalent
+ * @property {number} id - 天赋 ID
+ * @property {number} pos - 天赋位置
+ * @property {string} name - 天赋名称
+ * @property {string} icon - 天赋图标
+ * @property {number} max - 天赋最大等级
+ * @property {number} level - 天赋等级
+ * @return RoleTalent
+ */
+ export interface RoleTalent {
+ id: number;
+ pos: number;
+ name: string;
+ icon: string;
+ max: number;
+ level: number;
+ }
}
diff --git a/src/web/request/getRoleList.ts b/src/web/request/getRoleList.ts
index 2eacd290..f031d139 100644
--- a/src/web/request/getRoleList.ts
+++ b/src/web/request/getRoleList.ts
@@ -14,7 +14,7 @@ import TGUtils from "../utils/TGUtils";
/**
* @description 通过 Cookie 获取用户角色列表
* @since Alpha v0.2.0
- * @param {Record} cookie Cookie
+ * @param {TGApp.BBS.Constant.CookieGroup4} cookie Cookie
* @param {TGApp.Sqlite.Account.Game} account 游戏账号
* @returns {Promise} 用户角色列表
*/
diff --git a/src/web/request/getSyncAvatarDetail.ts b/src/web/request/getSyncAvatarDetail.ts
index 9bd20cc8..032f1b5b 100644
--- a/src/web/request/getSyncAvatarDetail.ts
+++ b/src/web/request/getSyncAvatarDetail.ts
@@ -15,26 +15,30 @@ import TGUtils from "../utils/TGUtils";
/**
* @description 获取同步角色详情
* @since Alpha v0.2.1
- * @param {Record} cookie cookie
+ * @param {TGApp.BBS.Constant.CookieGroup2} cookie cookie
* @param {string} uid 用户 uid
- * @param {string} avatarId 角色 id
+ * @param {number} avatarId 角色 id
* @returns {Promise}
*/
async function getSyncAvatarDetail(
- cookie: Record,
+ cookie: TGApp.BBS.Constant.CookieGroup2,
uid: string,
- avatarId: string,
+ avatarId: number,
): Promise {
const url = TGApi.GameData.calculate.getSyncAvatarDetail;
const params = {
uid,
region: TGUtils.Tools.getServerByUid(uid),
- avatar_id: avatarId,
+ avatar_id: avatarId.toString(),
+ };
+ const ck: Record = {
+ account_id: cookie.account_id,
+ cookie_token: cookie.cookie_token,
};
const header = {
"User-Agent": "Tauri.Genshin/0.2.1",
Referer: "https://webstatic.mihoyo.com/",
- Cookie: TGUtils.Tools.transCookie(cookie),
+ Cookie: TGUtils.Tools.transCookie(ck),
};
return await http
.fetch(url, {