diff --git a/src/types/Game/Calculate.d.ts b/src/types/Game/Calculate.d.ts new file mode 100644 index 00000000..4f998afd --- /dev/null +++ b/src/types/Game/Calculate.d.ts @@ -0,0 +1,143 @@ +/** + * @file types Game Calculate.d.ts + * @description 养成计算器相关类型定义文件 + * @author BTMuli + * @since Alpha v0.2.1 + */ + +declare namespace TGApp.Game.Calculate { + /** + * @description 获取同步角色列表返回 + * @since Alpha v0.2.1 + * @see TGRequest.User.calculate.getSyncAvatarListAll + * @interface SyncAvatarListResponse + * @extends TGApp.BBS.Response.Base + * @property {Array} data.list - 角色列表 + * @return SyncAvatarListResponse + */ + export interface SyncAvatarListResponse extends TGApp.BBS.Response.Base { + data: { + list: AvatarListItem[]; + }; + } + + /** + * @description 获取同步角色列表返回的角色数据 + * @since Alpha v0.2.1 + * @interface AvatarListItem + * @property {number} id - 角色 ID + * @property {string} name - 角色名称 + * @property {string} icon - 角色头像 + * @property {number} weapon_cat_id - 角色武器类型 + * @property {number} avatar_level - 角色等级 + * @property {number} element_attr_id - 角色元素类型 + * @property {number} max_level - 角色最大等级 + * @property {number} level_current - 角色当前等级 + * @return AvatarListItem + */ + export interface AvatarListItem { + id: number; + name: string; + icon: string; + weapon_cat_id: number; + avatar_level: number; + element_attr_id: number; + max_level: number; + level_current: number; + } + + /** + * @description 获取同步角色详情返回 + * @since Alpha v0.2.1 + * @see TGRequest.User.calculate.getSyncAvatarDetail + * @interface SyncAvatarDetailResponse + * @extends TGApp.BBS.Response.Base + * @property {AvatarDetail} data - 角色详情 + * @return SyncAvatarDetailResponse + */ + export interface SyncAvatarDetailResponse extends TGApp.BBS.Response.Base { + data: TGApp.Game.Calculate.AvatarDetail; + } + + /** + * @description 获取同步角色详情返回的角色详情数据 + * @since Alpha v0.2.1 + * @interface AvatarDetail + * @property {AvatarDetailSkill[]} skill_list - 角色技能列表 + * @property {AvatarDetailWeapon} weapon - 角色武器 + * @property {AvatarDetailRelic[]} reliquary_list - 角色圣遗物列表 + * @return AvatarDetail + */ + export interface AvatarDetail { + skill_list: AvatarDetailSkill[]; + weapon: AvatarDetailWeapon; + reliquary_list: AvatarDetailRelic[]; + } + + /** + * @description 获取同步角色详情返回的角色技能数据 + * @since Alpha v0.2.1 + * @interface AvatarDetailSkill + * @property {number} id - 技能 ID + * @property {number} group_id - 技能组 ID + * @property {string} name - 技能名称 + * @property {string} icon - 技能图标 + * @property {number} max_level - 技能最大等级 + * @property {number} level_current - 技能当前等级 + * @return AvatarDetailSkill + */ + export interface AvatarDetailSkill { + id: number; + group_id: number; + name: string; + icon: string; + max_level: number; + level_current: number; + } + + /** + * @description 获取同步角色详情返回的角色武器数据 + * @since Alpha v0.2.1 + * @interface AvatarDetailWeapon + * @property {number} id - 武器 ID + * @property {string} name - 武器名称 + * @property {string} icon - 武器图标 + * @property {number} weapon_cat_id - 武器类型 + * @property {number} weapon_level - 武器等级 + * @property {number} max_level - 武器最大等级 + * @property {number} level_current - 武器当前等级 + * @return AvatarDetailWeapon + */ + export interface AvatarDetailWeapon { + id: number; + name: string; + icon: string; + weapon_cat_id: number; + weapon_level: number; + max_level: number; + level_current: number; + } + + /** + * @description 获取同步角色详情返回的角色圣遗物数据 + * @since Alpha v0.2.1 + * @interface AvatarDetailRelic + * @property {number} id - 圣遗物 ID + * @property {string} name - 圣遗物名称 + * @property {string} icon - 圣遗物图标 + * @property {number} reliquary_cat_id - 圣遗物类型 + * @property {number} reliquary_level - 圣遗物等级 + * @property {number} level_current - 圣遗物当前等级 + * @property {number} max_level - 圣遗物最大等级 + * @return AvatarDetailRelic + */ + export interface AvatarDetailRelic { + id: number; + name: string; + icon: string; + reliquary_cat_id: number; + reliquary_level: number; + level_current: number; + max_level: number; + } +} diff --git a/src/web/api/TGApi.ts b/src/web/api/TGApi.ts index 49f95c80..31feb5be 100644 --- a/src/web/api/TGApi.ts +++ b/src/web/api/TGApi.ts @@ -1,8 +1,8 @@ /** * @file web api TGApi.ts * @description 应用用到的 API - * @author BTMuli - * @since Alpha v0.2.0 + * @author BTMuli + * @since Alpha v0.2.1 */ import { BBSUserInfoApi } from "./BBS"; @@ -17,6 +17,8 @@ import { TakumiRecordAbyssApi, TakumiSTokenBindingRolesApi, TakumiCookieBindingRolesApi, + TakumiCalculateSyncAvatarListApi, + TakumiCalculateSyncAvatarDetailApi, } from "./Takumi"; // 应用 API @@ -40,6 +42,10 @@ const TGApi = { bySToken: { getAccounts: TakumiSTokenBindingRolesApi, // 获取绑定角色 }, + calculate: { + getSyncAvatarList: TakumiCalculateSyncAvatarListApi, // 同步角色列表 + getSyncAvatarDetail: TakumiCalculateSyncAvatarDetailApi, // 同步角色详情 + }, getUserCard: TakumiRecordCardApi, // 获取用户卡片 getUserBase: TakumiRecordIndexApi, // 获取用户基本信息 getAbyss: TakumiRecordAbyssApi, // 获取深境螺旋信息 diff --git a/src/web/api/Takumi.ts b/src/web/api/Takumi.ts index aca231e3..a152bc3e 100644 --- a/src/web/api/Takumi.ts +++ b/src/web/api/Takumi.ts @@ -6,16 +6,20 @@ */ const TakumiApi = "https://api-takumi.mihoyo.com/"; // 基础 API -const TakumiRecordApi = "https://api-takumi-record.mihoyo.com/"; // 游戏记录 API -const TakumiBindingApi = `${TakumiApi}binding/api/`; // 绑定 API -const TakumiRecordGenshinApi = `${TakumiRecordApi}game_record/app/genshin/api/`; // 原神游戏记录 API const TakumiAuthApi = `${TakumiApi}auth/api/`; // 认证 API +const TakumiBindingApi = `${TakumiApi}binding/api/`; // 绑定 API +const TakumiCalculateApi = `${TakumiApi}event/e20200928calculate/`; // 计算 API +const TakumiRecordApi = "https://api-takumi-record.mihoyo.com/"; // 游戏记录 API +const TakumiRecordGenshinApi = `${TakumiRecordApi}game_record/app/genshin/api/`; // 原神游戏记录 API export const TakumiTokensApi = `${TakumiAuthApi}getMultiTokenByLoginTicket`; // 登录票据 API -export const TakumiActionTicketsApi = `${TakumiAuthApi}getActionTicketByStoken`; // 行为票据 API export const TakumiRecordCardApi = `${TakumiRecordApi}game_record/app/card/wapi/getGameRecordCard`; // 游戏记录卡片 API export const TakumiRecordIndexApi = `${TakumiRecordGenshinApi}index`; // 原神游戏记录索引 API export const TakumiRecordCharactersApi = `${TakumiRecordGenshinApi}character`; // 原神游戏记录角色 API export const TakumiRecordAbyssApi = `${TakumiRecordGenshinApi}spiralAbyss`; // 原神游戏记录深境螺旋 API export const TakumiSTokenBindingRolesApi = `${TakumiBindingApi}getUserGameRolesBySToken`; // 获取绑定角色 API-根据 stoken export const TakumiCookieBindingRolesApi = `${TakumiBindingApi}getUserGameRolesByCookie`; // 获取绑定角色 API-根据 Cookie + +// 养成计算器 API +export const TakumiCalculateSyncAvatarListApi = `${TakumiCalculateApi}v1/sync/avatar/list`; +export const TakumiCalculateSyncAvatarDetailApi = `${TakumiCalculateApi}v1/sync/avatar/detail`; diff --git a/src/web/request/TGRequest.ts b/src/web/request/TGRequest.ts index 340dd7f3..2c051c42 100644 --- a/src/web/request/TGRequest.ts +++ b/src/web/request/TGRequest.ts @@ -1,8 +1,8 @@ /** * @file web request TGRequest.ts * @description 应用用到的请求函数 - * @author BTMuli - * @since Alpha v0.1.6 + * @author BTMuli + * @since Alpha v0.2.1 */ import { getAbyss } from "./getAbyss"; @@ -13,6 +13,8 @@ import { getGameAccountsBySToken, getGameAccountsByCookie } from "./getGameAccou import { getGameRecord } from "./getGameRecord"; import { getLTokenBySToken } from "./getLToken"; import { getGameRoleListByLToken } from "./getRoleList"; +import getSyncAvatarDetail from "./getSyncAvatarDetail"; +import getSyncAvatarListAll from "./getSyncAvatarListAll"; // import * from "./getTickets.ts"; import { getTokensByLoginTicket } from "./getTokens"; import { getUserInfoByCookie } from "./getUserInfo"; @@ -45,6 +47,10 @@ const TGRequest = { getCookieToken: getCookieTokenBySToken, getLToken: getLTokenBySToken, }, + calculate: { + getSyncAvatarListAll, + getSyncAvatarDetail, + }, }, }; diff --git a/src/web/request/getSyncAvatarDetail.ts b/src/web/request/getSyncAvatarDetail.ts new file mode 100644 index 00000000..02aa6f40 --- /dev/null +++ b/src/web/request/getSyncAvatarDetail.ts @@ -0,0 +1,51 @@ +/** + * @file web request getSyncAvatarDetail.ts + * @description 获取同步角色详情相关请求函数 + * @author BTMuli + * @since Alpha v0.2.1 + */ + +// tauri +import { http } from "@tauri-apps/api"; +// api +import TGApi from "../api/TGApi"; +// utils +import TGUtils from "../utils/TGUtils"; + +/** + * @description 获取同步角色详情 + * @since Alpha v0.2.1 + * @param {Record} cookie cookie + * @param {string} uid 用户 uid + * @param {string} avatarId 角色 id + * @returns {Promise} + */ +async function getSyncAvatarDetail( + cookie: Record, + uid: string, + avatarId: string, +): Promise { + const url = TGApi.GameData.calculate.getSyncAvatarDetail; + const params = { + uid, + region: TGUtils.Tools.getServerByUid(uid), + avatar_id: avatarId, + }; + const header = { + "User-Agent": "Tauri.Genshin/0.2.1", + Referer: "https://webstatic.mihoyo.com/", + Cookie: TGUtils.Tools.transCookie(cookie), + }; + return await http + .fetch(url, { + method: "GET", + headers: header, + query: params, + }) + .then((res) => { + if (res.data.retcode !== 0) return res.data as TGApp.BBS.Response.Base; + return res.data.data as TGApp.Game.Calculate.AvatarDetail; + }); +} + +export default getSyncAvatarDetail; diff --git a/src/web/request/getSyncAvatarListAll.ts b/src/web/request/getSyncAvatarListAll.ts new file mode 100644 index 00000000..5a7d969f --- /dev/null +++ b/src/web/request/getSyncAvatarListAll.ts @@ -0,0 +1,74 @@ +/** + * @file web request getSyncAvatarListAll.ts + * @description 获取同步角色列表请求 + * @author BTMuli + * @since Alpha v0.2.1 + */ + +// tauri +import { http } from "@tauri-apps/api"; +// api +import TGApi from "../api/TGApi"; +// utils +import TGUtils from "../utils/TGUtils"; + +/** + * @description 获取同步角色列表请求 + * @since Alpha v0.2.1 + * @param {Record} cookie cookie + * @param {string} uid 用户 uid + * @param {number} page 页码 + * @return {Promise} + */ +async function getSyncAvatarList( + cookie: Record, + uid: string, + page: number, +): Promise { + const url = TGApi.GameData.calculate.getSyncAvatarList; // 获取同步角色列表请求地址 + const data = { + uid, + region: TGUtils.Tools.getServerByUid(uid), + page, + }; + const header = { + "User-Agent": "Tauri.Genshin/0.2.1", + Referer: "https://webstatic.mihoyo.com/", + Cookie: TGUtils.Tools.transCookie(cookie), + }; + return await http + .fetch(url, { + method: "POST", + body: http.Body.json(data), + headers: header, + }) + .then((res) => { + if (res.data.retcode !== 0) return res.data as TGApp.BBS.Response.Base; + return res.data.data.list as TGApp.Game.Calculate.AvatarListItem[]; + }); +} + +/** + * @description 获取同步角色列表-汇总 + * @since Alpha v0.2.1 + * @param {Record} cookie cookie + * @param {string} uid 用户 uid + * @return {Promise} + */ +async function getSyncAvatarListAll( + cookie: Record, + uid: string, +): Promise { + let page = 1; + let res = await getSyncAvatarList(cookie, uid, page); + if (!Array.isArray(res)) return res; + let list: TGApp.Game.Calculate.AvatarListItem[] = []; + while (Array.isArray(res) && res.length > 0) { + list = list.concat(res); + page++; + res = await getSyncAvatarList(cookie, uid, page); + } + return list; +} + +export default getSyncAvatarListAll; diff --git a/src/web/utils/TGUtils.ts b/src/web/utils/TGUtils.ts index 711e7d0b..d0a4f353 100644 --- a/src/web/utils/TGUtils.ts +++ b/src/web/utils/TGUtils.ts @@ -1,14 +1,14 @@ /** * @file web utils TGUtils.ts * @description 应用用到的工具函数 - * @author BTMuli - * @since Alpha v0.2.0 + * @author BTMuli + * @since Alpha v0.2.1 */ import { getAnnoCard } from "./getAnnoCard"; import { getRequestHeader, getRequestSignHeader } from "./getRequestHeader"; import { parseAnnoContent } from "./parseAnno"; -import { getServerByUid } from "./tools"; +import { getServerByUid, transCookie } from "./tools"; const TGUtils = { Anno: { @@ -21,6 +21,7 @@ const TGUtils = { }, Tools: { getServerByUid, + transCookie, }, };