mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2025-12-13 09:28:14 +08:00
@@ -8,7 +8,7 @@ import { app } from "@tauri-apps/api";
|
||||
import Database from "@tauri-apps/plugin-sql";
|
||||
|
||||
import initDataSql from "./sql/initData.js";
|
||||
import { insertAppData, insertRecordData } from "./sql/insertData.js";
|
||||
import { insertAppData } from "./sql/insertData.js";
|
||||
|
||||
class Sqlite {
|
||||
/**
|
||||
@@ -131,35 +131,6 @@ class Sqlite {
|
||||
await this.initDB();
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 保存战绩数据
|
||||
* @since Beta v0.3.3
|
||||
* @param {TGApp.Game.Record.FullData} data 战绩数据
|
||||
* @param {string} uid 用户 uid
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
public async saveUserRecord(data: TGApp.Game.Record.FullData, uid: string): Promise<void> {
|
||||
const db = await this.getDB();
|
||||
const sql = insertRecordData(data, uid);
|
||||
await db.execute(sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 获取战绩数据
|
||||
* @since Beta v0.3.3
|
||||
* @param {string} uid 用户 uid
|
||||
* @returns {Promise<TGApp.Sqlite.Record.SingleTable|false>}
|
||||
*/
|
||||
public async getUserRecord(uid: string): Promise<TGApp.Sqlite.Record.SingleTable | false> {
|
||||
const db = await this.getDB();
|
||||
const sql = `SELECT *
|
||||
FROM UserRecord
|
||||
WHERE uid = '${uid}'`;
|
||||
const res: TGApp.Sqlite.Record.SingleTable[] = await db.select(sql);
|
||||
if (res.length === 0) return false;
|
||||
return res[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 检测特定表是否存在
|
||||
* @since Beta v0.4.5
|
||||
|
||||
@@ -59,18 +59,18 @@ function getInsertSql(uid: string, data: TGApp.Game.Avatar.DetailList): string {
|
||||
*/
|
||||
async function getAllUid(): Promise<string[]> {
|
||||
const db = await TGSqlite.getDB();
|
||||
type resType = Array<{ uid: string }>;
|
||||
type resType = Array<{ uid: number }>;
|
||||
const res = await db.select<resType>("SELECT DISTINCT uid FROM UserCharacters;");
|
||||
return res.map((i) => i.uid);
|
||||
return res.map((i) => i.uid.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 获取用户角色数据
|
||||
* @since Beta v0.5.3
|
||||
* @param {string} uid 用户 uid
|
||||
* @param {number} uid 用户 uid
|
||||
* @returns {Promise<TGApp.Sqlite.Character.UserRole[]>}
|
||||
*/
|
||||
async function getAvatars(uid: string): Promise<TGApp.Sqlite.Character.UserRole[]> {
|
||||
async function getAvatars(uid: number): Promise<TGApp.Sqlite.Character.UserRole[]> {
|
||||
const db = await TGSqlite.getDB();
|
||||
type resType = Array<TGApp.Sqlite.Character.UserRoleDB>;
|
||||
const res = await db.select<resType>("SELECT * FROM UserCharacters WHERE uid = ?;", [uid]);
|
||||
|
||||
133
src/plugins/Sqlite/modules/userRecord.ts
Normal file
133
src/plugins/Sqlite/modules/userRecord.ts
Normal file
@@ -0,0 +1,133 @@
|
||||
/**
|
||||
* @file plugins/Sqlite/modules/userRecord.ts
|
||||
* @description Sqlite-用户战绩模块
|
||||
* @since Beta v0.6.0
|
||||
*/
|
||||
|
||||
import { timestampToDate } from "../../../utils/toolFunc.js";
|
||||
import TGSqlite from "../index.js";
|
||||
import { transUserRecord } from "../utils/transUserRecord.js";
|
||||
|
||||
/**
|
||||
* @description 获取插入Sql
|
||||
* @since Beta v0.6.0
|
||||
* @param {number} uid - 游戏UID
|
||||
* @param {TGApp.Sqlite.Record.SingleTable} data - 战绩数据
|
||||
* @returns {string}
|
||||
*/
|
||||
function getInsertSql(uid: number, data: TGApp.Sqlite.Record.SingleTable): string {
|
||||
return `
|
||||
INSERT INTO UserRecord(uid, role, avatars, stats, worldExplore, homes, updated)
|
||||
VALUES (${uid}, '${data.role}', '${data.avatars}', '${data.stats}',
|
||||
'${data.worldExplore}', '${data.homes}', '${data.updated}')
|
||||
ON CONFLICT(uid) DO UPDATE
|
||||
SET role = '${data.role}',
|
||||
avatars = '${data.avatars}',
|
||||
stats = '${data.stats}',
|
||||
worldExplore = '${data.worldExplore}',
|
||||
homes = '${data.homes}',
|
||||
updated = '${data.updated}';
|
||||
`;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 解析数据库数据
|
||||
* @since Beta v0.6.0
|
||||
* @param {TGApp.Sqlite.Record.SingleTable} data - 数据库数据
|
||||
* @returns {TGApp.Sqlite.Record.RenderData} 渲染数据
|
||||
*/
|
||||
function parseRecord(data: TGApp.Sqlite.Record.SingleTable): TGApp.Sqlite.Record.RenderData {
|
||||
return {
|
||||
uid: data.uid,
|
||||
role: JSON.parse(data.role),
|
||||
avatars: JSON.parse(data.avatars),
|
||||
stats: JSON.parse(data.stats),
|
||||
worldExplore: JSON.parse(data.worldExplore),
|
||||
homes: JSON.parse(data.homes),
|
||||
updated: data.updated,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 转换数据库数据
|
||||
* @since Beta v0.6.0
|
||||
* @param {number} uid - 游戏UID
|
||||
* @param {TGApp.Game.Record.FullData} data - 战绩数据
|
||||
* @returns {TGApp.Sqlite.Record.SingleTable}
|
||||
*/
|
||||
function transRecord(
|
||||
uid: number,
|
||||
data: TGApp.Game.Record.FullData,
|
||||
): TGApp.Sqlite.Record.SingleTable {
|
||||
const transData = transUserRecord(uid, data);
|
||||
return {
|
||||
uid: uid,
|
||||
role: JSON.stringify(transData.role),
|
||||
avatars: JSON.stringify(transData.avatars),
|
||||
stats: JSON.stringify(transData.stats),
|
||||
worldExplore: JSON.stringify(transData.worldExplore),
|
||||
homes: JSON.stringify(transData.homes),
|
||||
updated: timestampToDate(new Date().getTime()),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 获取UID列表
|
||||
* @since Beta v0.6.0
|
||||
* @returns {Promise<number[]>}
|
||||
*/
|
||||
async function getAllUid(): Promise<number[]> {
|
||||
const db = await TGSqlite.getDB();
|
||||
type resType = Array<{ uid: number }>;
|
||||
const res = await db.select<resType>("SELECT DISTINCT uid FROM UserRecord;");
|
||||
return res.map((e) => e.uid);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 获取指定UID的战绩数据
|
||||
* @since Beta v0.6.0
|
||||
* @param {number} uid - 游戏UID
|
||||
* @returns {Promise<TGApp.Sqlite.Record.RenderData | false>}
|
||||
*/
|
||||
async function getRecord(uid: number): Promise<TGApp.Sqlite.Record.RenderData | false> {
|
||||
const db = await TGSqlite.getDB();
|
||||
const res = await db.select<TGApp.Sqlite.Record.SingleTable[]>(
|
||||
"SELECT * FROM UserRecord WHERE uid = ?;",
|
||||
[uid],
|
||||
);
|
||||
if (res.length === 0) return false;
|
||||
return parseRecord(res[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 保存战绩数据
|
||||
* @since Beta v0.6.0
|
||||
* @param {number} uid - 游戏UID
|
||||
* @param {TGApp.Game.Record.FullData} data - 战绩数据
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async function saveRecord(uid: number, data: TGApp.Game.Record.FullData): Promise<void> {
|
||||
const db = await TGSqlite.getDB();
|
||||
const sql = getInsertSql(uid, transRecord(uid, data));
|
||||
await db.execute(sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 删除战绩数据
|
||||
* @since Beta v0.6.0
|
||||
* @param {number} uid
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async function deleteUid(uid: number): Promise<void> {
|
||||
const db = await TGSqlite.getDB();
|
||||
await db.execute("DELETE FROM UserRecord WHERE uid=?;", [uid]);
|
||||
}
|
||||
|
||||
const TSUserRecord = {
|
||||
getAllUid,
|
||||
getRecord,
|
||||
saveRecord,
|
||||
deleteUid,
|
||||
};
|
||||
|
||||
export default TSUserRecord;
|
||||
@@ -4,9 +4,6 @@
|
||||
* @since Beta v0.6.0
|
||||
*/
|
||||
|
||||
import { timestampToDate } from "../../../utils/toolFunc.js";
|
||||
import { transUserRecord } from "../utils/transUserRecord.js";
|
||||
|
||||
/**
|
||||
* @description 插入应用数据
|
||||
* @since Alpha v0.2.0
|
||||
@@ -22,28 +19,3 @@ export function insertAppData(key: string, value: string): string {
|
||||
updated = datetime('now', 'localtime');
|
||||
`;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 插入原神战绩数据
|
||||
* @since Beta v0.6.0
|
||||
* @param {TGApp.Game.Record.FullData} data 原神战绩数据
|
||||
* @param {string} uid 用户 UID
|
||||
* @returns {string} sql
|
||||
*/
|
||||
export function insertRecordData(data: TGApp.Game.Record.FullData, uid: string): string {
|
||||
const transData = transUserRecord(data);
|
||||
const timeNow = timestampToDate(new Date().getTime());
|
||||
transData.uid = uid;
|
||||
return `
|
||||
INSERT INTO UserRecord(uid, role, avatars, stats, worldExplore, homes, updated)
|
||||
VALUES ('${transData.uid}', '${transData.role}', '${transData.avatars}', '${transData.stats}',
|
||||
'${transData.worldExplore}', '${transData.homes}', '${timeNow}')
|
||||
ON CONFLICT(uid) DO UPDATE
|
||||
SET role = '${transData.role}',
|
||||
avatars = '${transData.avatars}',
|
||||
stats = '${transData.stats}',
|
||||
worldExplore = '${transData.worldExplore}',
|
||||
homes = '${transData.homes}',
|
||||
updated = '${timeNow}';
|
||||
`;
|
||||
}
|
||||
|
||||
@@ -1,49 +1,53 @@
|
||||
/**
|
||||
* @file plugins/Sqlite/utils/transUserRecord.ts
|
||||
* @description Sqlite 数据转换 用户战绩数据转换模块
|
||||
* @since Beta v0.5.5
|
||||
* @since Beta v0.6.0
|
||||
*/
|
||||
|
||||
/**
|
||||
* @description 将通过 api 获取到的用户战绩数据转换为数据库中的数据
|
||||
* @since Beta v0.4.3
|
||||
* @description 将通过 api 获取到的用户战绩数据转换为渲染用的数据
|
||||
* @since Beta v0.6.0
|
||||
* @param {number} uid - 用户UID
|
||||
* @param {TGApp.Game.Record.FullData} data 用户战绩数据
|
||||
* @returns {TGApp.Sqlite.Record.SingleTable} 转换后的用户战绩数据
|
||||
* @returns {TGApp.Sqlite.Record.RenderData} 转换后的用户战绩数据
|
||||
*/
|
||||
export function transUserRecord(data: TGApp.Game.Record.FullData): TGApp.Sqlite.Record.SingleTable {
|
||||
export function transUserRecord(
|
||||
uid: number,
|
||||
data: TGApp.Game.Record.FullData,
|
||||
): TGApp.Sqlite.Record.RenderData {
|
||||
return {
|
||||
uid: "",
|
||||
uid: uid,
|
||||
role: transRole(data.role),
|
||||
avatars: transAvatar(data.avatars),
|
||||
avatars: data.avatars.map(transAvatar).sort((a, b) => b.star - a.star || b.id - a.id),
|
||||
stats: transStat(data.stats),
|
||||
worldExplore: JSON.stringify(transWorld(data.world_explorations)),
|
||||
homes: transHome(data.homes),
|
||||
worldExplore: transWorld(data.world_explorations),
|
||||
homes: data.homes.map(transHome),
|
||||
updated: "",
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 将角色信息转换为数据库中的数据
|
||||
* @since Alpha v0.2.0
|
||||
* @since Beta v0.6.0
|
||||
* @param {TGApp.Game.Record.Role} data 角色信息
|
||||
* @returns {string} 转换后的角色信息
|
||||
* @returns {TGApp.Sqlite.Record.Role} 转换后的角色信息
|
||||
*/
|
||||
function transRole(data: TGApp.Game.Record.Role): string {
|
||||
const role: TGApp.Sqlite.Record.Role = {
|
||||
function transRole(data: TGApp.Game.Record.Role): TGApp.Sqlite.Record.Role {
|
||||
return {
|
||||
nickname: data.nickname,
|
||||
region: data.region,
|
||||
level: data.level,
|
||||
avatar: data.game_head_icon,
|
||||
};
|
||||
return JSON.stringify(role);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 将角色列表转换为数据库中的数据
|
||||
* @since Alpha v0.2.0
|
||||
* @param {TGApp.Game.Record.Avatar[]} data 角色列表
|
||||
* @returns {string} 转换后的角色列表
|
||||
* @since Beta v0.6.0
|
||||
* @param {TGApp.Game.Record.Avatar} data 角色列表
|
||||
* @returns {TGApp.Sqlite.Record.Avatar} 转换后的角色列表
|
||||
*/
|
||||
function transAvatar(data: TGApp.Game.Record.Avatar[]): string {
|
||||
function transAvatar(data: TGApp.Game.Record.Avatar): TGApp.Sqlite.Record.Avatar {
|
||||
const elementMap: Record<string, string> = {
|
||||
Anemo: "风",
|
||||
Geo: "岩",
|
||||
@@ -53,44 +57,26 @@ function transAvatar(data: TGApp.Game.Record.Avatar[]): string {
|
||||
Cryo: "冰",
|
||||
Dendro: "草",
|
||||
};
|
||||
const avatars: TGApp.Sqlite.Record.Avatar[] = data
|
||||
.map((item) => {
|
||||
return {
|
||||
id: item.id,
|
||||
name: item.name,
|
||||
element: elementMap[item.element],
|
||||
fetter: item.fetter,
|
||||
level: item.level,
|
||||
star: item.rarity === 105 ? 5 : item.rarity,
|
||||
constellation: item.actived_constellation_num,
|
||||
isShow: item.is_chosen ? <const>1 : <const>0,
|
||||
};
|
||||
})
|
||||
.sort((a, b) => {
|
||||
// 先按星级降序
|
||||
if (a.star !== b.star) {
|
||||
return b.star - a.star;
|
||||
}
|
||||
// 再按 id 降序
|
||||
return b.id - a.id;
|
||||
});
|
||||
return JSON.stringify(avatars);
|
||||
return {
|
||||
id: data.id,
|
||||
name: data.name,
|
||||
element: elementMap[data.element],
|
||||
fetter: data.fetter,
|
||||
level: data.level,
|
||||
star: data.rarity === 105 ? 5 : data.rarity,
|
||||
constellation: data.actived_constellation_num,
|
||||
isShow: data.is_chosen ? 1 : 0,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 将统计信息转换为数据库中的数据
|
||||
* @since Beta v0.5.5
|
||||
* @since Beta v0.6.0
|
||||
* @param {TGApp.Game.Record.Stats} data 统计信息
|
||||
* @return {string} 转换后的统计信息
|
||||
* @return {TGApp.Sqlite.Record.Stats } 转换后的统计信息
|
||||
*/
|
||||
function transStat(data: TGApp.Game.Record.Stats): string {
|
||||
let combatRole: string;
|
||||
if (!data.role_combat.is_unlock) {
|
||||
combatRole = "未解锁";
|
||||
} else {
|
||||
combatRole = `第 ${data.role_combat.max_round_id} 幕`;
|
||||
}
|
||||
const stats: TGApp.Sqlite.Record.Stats = {
|
||||
function transStat(data: TGApp.Game.Record.Stats): TGApp.Sqlite.Record.Stats {
|
||||
return {
|
||||
activeDays: data.active_day_number,
|
||||
achievementNumber: data.achievement_number,
|
||||
avatarNumber: data.avatar_number,
|
||||
@@ -104,14 +90,13 @@ function transStat(data: TGApp.Game.Record.Stats): string {
|
||||
hydroCulus: data.hydroculus_number,
|
||||
pyroCulus: data.pyroculus_number,
|
||||
sprialAbyss: data.spiral_abyss,
|
||||
combatRole: combatRole,
|
||||
combatRole: data.role_combat.is_unlock ? `第 ${data.role_combat.max_round_id} 幕` : "未解锁",
|
||||
luxuriousChest: data.luxurious_chest_number,
|
||||
preciousChest: data.precious_chest_number,
|
||||
exquisiteChest: data.exquisite_chest_number,
|
||||
commonChest: data.common_chest_number,
|
||||
magicChest: data.magic_chest_number,
|
||||
};
|
||||
return JSON.stringify(stats);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -170,22 +155,19 @@ function transWorld(data: TGApp.Game.Record.WorldExplore[]): TGApp.Sqlite.Record
|
||||
|
||||
/**
|
||||
* @description 将住宅信息转换为数据库中的数据
|
||||
* @since Alpha v0.2.0
|
||||
* @param {TGApp.Game.Record.Home[]} data 住宅信息
|
||||
* @returns {string} 转换后的住宅信息
|
||||
* @since Beta v0.6.0
|
||||
* @param {TGApp.Game.Record.Home} data 住宅信息
|
||||
* @returns {TGApp.Sqlite.Record.Home} 转换后的住宅信息
|
||||
*/
|
||||
function transHome(data: TGApp.Game.Record.Home[]): string {
|
||||
const homes: TGApp.Sqlite.Record.Home[] = data.map((item) => {
|
||||
return {
|
||||
comfortIcon: item.comfort_level_icon,
|
||||
comfortName: item.comfort_level_name,
|
||||
name: item.name,
|
||||
level: item.level,
|
||||
comfort: item.comfort_num,
|
||||
furniture: item.item_num,
|
||||
visit: item.visit_num,
|
||||
bg: item.icon,
|
||||
};
|
||||
});
|
||||
return JSON.stringify(homes);
|
||||
function transHome(data: TGApp.Game.Record.Home): TGApp.Sqlite.Record.Home {
|
||||
return {
|
||||
comfortIcon: data.comfort_level_icon,
|
||||
comfortName: data.comfort_level_name,
|
||||
name: data.name,
|
||||
level: data.level,
|
||||
comfort: data.comfort_num,
|
||||
furniture: data.item_num,
|
||||
visit: data.visit_num,
|
||||
bg: data.icon,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user