🎨 规范化代码

This commit is contained in:
BTMuli
2025-12-24 02:46:28 +08:00
parent 8500668213
commit 651a89145f
199 changed files with 5067 additions and 5390 deletions

View File

@@ -8,7 +8,6 @@ import Database from "@tauri-apps/plugin-sql";
import TGLogger from "@utils/TGLogger.js";
import initDataSql from "./sql/initData.js";
import { insertAppData } from "./sql/insertData.js";
class Sqlite {
private readonly dbPath: string = "sqlite:TeyvatGuide.db";
@@ -37,12 +36,10 @@ class Sqlite {
return this.instance;
}
private constructor() {}
/**
* 获取数据库实例
* @since Beta v0.3.3
* @returns {Promise<Database>}
* @returns 数据库实例
*/
public async getDB(): Promise<Database> {
if (this.db === null) this.db = await Database.load(this.dbPath);
@@ -52,7 +49,7 @@ class Sqlite {
/**
* 检测是否需要创建数据库
* @since Beta v0.6.1
* @returns {Promise<boolean>}
* @returns 是否需要创建数据库
*/
public async check(): Promise<boolean> {
try {
@@ -73,7 +70,7 @@ class Sqlite {
/**
* 初始化数据库
* @since Beta v0.4.5
* @returns {Promise<void>}
* @returns 无返回值
*/
public async initDB(): Promise<void> {
const db = await this.getDB();
@@ -84,9 +81,10 @@ class Sqlite {
/**
* 获取数据库信息
* @since Beta v0.3.3
* @returns {Promise<TGApp.Sqlite.AppData.Item[]>}
* @TODO 简化或者完善类型
* @returns AppData表数据
*/
public async getAppData(): Promise<TGApp.Sqlite.AppData.Item[]> {
public async getAppData(): Promise<Array<TGApp.Sqlite.AppData.Item>> {
const db = await this.getDB();
const sql = "SELECT * FROM AppData;";
return await db.select(sql);
@@ -95,7 +93,7 @@ class Sqlite {
/**
* 对比数据判断是否需要更新
* @since Beta v0.3.3
* @returns {Promise<boolean>}
* @returns 是否需要更新
*/
public async checkUpdate(): Promise<boolean> {
const dbData = await this.getAppData();
@@ -105,23 +103,39 @@ class Sqlite {
return localVersion !== dbVersion;
}
/**
* 插入应用数据
* @since Alpha v0.2.0
* @param key - 键
* @param value - 值
* @returns sql
*/
insertAppData(key: string, value: string): string {
return `
INSERT INTO AppData (key, value, updated)
VALUES ('${key}', '${value}', datetime('now', 'localtime'))
ON CONFLICT(key) DO UPDATE SET value = '${value}',
updated = datetime('now', 'localtime');
`;
}
/**
* 保存 appData
* @since Beta v0.3.3
* @param {string} key
* @param {string} value
* @returns {Promise<void>}
* @param key - 键
* @param value - 值
* @returns 无返回值
*/
public async saveAppData(key: string, value: string): Promise<void> {
const db = await this.getDB();
const sql = insertAppData(key, value);
const sql = this.insertAppData(key, value);
await db.execute(sql);
}
/**
* 已有数据表跟触发器不变的情况下,更新数据库数据
* @since Beta v0.3.3
* @returns {Promise<void>}
* @returns 无返回值
*/
public async update(): Promise<void> {
const db = await this.getDB();
@@ -134,7 +148,7 @@ class Sqlite {
/**
* 更新 SpiralAbyss 表
* @since Beta v0.6.1
* @returns {Promise<void>}
* @returns 无返回值
*/
public async updateAbyss(): Promise<void> {
const db = await this.getDB();
@@ -150,7 +164,7 @@ class Sqlite {
/**
* 重置数据库
* @since Beta v0.4.0
* @returns {Promise<void>}
* @returns 无返回值
*/
public async reset(): Promise<void> {
const db = await this.getDB();

View File

@@ -1,6 +1,5 @@
/**
* @file plugins/Sqlite/modules/avatarBirth.ts
* @description 角色生日模块
* 角色生日模块
* @since Beta v0.8.0
*/
@@ -12,11 +11,11 @@ import {
} from "@/data/index.js";
/**
* @description 判断今天是不是角色生日
* 判断今天是不是角色生日
* @since Beta v0.4.6
* @return {TGApp.Archive.Birth.CalendarItem[]} 角色生日
* @returns 角色生日
*/
function isAvatarBirth(): TGApp.Archive.Birth.CalendarItem[] {
function isAvatarBirth(): Array<TGApp.Archive.Birth.CalendarItem> {
const date = new Date();
const month = date.getMonth() + 1;
const day = date.getDate();
@@ -37,20 +36,20 @@ function isAvatarBirth(): TGApp.Archive.Birth.CalendarItem[] {
}
/**
* @description 校验是否是闰年
* 校验是否是闰年
* @since Beta v0.4.6
* @param {number} year - 年份
* @return {boolean} 是否是闰年
* @param year - 年份
* @returns 是否是闰年
*/
function isLeapYear(year: number): boolean {
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
}
/**
* @description 获取下一个角色生日
* 获取下一个角色生日
* @since Beta v0.7.0
* @param {[number,number]} date - 日期
* @return {TGApp.Archive.Birth.RoleItem[]} 下一个角色生日
* @param date - 日期
* @returns 下一个角色生日
*/
async function getNextAvatarBirth(
date?: [number, number],
@@ -79,7 +78,7 @@ async function getNextAvatarBirth(
const dataGet = AppCharacterData.filter(
(i) => i.birthday.toString() === birthGet.birthday.toString(),
);
const res: TGApp.Archive.Birth.RoleItem[] = [];
const res: Array<TGApp.Archive.Birth.RoleItem> = [];
for (const i of dataGet) {
const find = ArcBirRole.find((j) => j.role_id === i.id);
if (find) {

View File

@@ -12,12 +12,12 @@ import TGSqlite from "../index.js";
import { transCharacterData, transFloorData } from "../utils/transAbyssData.js";
/**
* @description 直接插入数据
* 直接插入数据
* @since Beta v0.6.8
* @param {TGApp.Sqlite.Abyss.TableRaw} tableData - 数据
* @returns {string}
* @param tableData - 数据
* @returns sql
*/
function getRestoreSql(tableData: TGApp.Sqlite.Abyss.TableData): string {
function getRestoreSql(tableData: TGApp.Sqlite.Abyss.TableTrans): string {
const data = data2Raw(tableData);
const timeNow = timestampToDate(new Date().getTime());
return `
@@ -51,9 +51,9 @@ function getRestoreSql(tableData: TGApp.Sqlite.Abyss.TableData): string {
/**
* 获取深渊数据的插入更新Sql
* @since Beta v0.8.6
* @param {string} uid - 用户UID
* @param {TGApp.Game.Abyss.FullData} data -深渊数据
* @returns {string}
* @param uid - 用户UID
* @param data -深渊数据
* @returns sql
*/
function getInsertSql(uid: string, data: TGApp.Game.Abyss.FullData): string {
const startTime = timestampToDate(Number(data.start_time) * 1000);
@@ -97,12 +97,12 @@ function getInsertSql(uid: string, data: TGApp.Game.Abyss.FullData): string {
}
/**
* @description 原始数据转table数据
* 原始数据转table数据
* @since Beta v0.6.1
* @param {TGApp.Sqlite.Abyss.TableRaw} data - 原始数据
* @returns {TGApp.Sqlite.Abyss.TableData}
* @param data - 原始数据
* @returns 转换后的数据
*/
function raw2Data(data: TGApp.Sqlite.Abyss.TableRaw): TGApp.Sqlite.Abyss.TableData {
function raw2Data(data: TGApp.Sqlite.Abyss.TableRaw): TGApp.Sqlite.Abyss.TableTrans {
return {
uid: data.uid,
id: data.id,
@@ -126,12 +126,12 @@ function raw2Data(data: TGApp.Sqlite.Abyss.TableRaw): TGApp.Sqlite.Abyss.TableDa
}
/**
* @description data数据转table数据
* data数据转table数据
* @since Beta v0.6.8
* @param {TGApp.Sqlite.Abyss.TableData} data - 原始数据
* @returns {TGApp.Sqlite.Abyss.TableRaw}
* @param data - 原始数据
* @returns table数据
*/
function data2Raw(data: TGApp.Sqlite.Abyss.TableData): TGApp.Sqlite.Abyss.TableRaw {
function data2Raw(data: TGApp.Sqlite.Abyss.TableTrans): TGApp.Sqlite.Abyss.TableRaw {
return {
uid: data.uid,
id: data.id,
@@ -155,9 +155,9 @@ function data2Raw(data: TGApp.Sqlite.Abyss.TableData): TGApp.Sqlite.Abyss.TableR
}
/**
* @description 获取所有有数据的UID
* 获取所有有数据的UID
* @since Beta v0.6.0
* @returns {Promise<void>}
* @returns uid列表
*/
async function getAllUid(): Promise<Array<string>> {
const db = await TGSqlite.getDB();
@@ -167,20 +167,20 @@ async function getAllUid(): Promise<Array<string>> {
}
/**
* @description 获取深渊数据
* 获取深渊数据
* @since Beta v0.6.3
* @param {string} uid - 游戏UID
* @returns {Promise<TGApp.Sqlite.Abyss.TableRaw[]>}
* @param uid - 游戏UID
* @returns 深渊数据
*/
async function getAbyss(uid?: string): Promise<TGApp.Sqlite.Abyss.TableData[]> {
async function getAbyss(uid?: string): Promise<Array<TGApp.Sqlite.Abyss.TableTrans>> {
const db = await TGSqlite.getDB();
let res: TGApp.Sqlite.Abyss.TableRaw[];
let res: Array<TGApp.Sqlite.Abyss.TableRaw>;
if (uid === undefined) {
res = await db.select<TGApp.Sqlite.Abyss.TableRaw[]>(
res = await db.select<Array<TGApp.Sqlite.Abyss.TableRaw>>(
"SELECT * FROM SpiralAbyss order by id DESC;",
);
} else {
res = await db.select<TGApp.Sqlite.Abyss.TableRaw[]>(
res = await db.select<Array<TGApp.Sqlite.Abyss.TableRaw>>(
"SELECT * FROM SpiralAbyss WHERE uid = ? order by id DESC;",
[uid],
);
@@ -189,11 +189,11 @@ async function getAbyss(uid?: string): Promise<TGApp.Sqlite.Abyss.TableData[]> {
}
/**
* @description 保存深渊数据
* 保存深渊数据
* @since Beta v0.6.0
* @param {string} uid - 游戏UID
* @param {TGApp.Game.Abyss.FullData} data - 深渊数据
* @returns {Promise<void>}
* @param uid - 游戏UID
* @param data - 深渊数据
* @returns 无返回值
*/
async function saveAbyss(uid: string, data: TGApp.Game.Abyss.FullData): Promise<void> {
const db = await TGSqlite.getDB();
@@ -201,10 +201,10 @@ async function saveAbyss(uid: string, data: TGApp.Game.Abyss.FullData): Promise<
}
/**
* @description 删除指定UID存档的数据
* 删除指定UID存档的数据
* @since Beta v0.6.0
* @param {string} uid - 游戏UID
* @returns {Promise<void>}
* @param uid - 游戏UID
* @returns 无返回值
*/
async function delAbyss(uid: string): Promise<void> {
const db = await TGSqlite.getDB();
@@ -212,10 +212,10 @@ async function delAbyss(uid: string): Promise<void> {
}
/**
* @description 备份深渊数据
* 备份深渊数据
* @since Beta v0.6.0
* @param {string} dir - 备份目录
* @returns {Promise<void>}
* @param dir - 备份目录
* @returns 无返回值
*/
async function backupAbyss(dir: string): Promise<void> {
if (!(await exists(dir))) {
@@ -227,16 +227,16 @@ async function backupAbyss(dir: string): Promise<void> {
}
/**
* @description 恢复深渊数据
* 恢复深渊数据
* @since Beta v0.6.8
* @param {string} dir - 备份文件目录
* @returns {Promise<boolean>}
* @param dir - 备份文件目录
* @returns 是否恢复成功
*/
async function restoreAbyss(dir: string): Promise<boolean> {
const filePath = `${dir}${path.sep()}abyss.json`;
if (!(await exists(filePath))) return false;
try {
const data: TGApp.Sqlite.Abyss.TableData[] = JSON.parse(await readTextFile(filePath));
const data: Array<TGApp.Sqlite.Abyss.TableTrans> = JSON.parse(await readTextFile(filePath));
const db = await TGSqlite.getDB();
for (const abyss of data) {
await db.execute(getRestoreSql(abyss));

View File

@@ -11,11 +11,11 @@ import { timestampToDate } from "@utils/toolFunc.js";
import TGSqlite from "../index.js";
/**
* @description 获取插入游戏账号数据的sql
* 获取插入游戏账号数据的sql
* @since Beta v0.7.2
* @param {string} uid - 米社UID
* @param {TGApp.BBS.Game.Account} data - 游戏账号数据
* @return {string}
* @param uid - 米社UID
* @param data - 游戏账号数据
* @returns 插入Sql
*/
function getInsertGameAccountSql(uid: string, data: TGApp.BBS.Game.Account): string {
const isChosen = data.is_chosen ? 1 : 0;
@@ -38,10 +38,10 @@ function getInsertGameAccountSql(uid: string, data: TGApp.BBS.Game.Account): str
}
/**
* @description 获取插入账号数据的 sql
* 获取插入账号数据的 sql
* @since Beta v0.6.1
* @param {TGApp.App.Account.User} user
* @returns {string}
* @param user - 账号
* @returns 插入Sql
*/
function getInsertAccountSql(user: TGApp.App.Account.User): string {
const table = transUser(user);
@@ -56,10 +56,10 @@ function getInsertAccountSql(user: TGApp.App.Account.User): string {
}
/**
* @description 数据库转成可用数据
* 数据库转成可用数据
* @since Beta v0.6.0
* @param {TGApp.Sqlite.Account.User} data - 用户数据
* @returns {TGApp.App.Account.User}
* @param data - 用户数据
* @returns 解析后的数据
*/
function parseUser(data: TGApp.Sqlite.Account.User): TGApp.App.Account.User {
return {
@@ -71,10 +71,10 @@ function parseUser(data: TGApp.Sqlite.Account.User): TGApp.App.Account.User {
}
/**
* @description 转成数据库数据方便存储
* 转成数据库数据方便存储
* @since Beta v0.6.0
* @param {TGApp.App.Account.User} data - 用户数据
* @returns {TGApp.Sqlite.Account.User}
* @param data - 用户数据
* @returns 数据库存储数据
*/
function transUser(data: TGApp.App.Account.User): TGApp.Sqlite.Account.User {
return {
@@ -86,22 +86,22 @@ function transUser(data: TGApp.App.Account.User): TGApp.Sqlite.Account.User {
}
/**
* @description 获取所有用户数据
* 获取所有用户数据
* @since Beta v0.6.0
* @returns {Promise<TGApp.App.Account.User[]>}
* @returns 用户数据列表
*/
async function getAllAccount(): Promise<TGApp.App.Account.User[]> {
async function getAllAccount(): Promise<Array<TGApp.App.Account.User>> {
const db = await TGSqlite.getDB();
const res = await db.select<TGApp.Sqlite.Account.User[]>("SELECT * FROM UserAccount;");
const res = await db.select<Array<TGApp.Sqlite.Account.User>>("SELECT * FROM UserAccount;");
return res.map(parseUser);
}
/**
* @description 获取所有UID
* 获取所有UID
* @since Beta v0.6.0
* @returns {Promise<string[]>}
* @returns uid 列表
*/
async function getAllAccountId(): Promise<string[]> {
async function getAllAccountId(): Promise<Array<string>> {
const db = await TGSqlite.getDB();
type resType = Array<{ uid: string }>;
const res = await db.select<resType>("SELECT DISTINCT uid FROM GameAccount;");
@@ -109,14 +109,14 @@ async function getAllAccountId(): Promise<string[]> {
}
/**
* @description 获取指定用户数据
* 获取指定用户数据
* @since Beta v0.6.0
* @param {string} uid - 用户UID
* @returns {Promise<TGApp.App.Account.User|false>}
* @param uid - 用户UID
* @returns 用户数据
*/
async function getUserAccount(uid: string): Promise<TGApp.App.Account.User | false> {
const db = await TGSqlite.getDB();
const res = await db.select<TGApp.Sqlite.Account.User[]>(
const res = await db.select<Array<TGApp.Sqlite.Account.User>>(
"SELECT * FROM UserAccount WHERE uid = ?",
[uid],
);
@@ -125,10 +125,10 @@ async function getUserAccount(uid: string): Promise<TGApp.App.Account.User | fal
}
/**
* @description 更新用户数据
* 更新用户数据
* @since Beta v0.6.1
* @param {TGApp.App.Account.User} data - 用户cookie
* @returns {Promise<void>}
* @param data - 用户cookie
* @returns 无返回值
*/
async function saveAccount(data: TGApp.App.Account.User): Promise<void> {
const db = await TGSqlite.getDB();
@@ -137,10 +137,10 @@ async function saveAccount(data: TGApp.App.Account.User): Promise<void> {
}
/**
* @description 备份用户数据
* 备份用户数据
* @since Beta v0.6.0
* @param {string} dir - 备份目录
* @returns {Promise<void>}
* @param dir - 备份目录
* @returns 无返回值
*/
async function backUpAccount(dir: string): Promise<void> {
if (!(await exists(dir))) {
@@ -153,10 +153,10 @@ async function backUpAccount(dir: string): Promise<void> {
}
/**
* @description 恢复用户数据
* 恢复用户数据
* @since Beta v0.6.0
* @param {string} dir
* @returns {Promise<boolean>}
* @param dir - 恢复目录
* @returns 是否恢复成功
*/
async function restoreAccount(dir: string): Promise<boolean> {
if (!(await exists(dir))) {
@@ -170,7 +170,7 @@ async function restoreAccount(dir: string): Promise<boolean> {
return false;
}
const data = await readTextFile(filePath);
const accounts: TGApp.App.Account.User[] = JSON.parse(data);
const accounts: Array<TGApp.App.Account.User> = JSON.parse(data);
for (const account of accounts) {
await saveAccount(account);
}
@@ -182,10 +182,10 @@ async function restoreAccount(dir: string): Promise<boolean> {
}
/**
* @description 复制cookie
* 复制cookie
* @since Beta v0.6.0
* @param {TGApp.App.Account.Cookie} cookie - cookie
* @return {string}
* @param cookie - cookie
* @returns ck
*/
function copyCookie(cookie: TGApp.App.Account.Cookie): string {
let res = "";
@@ -216,8 +216,8 @@ function copyCookie(cookie: TGApp.App.Account.Cookie): string {
/**
* 获取指定用户账号
* @since Beta v0.9.0
* @param {string} uid - 用户UID
* @returns {Promise<Array<TGApp.Sqlite.Account.Game>>}
* @param uid - 用户UID
* @returns 用户账号
*/
async function getGameAccount(uid: string): Promise<Array<TGApp.Sqlite.Account.Game>> {
const db = await TGSqlite.getDB();
@@ -228,11 +228,11 @@ async function getGameAccount(uid: string): Promise<Array<TGApp.Sqlite.Account.G
}
/**
* @description 切换到指定游戏账号
* 切换到指定游戏账号
* @since Beta v0.6.0
* @param {string} uid - 米社UID
* @param {string} gameUid - 游戏UID
* @returns {Promise<void>}
* @param uid - 米社UID
* @param gameUid - 游戏UID
* @returns 无返回值
*/
async function switchGameAccount(uid: string, gameUid: string): Promise<void> {
const db = await TGSqlite.getDB();
@@ -248,10 +248,10 @@ async function switchGameAccount(uid: string, gameUid: string): Promise<void> {
}
/**
* @description 获取最近的游戏账户
* 获取最近的游戏账户
* @since Beta v0.7.8
* @param {string} uid - 米社UID
* @return {Promise<TGApp.Sqlite.Account.Game|false>}
* @param uid - 米社UID
* @returns 游戏账户
*/
async function getCurGameAccount(uid: string): Promise<TGApp.Sqlite.Account.Game | false> {
const gameAccounts = await getGameAccount(uid);
@@ -264,11 +264,11 @@ async function getCurGameAccount(uid: string): Promise<TGApp.Sqlite.Account.Game
}
/**
* @description 保存游戏账户数据
* 保存游戏账户数据
* @since Beta v0.7.2
* @param {string} uid - 米社UID
* @param {Array<TGApp.BBS.Game.Account>} accounts - 账户数据
* @return {Promise<void>}
* @param uid - 米社UID
* @param accounts - 账户数据
* @returns 无返回值
*/
async function saveGameAccount(
uid: string,
@@ -279,10 +279,10 @@ async function saveGameAccount(
}
/**
* @description 删除指定游戏账户
* 删除指定游戏账户
* @since Beta v0.7.2
* @param {TGApp.Sqlite.Account.Game} account - 游戏账户
* @return {Promise<void>}
* @param account - 游戏账户
* @returns 无返回值
*/
async function deleteGameAccount(account: TGApp.Sqlite.Account.Game): Promise<void> {
const db = await TGSqlite.getDB();
@@ -294,10 +294,10 @@ async function deleteGameAccount(account: TGApp.Sqlite.Account.Game): Promise<vo
}
/**
* @description 删除游戏账户数据
* 删除游戏账户数据
* @since Beta v0.6.0
* @param {string} uid - 米社UID
* @returns {Promise<void>}
* @param uid - 米社UID
* @returns 无返回值
*/
async function deleteAccount(uid: string): Promise<void> {
const db = await TGSqlite.getDB();

View File

@@ -16,9 +16,9 @@ import { AppAchievementsData, AppAchievementSeriesData } from "@/data/index.js";
/**
* 根据 completed 跟 progress 获取 status
* @since Beta v0.9.0
* @param {boolean} completed - 是否完成
* @param {number} progress - 进度
* @returns {number} status
* @param completed - 是否完成
* @param progress - 进度
* @returns 完成状态
*/
function getUiafStatus(completed: boolean, progress: number): TGApp.Plugins.UIAF.AchiItemStatEnum {
if (!completed) return UiafAchiStatEnum.Unfinished;
@@ -28,9 +28,9 @@ function getUiafStatus(completed: boolean, progress: number): TGApp.Plugins.UIAF
}
/**
* @description 获取最新成就版本
* 获取最新成就版本
* @since Beta v0.6.0
* @returns {string} 最新成就版本
* @returns 最新成就版本
*/
function getLatestAchiVersion(): string {
let maxVersion = "0";
@@ -41,22 +41,22 @@ function getLatestAchiVersion(): string {
}
/**
* @description 获取成就系列概况
* 获取成就概况
* @since Beta v0.6.0
* @param {number} uid - 存档UID
* @param {[number]} series - 系列ID
* @returns {Promise<TGApp.Sqlite.Achievement.Overview>}
* @param uid - 存档UID
* @param series - 系列ID
* @remarks series 为可选参数
* - 当传入 series 时,统计该系列成就
* - 否则,统计全部成就
* @returns 成就概况
*/
async function getOverview(
uid: number,
series?: number,
): Promise<TGApp.Sqlite.Achievement.Overview> {
async function getOverview(uid: number, series?: number): Promise<TGApp.App.Achievement.Overview> {
const db = await TGSqlite.getDB();
let totalAchi: number[] = [];
let totalAchi: Array<number> = [];
if (series === undefined) totalAchi = AppAchievementsData.map((i) => i.id);
else totalAchi = AppAchievementsData.filter((s) => s.series === series).map((i) => i.id);
const finAchi = (
await db.select<TGApp.Sqlite.Achievement.TableAchi[]>(
await db.select<Array<TGApp.Sqlite.Achievement.TableRaw>>(
"SELECT * FROM Achievements WHERE uid = ? AND isCompleted = 1;",
[uid],
)
@@ -65,19 +65,19 @@ async function getOverview(
}
/**
* @description 合并成就数据
* 合并成就数据
* @since Beta v0.6.0
* @param {TGApp.App.Achievement.Item} raw - 元数据
* @param {[TGApp.Sqlite.Achievement.TableAchi]} data - 数据库数据
* @param {[number]} uid - 存档 UID
* @return {TGApp.Sqlite.Achievement.RenderAchi} - 渲染数据
* @param raw - 元数据
* @param uid - 存档 UID可选参数
* @param data - 数据库数据,可选参数
* @returns 渲染数据
*/
function getRenderAchi(
raw: TGApp.App.Achievement.Item,
uid?: number,
data?: TGApp.Sqlite.Achievement.TableAchi,
): TGApp.Sqlite.Achievement.RenderAchi {
const emptyAchi: TGApp.Sqlite.Achievement.TableAchi = {
data?: TGApp.Sqlite.Achievement.TableRaw,
): TGApp.App.Achievement.RenderItem {
const emptyAchi: TGApp.Sqlite.Achievement.TableRaw = {
id: 0,
uid: uid ?? 0,
isCompleted: 0,
@@ -104,18 +104,18 @@ function getRenderAchi(
}
/**
* @description 获取单个成就
* 获取单个成就
* @since Beta v0.6.0
* @param {number} uid - 存档 UID
* @param {number} id - 成就 ID
* @returns {Promise<TGApp.Sqlite.Achievement.TableAchi|false>}
* @param uid - 存档 UID
* @param id - 成就 ID
* @returns 成就数据
*/
async function getAchi(
uid: number,
id: number,
): Promise<TGApp.Sqlite.Achievement.TableAchi | false> {
): Promise<TGApp.Sqlite.Achievement.TableRaw | false> {
const db = await TGSqlite.getDB();
const res = await db.select<TGApp.Sqlite.Achievement.TableAchi[]>(
const res = await db.select<Array<TGApp.Sqlite.Achievement.TableRaw>>(
"SELECT * FROM Achievements WHERE uid = ? AND id = ?;",
[uid, id],
);
@@ -124,23 +124,23 @@ async function getAchi(
}
/**
* @description 获取成就数据
* 获取成就数据
* @since Beta v0.6.0
* @param {number} uid - 存档 UID
* @param {[number]} series - 成就系列ID
* @returns {Promise<TGApp.Sqlite.Achievement.RenderAchi[]>} 成就数据
* @param uid - 存档 UID
* @param series - 成就系列ID
* @returns 成就数据
*/
async function getAchievements(
uid: number,
series?: number,
): Promise<TGApp.Sqlite.Achievement.RenderAchi[]> {
): Promise<Array<TGApp.App.Achievement.RenderItem>> {
const db = await TGSqlite.getDB();
const res: TGApp.Sqlite.Achievement.RenderAchi[] = [];
const userData = await db.select<TGApp.Sqlite.Achievement.TableAchi[]>(
const res: Array<TGApp.App.Achievement.RenderItem> = [];
const userData = await db.select<Array<TGApp.Sqlite.Achievement.TableRaw>>(
"SELECT * FROM Achievements WHERE uid = ?;",
[uid],
);
let rawData: TGApp.App.Achievement.Item[];
let rawData: Array<TGApp.App.Achievement.Item>;
if (series === undefined || series === -1) rawData = AppAchievementsData;
else rawData = AppAchievementsData.filter((a) => a.series === series);
for (const achi of rawData) {
@@ -157,24 +157,23 @@ async function getAchievements(
/**
* 查找成就数据
* @since Beta v0.8.7
* @remarks
* 支持三种搜索方式:
* 1. 版本搜索:输入 vx.x 格式的关键词(如 v1.2),搜索对应版本的成就
* 2. ID搜索输入 ixxx 格式的关键词(如 i1001搜索对应ID的成就
* 3. 名称/描述搜索:输入任意关键词,搜索成就名称或描述中包含该关键词的成就
* @param {number} uid - 存档 UID
* @param {string} keyword - 关键词
* @returns {Promise<Array<TGApp.Sqlite.Achievement.RenderAchi>>} 成就数据
* @remarks 支持三种搜索方式:
* - 版本搜索:输入 vx.x 格式的关键词(如 v1.2),搜索对应版本的成就
* - ID搜索:输入 ixxx 格式的关键词(如 i1001),搜索对应ID的成就
* - 名称/描述搜索:输入任意关键词,搜索成就名称或描述中包含该关键词的成就
* @param uid - 存档 UID
* @param keyword - 关键词
* @returns 成就数据
*/
async function searchAchi(
uid: number,
keyword: string,
): Promise<TGApp.Sqlite.Achievement.RenderAchi[]> {
): Promise<Array<TGApp.App.Achievement.RenderItem>> {
if (keyword === "") return await getAchievements(uid);
const versionReg = /^v\d+(\.\d+)?$/;
const idReg = /^i\d+$/;
let rawData: Array<TGApp.App.Achievement.Item>;
const res: Array<TGApp.Sqlite.Achievement.RenderAchi> = [];
const res: Array<TGApp.App.Achievement.RenderItem> = [];
if (versionReg.test(keyword)) {
const version = keyword.replace("v", "");
rawData = AppAchievementsData.filter((i) => i.version.includes(version));
@@ -189,7 +188,7 @@ async function searchAchi(
}
for (const data of rawData) {
const achiFind = await getAchi(uid, data.id);
let achievement: TGApp.Sqlite.Achievement.RenderAchi;
let achievement: TGApp.App.Achievement.RenderItem;
if (achiFind === false) achievement = getRenderAchi(data, uid);
else achievement = getRenderAchi(data, uid, achiFind);
res.push(achievement);
@@ -201,12 +200,12 @@ async function searchAchi(
}
/**
* @description 更新成就数据
* 更新成就数据
* @since Beta v0.6.0
* @param {TGApp.Sqlite.Achievement.RenderAchi} data 成就数据
* @returns {Promise<void>}
* @param data - 成就数据
* @returns 无返回值
*/
async function updateAchi(data: TGApp.Sqlite.Achievement.RenderAchi): Promise<void> {
async function updateAchi(data: TGApp.App.Achievement.RenderItem): Promise<void> {
const db = await TGSqlite.getDB();
await db.execute(
"INSERT INTO Achievements(id, uid, isCompleted, completedTime, progress, updated) \
@@ -230,10 +229,10 @@ async function updateAchi(data: TGApp.Sqlite.Achievement.RenderAchi): Promise<vo
/**
* 将数据库数据转换为UIAF数据
* @since Beta v0.6.0
* @param {TGApp.Sqlite.Achievement.TableAchi} data 数据库数据
* @returns {TGApp.Plugins.UIAF.Achievement} UIAF数据
* @param data - 数据库数据
* @returns UIAF数据
*/
function transDb2Uiaf(data: TGApp.Sqlite.Achievement.TableAchi): TGApp.Plugins.UIAF.Achievement {
function transDb2Uiaf(data: TGApp.Sqlite.Achievement.TableRaw): TGApp.Plugins.UIAF.Achievement {
let timestamp = 0;
if (data.isCompleted === 1) timestamp = Math.floor(new Date(data.completedTime).getTime() / 1000);
const status = getUiafStatus(data.isCompleted === 1, data.progress);
@@ -241,26 +240,26 @@ function transDb2Uiaf(data: TGApp.Sqlite.Achievement.TableAchi): TGApp.Plugins.U
}
/**
* @description 获取指定Uid的UIAF数据
* 获取指定Uid的UIAF数据
* @since Beta v0.6.0
* @param {number} uid - 存档UID
* @returns {Promise<TGApp.Plugins.UIAF.Achievement[]>}
* @param uid - 存档UID
* @returns UIAF数据
*/
async function getUiafData(uid: number): Promise<TGApp.Plugins.UIAF.Achievement[]> {
async function getUiafData(uid: number): Promise<Array<TGApp.Plugins.UIAF.Achievement>> {
const db = await TGSqlite.getDB();
const data = await db.select<TGApp.Sqlite.Achievement.TableAchi[]>(
const data = await db.select<Array<TGApp.Sqlite.Achievement.TableRaw>>(
"SELECT * FROM Achievements WHERE uid=?;",
[uid],
);
const res: TGApp.Plugins.UIAF.Achievement[] = [];
const res: Array<TGApp.Plugins.UIAF.Achievement> = [];
for (const item of data) res.push(transDb2Uiaf(item));
return res;
}
/**
* @description 获取所有存档 uid
* 获取所有存档 uid
* @since Beta v0.6.0
* @return {Promise<Array<number>>}
* @returns 存档UID列表
*/
async function getAllUid(): Promise<Array<number>> {
const db = await TGSqlite.getDB();
@@ -270,11 +269,11 @@ async function getAllUid(): Promise<Array<number>> {
}
/**
* @description 备份成就数据
* 备份成就数据
* @since Beta v0.6.0
* @param {string} dir - 存档数据
* @param {number} uid - 存档UID未指定则导出所有
* @returns {Promise<void>}
* @param dir - 存档数据
* @param uid - 存档UID未指定则导出所有
* @returns 无返回值
*/
async function backupUiaf(dir: string, uid?: number): Promise<void> {
let uidList = [];
@@ -293,10 +292,10 @@ async function backupUiaf(dir: string, uid?: number): Promise<void> {
}
/**
* @description 恢复成就数据
* 恢复成就数据
* @since Beta v0.6.0
* @param {string} dir - 数据目录
* @returns {Promise<boolean>}
* @param dir - 数据目录
* @returns 是否恢复成功
*/
async function restoreUiaf(dir: string): Promise<boolean> {
if (!(await exists(dir))) return false;
@@ -309,7 +308,7 @@ async function restoreUiaf(dir: string): Promise<boolean> {
try {
const uid = parseInt(file.name.replace("UIAF_", "").replace(".json", ""));
const filePath = `${dir}${path.sep()}${file.name}`;
const data: TGApp.Plugins.UIAF.Achievement[] = JSON.parse(await readTextFile(filePath));
const data: Array<TGApp.Plugins.UIAF.Achievement> = JSON.parse(await readTextFile(filePath));
await TSUserAchi.mergeUiaf(data, uid);
} catch (e) {
await TGLogger.Error(`[UIAF][RESTORE] 恢复成就数据${file.name} `);
@@ -323,9 +322,9 @@ async function restoreUiaf(dir: string): Promise<boolean> {
/**
* 导入Uiaf数据
* @since Beta v0.7.8
* @param {Array<TGApp.Plugins.UIAF.Achievement>} data - 成就数据
* @param {number} uid - 存档UID
* @returns {Promise<void>}
* @param data - 成就数据
* @param uid - 存档UID
* @returns 无返回值
*/
async function mergeUiaf(data: Array<TGApp.Plugins.UIAF.Achievement>, uid: number): Promise<void> {
const db = await TGSqlite.getDB();
@@ -346,16 +345,20 @@ async function mergeUiaf(data: Array<TGApp.Plugins.UIAF.Achievement>, uid: numbe
}
/**
* @description 删除指定 UID 存档的数据
* 删除指定 UID 存档的数据
* @since Beta v0.6.0
* @param {number} uid - 存档UID
* @returns {Promise<void>}
* @param uid - 存档UID
* @returns 无返回值
*/
async function delUid(uid: number): Promise<void> {
const db = await TGSqlite.getDB();
await db.execute("DELETE FROM Achievements WHERE uid=?;", [uid]);
}
/**
* 用户成就数据库操作类
* @since Beta v0.9.0
*/
const TSUserAchi = {
getLatestAchiVersion,
getOverview,

View File

@@ -1,6 +1,5 @@
/**
* @file plugins/Sqlite/modules/userAvatar.ts
* @description 用户角色模块
* 用户角色模块
* @since Beta v0.6.0
*/
@@ -11,14 +10,14 @@ import TGSqlite from "../index.js";
import { AppCharacterData } from "@/data/index.js";
/**
* @description 获取角色插入Sql
* 获取角色插入Sql
* @since Beta v0.6.0
* @param {string} uid - 用户UID
* @param {TGApp.Game.Avatar.DetailList} data - 角色数据
* @return {string}
* @param uid - 用户UID
* @param data - 角色数据
* @returns sql
*/
function getInsertSql(uid: string, data: TGApp.Game.Avatar.DetailList): string {
const role: TGApp.Sqlite.Character.UserRoleDB = {
function getInsertSql(uid: string, data: TGApp.Game.Avatar.AvatarDetail): string {
const role: TGApp.Sqlite.Character.TableRaw = {
uid: Number(uid),
cid: data.base.id,
avatar: JSON.stringify(data.base),
@@ -55,11 +54,11 @@ function getInsertSql(uid: string, data: TGApp.Game.Avatar.DetailList): string {
}
/**
* @description 获取用户UID列表
* 获取用户UID列表
* @since Beta v0.6.0
* @returns {Promise<string[]>} 角色id列表
* @returns 角色id列表
*/
async function getAllUid(): Promise<string[]> {
async function getAllUid(): Promise<Array<string>> {
const db = await TGSqlite.getDB();
type resType = Array<{ uid: number }>;
const res = await db.select<resType>("SELECT DISTINCT uid FROM UserCharacters;");
@@ -67,14 +66,14 @@ async function getAllUid(): Promise<string[]> {
}
/**
* @description 获取用户角色数据
* 获取用户角色数据
* @since Beta v0.5.3
* @param {number} uid 用户 uid
* @returns {Promise<TGApp.Sqlite.Character.UserRole[]>}
* @param uid - 用户 uid
* @returns 用户角色数据
*/
async function getAvatars(uid: number): Promise<TGApp.Sqlite.Character.UserRole[]> {
async function getAvatars(uid: number): Promise<Array<TGApp.Sqlite.Character.TableTrans>> {
const db = await TGSqlite.getDB();
type resType = Array<TGApp.Sqlite.Character.UserRoleDB>;
type resType = Array<TGApp.Sqlite.Character.TableRaw>;
const res = await db.select<resType>("SELECT * FROM UserCharacters WHERE uid = ?;", [uid]);
return res.map((i) => {
return {
@@ -96,22 +95,25 @@ async function getAvatars(uid: number): Promise<TGApp.Sqlite.Character.UserRole[
}
/**
* @description 保存用户角色数据
* 保存用户角色数据
* @since Beta v0.6.0
* @param {string} uid 用户 uid
* @param {TGApp.Game.Avatar.DetailList[]} data 角色数据
* @returns {Promise<void>}
* @param uid - 用户 uid
* @param data - 角色数据
* @returns 无返回值
*/
async function saveAvatars(uid: string, data: TGApp.Game.Avatar.DetailList[]): Promise<void> {
async function saveAvatars(
uid: string,
data: Array<TGApp.Game.Avatar.AvatarDetail>,
): Promise<void> {
const db = await TGSqlite.getDB();
for (const role of data) await db.execute(getInsertSql(uid, role));
}
/**
* @description 获取角色名片
* 获取角色名片
* @since Beta v0.6.0
* @param {number} id 角色 id
* @returns {string|false}
* @param id - 角色 id
* @returns 名片
*/
function getAvatarCard(id: number): string {
const find = AppCharacterData.find((c) => c.id === id);
@@ -120,10 +122,10 @@ function getAvatarCard(id: number): string {
}
/**
* @description 删除指定UID的数据
* 删除指定UID的数据
* @since Beta v0.6.0
* @param {string} uid - 游戏UID
* @return {Promise<void>}
* @param uid - 游戏UID
* @returns 无返回值
*/
async function deleteUid(uid: string): Promise<void> {
const db = await TGSqlite.getDB();

View File

@@ -20,7 +20,7 @@ export const SKIP_BAG_TYPES: ReadonlyArray<string> = [
/**
* 获取有效材料ID
* @since Beta v0.9.0
* @return {Array<number>}
* @returns ID列表
*/
function getValidMIds(): Array<number> {
const filter = WikiMaterialData.filter((m) => !SKIP_BAG_TYPES.includes(m.type));
@@ -30,10 +30,10 @@ function getValidMIds(): Array<number> {
/**
* 获取插入Sql
* @since Beta v0.9.0
* @param {TGApp.Sqlite.UserBag.TableMaterialRaw} tb -表格
* @returns {string}
* @param tb -表格
* @returns sql
*/
function getInsertSql(tb: TGApp.Sqlite.UserBag.TableMaterialRaw): string {
function getInsertSql(tb: TGApp.Sqlite.UserBag.MaterialRaw): string {
return `
INSERT INTO UserBagMaterial(uid, id, count, records, updated)
VALUES (${tb.uid}, ${tb.id}, ${tb.count}, '${tb.records}', '${tb.updated}') ON CONFLICT(uid, id) DO
@@ -47,12 +47,12 @@ function getInsertSql(tb: TGApp.Sqlite.UserBag.TableMaterialRaw): string {
/**
* 插入或更新材料数据
* @since Beta v0.9.0
* @param {number} uid - 存档UID
* @param {number} itemId - 材料ID
* @param {number} count - 材料数量
* @param {Array<TGApp.Sqlite.UserBag.MaterialRecord>} [records] - 更新记录
* @param {boolean} manual - 是否手动
* @returns {Promise<void>}
* @param uid - 存档UID
* @param itemId - 材料ID
* @param count - 材料数量
* @param records - 更新记录
* @param manual - 是否手动
* @returns 无返回值
*/
async function insertMaterial(
uid: number,
@@ -68,7 +68,7 @@ async function insertMaterial(
};
if (manual) newRecord.manual = true;
const newRecords = [...records, newRecord];
const newTable: TGApp.Sqlite.UserBag.TableMaterialRaw = {
const newTable: TGApp.Sqlite.UserBag.MaterialRaw = {
uid: uid,
id: itemId,
count: count,
@@ -103,12 +103,10 @@ async function delUid(uid: number): Promise<void> {
/**
* 解析表格数据
* @since Beta v0.9.0
* @param {TGApp.Sqlite.UserBag.TableMaterialRaw} raw 原始数据
* @return {TGApp.Sqlite.UserBag.TableMaterial} 解析数据
* @param raw - 原始数据
* @returns 解析数据
*/
function parseMaterial(
raw: TGApp.Sqlite.UserBag.TableMaterialRaw,
): TGApp.Sqlite.UserBag.TableMaterial {
function parseMaterial(raw: TGApp.Sqlite.UserBag.MaterialRaw): TGApp.Sqlite.UserBag.MaterialTable {
return {
...raw,
records: (<Array<TGApp.Sqlite.UserBag.MaterialRecord>>JSON.parse(raw.records)).sort(
@@ -120,24 +118,24 @@ function parseMaterial(
/**
* 获取指定UID的材料数据
* @since Beta v0.9.0
* @param {number} uid - 存档UID
* @param {number} [id] - 材料ID
* @returns {Promise<Array<TGApp.Sqlite.UserBag.TableMaterial>>}
* @param uid - 存档UID
* @param id - 材料ID
* @returns 材料数据
*/
async function getMaterial(
uid: number,
id?: number,
): Promise<Array<TGApp.Sqlite.UserBag.TableMaterial>> {
): Promise<Array<TGApp.Sqlite.UserBag.MaterialTable>> {
const db = await TGSqlite.getDB();
let res: Array<TGApp.Sqlite.UserBag.TableMaterialRaw>;
let res: Array<TGApp.Sqlite.UserBag.MaterialRaw>;
// TODO: 排序
if (id !== undefined) {
res = await db.select<Array<TGApp.Sqlite.UserBag.TableMaterialRaw>>(
res = await db.select<Array<TGApp.Sqlite.UserBag.MaterialRaw>>(
"SELECT * FROM UserBagMaterial WHERE uid = ? AND id = ?;",
[uid, id],
);
} else {
res = await db.select<Array<TGApp.Sqlite.UserBag.TableMaterialRaw>>(
res = await db.select<Array<TGApp.Sqlite.UserBag.MaterialRaw>>(
"SELECT * FROM UserBagMaterial WHERE uid =?;",
[uid],
);
@@ -152,9 +150,9 @@ async function getMaterial(
/**
* 保存Yae获取的材料数据
* @since Beta v0.9.0
* @param {number} uid - 存档UID
* @param {Array<TGApp.Plugins.Yae.BagItem<"material">>} list - 材料数据
* @returns {Promise<void>}
* @param uid - 存档UID
* @param list - 材料数据
* @returns 无返回值
*/
async function saveYaeData(
uid: number,

View File

@@ -1,6 +1,5 @@
/**
* @file sqlite/modules/userChallenge.ts
* @description 幽境危战模块
* 幽境危战模块
* @since Beta v0.7.10
*/
@@ -12,14 +11,14 @@ import { timestampToDate } from "@utils/toolFunc.js";
import TGSqlite from "../index.js";
/**
* @description 将通过 api 获取到的数据转换为数据库中的数据
* 将通过 api 获取到的数据转换为数据库中的数据
* @since Beta v0.8.0
* @param {TGApp.Game.Challenge.ChallengeItem} data - 挑战数据
* @returns {TGApp.Sqlite.Challenge.SingleTable} 转换后的数据
* @param data - 挑战数据
* @returns 转换后的数据
*/
function transUserChallenge(
data: TGApp.Game.Challenge.ChallengeItem,
): TGApp.Sqlite.Challenge.SingleTable {
): TGApp.Sqlite.Challenge.TableTrans {
return {
uid: "",
id: Number(data.schedule.schedule_id),
@@ -34,13 +33,13 @@ function transUserChallenge(
}
/**
* @description 直接插入数据
* 直接插入数据
* @since Beta v0.8.0
* @param {TGApp.Sqlite.Challenge.SingleTable} data - 挑战数据
* @param {string} [uid] - 用户UID
* @returns {string} - 插入 SQL 语句
* @param data - 挑战数据
* @param uid - 用户UID
* @returns 插入 SQL 语句
*/
function getInsertSql(data: TGApp.Sqlite.Challenge.SingleTable, uid?: string): string {
function getInsertSql(data: TGApp.Sqlite.Challenge.TableTrans, uid?: string): string {
const timeNow = timestampToDate(new Date().getTime());
return `
INSERT INTO HardChallenge(uid, id, startTime, endTime, name, single, mp, blings, updated)
@@ -59,9 +58,9 @@ function getInsertSql(data: TGApp.Sqlite.Challenge.SingleTable, uid?: string): s
}
/**
* @description 获取所有数据的UID
* 获取所有数据的UID
* @since Beta v0.8.0
* @return {Promise<Array<string>} - 所有数据的UID
* @returns 所有数据的UID
*/
async function getAllUid(): Promise<Array<string>> {
const db = await TGSqlite.getDB();
@@ -71,20 +70,20 @@ async function getAllUid(): Promise<Array<string>> {
}
/**
* @description 获取挑战数据
* 获取挑战数据
* @since Beta v0.7.10
* @param {string} [uid] - 游戏UID
* @return {Promise<Array<TGApp.Sqlite.Challenge.SingleTable>>} - 挑战数据
* @param uid - 游戏UID
* @returns 挑战数据
*/
async function getChallenge(uid?: string): Promise<Array<TGApp.Sqlite.Challenge.SingleTable>> {
async function getChallenge(uid?: string): Promise<Array<TGApp.Sqlite.Challenge.TableTrans>> {
const db = await TGSqlite.getDB();
let resR: Array<TGApp.Sqlite.Challenge.RawTable>;
let resR: Array<TGApp.Sqlite.Challenge.TableRaw>;
if (uid === undefined) {
resR = await db.select<Array<TGApp.Sqlite.Challenge.RawTable>>(
resR = await db.select<Array<TGApp.Sqlite.Challenge.TableRaw>>(
"SELECT * FROM HardChallenge ORDER BY id DESC;",
);
} else {
resR = await db.select<Array<TGApp.Sqlite.Challenge.RawTable>>(
resR = await db.select<Array<TGApp.Sqlite.Challenge.TableRaw>>(
`SELECT *
FROM HardChallenge
WHERE uid = ?
@@ -92,7 +91,7 @@ async function getChallenge(uid?: string): Promise<Array<TGApp.Sqlite.Challenge.
[uid],
);
}
const res: Array<TGApp.Sqlite.Challenge.SingleTable> = [];
const res: Array<TGApp.Sqlite.Challenge.TableTrans> = [];
for (const raw of resR) {
res.push({
uid: raw.uid,
@@ -110,11 +109,11 @@ async function getChallenge(uid?: string): Promise<Array<TGApp.Sqlite.Challenge.
}
/**
* @description 保存挑战数据
* 保存挑战数据
* @since Beta v0.8.0
* @param {string} uid - 游戏UID
* @param {TGApp.Game.Challenge.ChallengeItem} data - 挑战数据
* @return {Promise<void>}
* @param uid - 游戏UID
* @param data - 挑战数据
* @returns 无返回值
*/
async function saveChallenge(uid: string, data: TGApp.Game.Challenge.ChallengeItem): Promise<void> {
const db = await TGSqlite.getDB();
@@ -122,10 +121,10 @@ async function saveChallenge(uid: string, data: TGApp.Game.Challenge.ChallengeIt
}
/**
* @description 删除指定UID的挑战数据
* 删除指定UID的挑战数据
* @since Beta v0.8.0
* @param {string} uid - 游戏UID
* @return {Promise<void>}
* @param uid - 游戏UID
* @returns 无返回值
*/
async function delChallenge(uid: string): Promise<void> {
const db = await TGSqlite.getDB();
@@ -133,10 +132,10 @@ async function delChallenge(uid: string): Promise<void> {
}
/**
* @description 备份挑战数据
* 备份挑战数据
* @since Beta v0.8.0
* @param {string} dir - 备份目录
* @return {Promise<void>}
* @param dir - 备份目录
* @returns 无返回值
*/
async function backupChallenge(dir: string): Promise<void> {
if (!(await exists(dir))) {
@@ -148,18 +147,16 @@ async function backupChallenge(dir: string): Promise<void> {
}
/**
* @description 恢复挑战数据
* 恢复挑战数据
* @since Beta v0.8.0
* @param {string} dir - 备份目录
* @return {Promise<boolean>}
* @param dir - 备份目录
* @returns 是否恢复成功
*/
async function restoreChallenge(dir: string): Promise<boolean> {
const filePath = `${dir}${path.sep()}challenge.json`;
if (!(await exists(filePath))) return false;
try {
const data: Array<TGApp.Sqlite.Challenge.SingleTable> = JSON.parse(
await readTextFile(filePath),
);
const data: Array<TGApp.Sqlite.Challenge.TableTrans> = JSON.parse(await readTextFile(filePath));
const db = await TGSqlite.getDB();
for (const challenge of data) await db.execute(getInsertSql(challenge));
return true;

View File

@@ -1,80 +1,81 @@
/**
* @file plugins/Sqlite/modules/userCollect.ts
* @description 用户收藏模块
* 用户收藏模块
* @since Beta v0.5.5
*/
import TGSqlite from "../index.js";
/**
* @description 获取单个帖子的收藏信息
* 获取单个帖子的收藏信息
* @since Beta v0.4.5
* @param {string} postId 文章 id
* @return {Promise<TGApp.Sqlite.UserCollection.UFMap[]|boolean>} 返回收藏信息
* @param postId - 文章 id
* @returns 返回收藏信息
*/
async function getPostCollect(
postId: string,
): Promise<TGApp.Sqlite.UserCollection.UFMap[] | boolean> {
): Promise<Array<TGApp.Sqlite.Collection.PcMap> | boolean> {
const db = await TGSqlite.getDB();
const sql = "SELECT * FROM UFMap WHERE postId = ?";
const res: TGApp.Sqlite.UserCollection.UFMap[] = await db.select(sql, [postId]);
const res: Array<TGApp.Sqlite.Collection.PcMap> = await db.select(sql, [postId]);
if (res.length > 0) return res;
const unclassifiedSql = "SELECT * FROM UFPost WHERE id = ?";
const unclassifiedRes: TGApp.Sqlite.UserCollection.UFPost[] = await db.select(unclassifiedSql, [
const unclassifiedRes: Array<TGApp.Sqlite.Collection.PostRaw> = await db.select(unclassifiedSql, [
postId,
]);
return unclassifiedRes.length > 0;
}
/**
* @description 获取收藏合集列表
* 获取收藏合集列表
* @since Beta v0.4.5
* @return {Promise<TGApp.Sqlite.UserCollection.UFCollection[]>} 返回收藏合集列表
* @returns 返回收藏合集列表
*/
async function getCollectList(): Promise<TGApp.Sqlite.UserCollection.UFCollection[]> {
async function getCollectList(): Promise<Array<TGApp.Sqlite.Collection.Collection>> {
const db = await TGSqlite.getDB();
const sql = "SELECT * FROM UFCollection";
return await db.select(sql);
}
/**
* @description 获取收藏合集中的帖子列表
* 获取收藏合集中的帖子列表
* @since Beta v0.5.5
* @param {string} collection 收藏合集标题
* @return {Promise<TGApp.Sqlite.UserCollection.UFPost[]>} 返回收藏合集中的帖子列表
* @param collection - 收藏合集标题
* @returns 返回收藏合集中的帖子列表
*/
async function getCollectPostList(
collection: string,
): Promise<TGApp.Sqlite.UserCollection.UFPost[]> {
): Promise<Array<TGApp.Sqlite.Collection.PostRaw>> {
const db = await TGSqlite.getDB();
const sql = "SELECT * FROM UFMap WHERE collection = ?";
const res: TGApp.Sqlite.UserCollection.UFMap[] = await db.select(sql, [collection]);
const postList: TGApp.Sqlite.UserCollection.UFPost[] = [];
const res: Array<TGApp.Sqlite.Collection.PcMap> = await db.select(sql, [collection]);
const postList: Array<TGApp.Sqlite.Collection.PostRaw> = [];
for (let i = 0; i < res.length; i++) {
const postSql = "SELECT * FROM UFPost WHERE id = ?";
const postRes: TGApp.Sqlite.UserCollection.UFPost[] = await db.select(postSql, [res[i].postId]);
const postRes: Array<TGApp.Sqlite.Collection.PostRaw> = await db.select(postSql, [
res[i].postId,
]);
if (postRes.length > 0) postList.push(postRes[0]);
}
return postList;
}
/**
* @description 获取未分类的收藏帖子列表
* 获取未分类的收藏帖子列表
* @since Beta v0.4.5
* @return {Promise<TGApp.Sqlite.UserCollection.UFPost[]>} 返回未分类的收藏帖子列表
* @returns 返回未分类的收藏帖子列表
*/
async function getUnCollectPostList(): Promise<TGApp.Sqlite.UserCollection.UFPost[]> {
async function getUnCollectPostList(): Promise<Array<TGApp.Sqlite.Collection.PostRaw>> {
const db = await TGSqlite.getDB();
const sql = "SELECT * FROM UFPost WHERE id NOT IN (SELECT postId FROM UFMap)";
return await db.select(sql);
}
/**
* @description 新建收藏合集
* 新建收藏合集
* @since Beta v0.4.5
* @param {string} title 收藏合集标题
* @param {string} desc 收藏合集描述
* @return {Promise<boolean>} 返回收藏合集 id
* @param title - 收藏合集标题
* @param desc - 收藏合集描述
* @returns 返回收藏合集 id
*/
async function createCollect(title: string, desc: string): Promise<boolean> {
if (title === "未分类" || title === "") return false;
@@ -88,11 +89,11 @@ async function createCollect(title: string, desc: string): Promise<boolean> {
}
/**
* @description 删除收藏合集
* 删除收藏合集
* @since Beta v0.5.1
* @param {string} title 收藏合集标题
* @param {boolean} force 是否强制删除
* @return {Promise<boolean>} 返回是否删除成功
* @param title - 收藏合集标题
* @param force - 是否强制删除
* @returns 返回是否删除成功
*/
async function deleteCollect(title: string, force: boolean): Promise<boolean> {
const db = await TGSqlite.getDB();
@@ -112,9 +113,9 @@ async function deleteCollect(title: string, force: boolean): Promise<boolean> {
}
/**
* @description 删除未分类帖子
* 删除未分类帖子
* @since Beta v0.4.5
* @return {Promise<boolean>} 返回是否删除成功
* @returns 返回是否删除成功
*/
async function deleteUnCollectPost(): Promise<boolean> {
const db = await TGSqlite.getDB();
@@ -124,12 +125,12 @@ async function deleteUnCollectPost(): Promise<boolean> {
}
/**
* @description 更新收藏合集信息,标题/描述
* 更新收藏合集信息,标题/描述
* @since Beta v0.4.5
* @param {string} title 收藏合集标题
* @param {string} newTitle 新标题
* @param {string} newDesc 新描述
* @return {Promise<boolean>} 返回是否更新成功
* @param title - 收藏合集标题
* @param newTitle - 新标题
* @param newDesc - 新描述
* @returns 返回是否更新成功
*/
async function updateCollect(title: string, newTitle: string, newDesc: string): Promise<boolean> {
const db = await TGSqlite.getDB();
@@ -144,13 +145,13 @@ async function updateCollect(title: string, newTitle: string, newDesc: string):
}
/**
* @description 添加收藏
* 添加收藏
* @since Beta v0.4.5
* @param {string} postId 文章 id
* @param {TGApp.BBS.Post.FullData} post 文章信息
* @param {string} collection 收藏合集标题,可能为 undefined
* @param {boolean} recursive 是否递归添加
* @return {Promise<boolean>} 返回是否添加成功
* @param postId - 文章 id
* @param post - 文章信息
* @param collection - 收藏合集标题,可能为 undefined
* @param recursive - 是否递归添加
* @returns 返回是否添加成功
*/
async function addCollect(
postId: string,
@@ -173,7 +174,7 @@ async function addCollect(
}
if (collection !== undefined) {
const collectionSql = "SELECT * FROM UFCollection WHERE title = ?";
let collectionRes: TGApp.Sqlite.UserCollection.UFCollection[] = await db.select(collectionSql, [
let collectionRes: Array<TGApp.Sqlite.Collection.Collection> = await db.select(collectionSql, [
collection,
]);
if (collectionRes.length === 0) {
@@ -184,7 +185,7 @@ async function addCollect(
}
// 查找是否已经有了数据
const mapSql = "SELECT * FROM UFMap WHERE postId = ? AND collectionId = ?";
const mapRes: TGApp.Sqlite.UserCollection.UFMap[] = await db.select(mapSql, [
const mapRes: Array<TGApp.Sqlite.Collection.PcMap> = await db.select(mapSql, [
postId,
collectionRes[0].id,
]);
@@ -216,11 +217,11 @@ async function addCollect(
}
/**
* @description 更新帖子信息
* 更新帖子信息
* @since Beta v0.4.5
* @param {string} postId 文章 id
* @param {TGApp.BBS.Post.FullData} post 文章信息
* @return {Promise<boolean>} 返回是否更新成功
* @param postId - 文章 id
* @param post - 文章信息
* @returns 返回是否更新成功
*/
async function updatePostInfo(postId: string, post: TGApp.BBS.Post.FullData): Promise<boolean> {
const db = await TGSqlite.getDB();
@@ -238,11 +239,11 @@ async function updatePostInfo(postId: string, post: TGApp.BBS.Post.FullData): Pr
}
/**
* @description 删除某个帖子的收藏,可选是否强制删除
* 删除某个帖子的收藏,可选是否强制删除
* @since Beta v0.4.5
* @param {string} postId 文章 id
* @param {boolean} force 是否强制删除
* @return {Promise<boolean>} 返回是否删除成功
* @param postId - 文章 id
* @param force - 是否强制删除
* @returns 返回是否删除成功
*/
async function deletePostCollect(postId: string, force: boolean = false): Promise<boolean> {
const db = await TGSqlite.getDB();
@@ -250,7 +251,7 @@ async function deletePostCollect(postId: string, force: boolean = false): Promis
const res: Array<{ id: number }> = await db.select(sql, [postId]);
if (res.length === 0) return false;
const selectSql = "SELECT * FROM UFMap WHERE postId = ?";
const selectRes: TGApp.Sqlite.UserCollection.UFMap[] = await db.select(selectSql, [postId]);
const selectRes: Array<TGApp.Sqlite.Collection.PcMap> = await db.select(selectSql, [postId]);
if (selectRes.length === 0 && !force) return false;
if (force) {
const deletePostSql = "DELETE FROM UFPost WHERE id = ?";
@@ -262,13 +263,13 @@ async function deletePostCollect(postId: string, force: boolean = false): Promis
}
/**
* @description 修改单个帖子的收藏合集
* 修改单个帖子的收藏合集
* @since Beta v0.4.5
* @param {string} postId 文章 id
* @param {string[]} collections 收藏合集标题
* @return {Promise<boolean>} 返回是否修改成功
* @param postId - 文章 id
* @param collections - 收藏合集标题
* @returns 返回是否修改成功
*/
async function updatePostCollect(postId: string, collections: string[]): Promise<boolean> {
async function updatePostCollect(postId: string, collections: Array<string>): Promise<boolean> {
const db = await TGSqlite.getDB();
const sql = "SELECT id,title FROM UFPost WHERE id = ?";
const res: Array<{ id: number; title: string }> = await db.select(sql, [postId]);
@@ -277,7 +278,7 @@ async function updatePostCollect(postId: string, collections: string[]): Promise
await db.execute(deleteSql, [postId]);
for (let i = 0; i < collections.length; i++) {
const collectionSql = "SELECT * FROM UFCollection WHERE title = ?";
const collectionRes: TGApp.Sqlite.UserCollection.UFCollection[] = await db.select(
const collectionRes: Array<TGApp.Sqlite.Collection.Collection> = await db.select(
collectionSql,
[collections[i]],
);
@@ -297,21 +298,21 @@ async function updatePostCollect(postId: string, collections: string[]): Promise
}
/**
* @description 批量修改帖子的收藏合集
* 批量修改帖子的收藏合集
* @since Beta v0.4.5
* @param {string[]} postIds 文章 id
* @param {string} collection 收藏合集标题
* @param {boolean} force 是否修改的同时移除其他收藏
* @return {Promise<boolean>} 返回是否修改成功
* @param postIds - 文章 id
* @param collection - 收藏合集标题
* @param force - 是否修改的同时移除其他收藏
* @returns 返回是否修改成功
*/
async function updatePostsCollect(
postIds: string[],
postIds: Array<string>,
collection: string,
force: boolean = false,
): Promise<boolean> {
const db = await TGSqlite.getDB();
const collectionSql = "SELECT * FROM UFCollection WHERE title = ?";
const collectionRes: TGApp.Sqlite.UserCollection.UFCollection[] = await db.select(collectionSql, [
const collectionRes: Array<TGApp.Sqlite.Collection.Collection> = await db.select(collectionSql, [
collection,
]);
if (collectionRes.length === 0) return false;
@@ -320,7 +321,7 @@ async function updatePostsCollect(
const postRes: Array<{ id: number; title: string }> = await db.select(postSql, [postIds[i]]);
if (postRes.length === 0) return false;
const unclassifiedSql = "SELECT * FROM UFMap where postId = ?";
const unclassifiedRes: TGApp.Sqlite.UserCollection.UFMap[] = await db.select(unclassifiedSql, [
const unclassifiedRes: Array<TGApp.Sqlite.Collection.PcMap> = await db.select(unclassifiedSql, [
postIds[i],
]);
if (force && unclassifiedRes.length > 0) {
@@ -328,7 +329,7 @@ async function updatePostsCollect(
if (!deleteCheck) return false;
}
const mapSql = "SELECT * FROM UFMap WHERE postId = ? AND collectionId = ?";
const mapRes: TGApp.Sqlite.UserCollection.UFMap[] = await db.select(mapSql, [
const mapRes: Array<TGApp.Sqlite.Collection.PcMap> = await db.select(mapSql, [
postIds[i],
collectionRes[0].id,
]);

View File

@@ -1,6 +1,5 @@
/**
* @file plugins/Sqlite/modules/userCombat.ts
* @description Sqlite-幻想真境剧诗模块
* 幻想真境剧诗模块
* @since Beta v0.8.0
*/
@@ -12,12 +11,12 @@ import { timestampToDate } from "@utils/toolFunc.js";
import TGSqlite from "../index.js";
/**
* @description 将通过 api 获取到的数据转换为数据库中的数据
* 将通过 api 获取到的数据转换为数据库中的数据
* @since Beta v0.8.0
* @param {TGApp.Game.Combat.Combat} data - 剧诗数据
* @returns {TGApp.Sqlite.Combat.SingleTable} 转换后端数据
* @param data - 剧诗数据
* @returns 转换后端数据
*/
function transUserCombat(data: TGApp.Game.Combat.Combat): TGApp.Sqlite.Combat.SingleTable {
function transUserCombat(data: TGApp.Game.Combat.Combat): TGApp.Sqlite.Combat.TableTrans {
return {
uid: "",
detail: data.detail,
@@ -32,13 +31,13 @@ function transUserCombat(data: TGApp.Game.Combat.Combat): TGApp.Sqlite.Combat.Si
}
/**
* @description 直接插入数据
* 直接插入数据
* @since Beta v0.6.3
* @param {TGApp.Sqlite.Combat.SingleTable} data 剧诗数据
* @param {string} [uid] 用户UID
* @returns {string}
* @param data - 剧诗数据
* @param uid - 用户UID
* @returns sql
*/
function getInsertSql(data: TGApp.Sqlite.Combat.SingleTable, uid?: string): string {
function getInsertSql(data: TGApp.Sqlite.Combat.TableTrans, uid?: string): string {
const timeNow = timestampToDate(new Date().getTime());
const hasData = data.hasData ? 1 : 0;
const hasDetailData = data.hasDetailData ? 1 : 0;
@@ -58,9 +57,9 @@ function getInsertSql(data: TGApp.Sqlite.Combat.SingleTable, uid?: string): stri
}
/**
* @description 获取所有有数据的UID
* 获取所有有数据的UID
* @since Beta v0.6.3
* @returns {Promise<Array<string>>}
* @returns uid列表
*/
async function getAllUid(): Promise<Array<string>> {
const db = await TGSqlite.getDB();
@@ -70,25 +69,25 @@ async function getAllUid(): Promise<Array<string>> {
}
/**
* @description 获取剧诗数据
* 获取剧诗数据
* @since Beta v0.8.0
* @param {string} [uid] - 游戏UID
* @returns {Promise<TGApp.Sqlite.Abyss.TableRaw[]>}
* @param uid - 游戏UID
* @returns 剧诗数据
*/
async function getCombat(uid?: string): Promise<TGApp.Sqlite.Combat.SingleTable[]> {
async function getCombat(uid?: string): Promise<Array<TGApp.Sqlite.Combat.TableTrans>> {
const db = await TGSqlite.getDB();
let resR: Array<TGApp.Sqlite.Combat.RawTable>;
let resR: Array<TGApp.Sqlite.Combat.TableRaw>;
if (uid === undefined) {
resR = await db.select<Array<TGApp.Sqlite.Combat.RawTable>>(
resR = await db.select<Array<TGApp.Sqlite.Combat.TableRaw>>(
"SELECT * FROM RoleCombat ORDER BY id DESC;",
);
} else {
resR = await db.select<Array<TGApp.Sqlite.Combat.RawTable>>(
resR = await db.select<Array<TGApp.Sqlite.Combat.TableRaw>>(
"SELECT * FROM RoleCombat WHERE uid = ? ORDER BY id DESC;",
[uid],
);
}
const res: TGApp.Sqlite.Combat.SingleTable[] = [];
const res: Array<TGApp.Sqlite.Combat.TableTrans> = [];
for (const raw of resR) {
res.push({
uid: raw.uid,
@@ -106,11 +105,11 @@ async function getCombat(uid?: string): Promise<TGApp.Sqlite.Combat.SingleTable[
}
/**
* @description 保存剧诗数据
* 保存剧诗数据
* @since Beta v0.6.3
* @param {string} uid - 游戏UID
* @param {TGApp.Game.Abyss.FullData} data - 深渊数据
* @returns {Promise<void>}
* @param uid - 游戏UID
* @param data - 深渊数据
* @returns 无返回值
*/
async function saveCombat(uid: string, data: TGApp.Game.Combat.Combat): Promise<void> {
const db = await TGSqlite.getDB();
@@ -118,10 +117,10 @@ async function saveCombat(uid: string, data: TGApp.Game.Combat.Combat): Promise<
}
/**
* @description 删除指定UID存档的数据
* 删除指定UID存档的数据
* @since Beta v0.6.3
* @param {string} uid - 游戏UID
* @returns {Promise<void>}
* @param uid - 游戏UID
* @returns 无返回值
*/
async function delCombat(uid: string): Promise<void> {
const db = await TGSqlite.getDB();
@@ -131,8 +130,8 @@ async function delCombat(uid: string): Promise<void> {
/**
* 备份剧诗数据
* @since Beta v0.9.0
* @param {string} dir - 备份目录
* @returns {Promise<void>}
* @param dir - 备份目录
* @returns 无返回值
*/
async function backupCombat(dir: string): Promise<void> {
if (!(await exists(dir))) {
@@ -144,16 +143,16 @@ async function backupCombat(dir: string): Promise<void> {
}
/**
* @description 恢复剧诗数据
* 恢复剧诗数据
* @since Beta v0.8.0
* @param {string} dir - 备份文件目录
* @returns {Promise<boolean>}
* @param dir - 备份文件目录
* @returns 是否恢复成功
*/
async function restoreCombat(dir: string): Promise<boolean> {
const filePath = `${dir}${path.sep()}combat.json`;
if (!(await exists(filePath))) return false;
try {
const data: Array<TGApp.Sqlite.Combat.SingleTable> = JSON.parse(await readTextFile(filePath));
const data: Array<TGApp.Sqlite.Combat.TableTrans> = JSON.parse(await readTextFile(filePath));
const db = await TGSqlite.getDB();
for (const abyss of data) await db.execute(getInsertSql(abyss));
return true;

View File

@@ -14,11 +14,11 @@ import { exportUigf4Data, readUigf4Data, readUigfData, verifyUigfData } from "@u
import TGSqlite from "../index.js";
/**
* @description 获取导入 Sql
* 获取导入 Sql
* @since Beta v.6.0
* @param {string} uid - UID
* @param {TGApp.Plugins.UIGF.GachaItem} gacha - UIGF数据
* @returns {string}
* @param uid - UID
* @param gacha - UIGF数据
* @returns sql
*/
function getInsertSql(uid: string, gacha: TGApp.Plugins.UIGF.GachaItem): string {
return `
@@ -42,11 +42,11 @@ function getInsertSql(uid: string, gacha: TGApp.Plugins.UIGF.GachaItem): string
}
/**
* @description 传入时间字符串跟对应时区转成utc8时间字符串
* 传入时间字符串跟对应时区转成utc8时间字符串
* @since Beta v0.7.5
* @param {string} time - 时间字符串
* @param {number} timezone - 时区
* @return {string} 转换后的时间戳
* @param time - 时间字符串
* @param timezone - 时区
* @returns 转换后的时间戳
*/
function getUtc8Time(time: string, timezone: number): string {
const date = new Date(time);
@@ -56,11 +56,11 @@ function getUtc8Time(time: string, timezone: number): string {
}
/**
* @description 转换祈愿数据,防止多语言
* 转换祈愿数据,防止多语言
* @since Beta v0.7.5
* @param {TGApp.Plugins.UIGF.GachaItem} gacha - UIGF数据
* @param {number} timezone - 时区
* @return {TGApp.Plugins.UIGF.GachaItem} 转换后的数据
* @param gacha - UIGF数据
* @param timezone - 时区
* @returns 转换后的数据
*/
function transGacha(
gacha: TGApp.Plugins.UIGF.GachaItem,
@@ -82,11 +82,11 @@ function transGacha(
}
/**
* @description 获取数据库的uid列表
* 获取数据库的uid列表
* @since Beta v0.4.7
* @return {Promise<string[]>}
* @returns uid列表
*/
async function getUidList(): Promise<string[]> {
async function getUidList(): Promise<Array<string>> {
const db = await TGSqlite.getDB();
type resType = Array<{ uid: string }>;
const res = await db.select<resType>("SELECT DISTINCT uid FROM GachaRecords;");
@@ -94,11 +94,11 @@ async function getUidList(): Promise<string[]> {
}
/**
* @description 获取检测增量更新的记录 ID
* 获取检测增量更新的记录 ID
* @since Beta v0.4.7
* @param {string} uid - UID
* @param {string} type - 类型
* @returns {Promise<string|undefined>}
* @param uid - UID
* @param type - 类型
* @returns ID
*/
async function getGachaCheck(uid: string, type: string): Promise<string | undefined> {
const db = await TGSqlite.getDB();
@@ -112,29 +112,29 @@ async function getGachaCheck(uid: string, type: string): Promise<string | undefi
}
/**
* @description 获取用户祈愿记录
* 获取用户祈愿记录
* @since Beta v0.4.7
* @param {string} uid - UID
* @return {Promise<TGApp.Sqlite.GachaRecords.TableGacha[]>}
* @param uid - UID
* @returns 祈愿记录
*/
async function getGachaRecords(uid: string): Promise<TGApp.Sqlite.GachaRecords.TableGacha[]> {
async function getGachaRecords(uid: string): Promise<Array<TGApp.Sqlite.Gacha.Gacha>> {
const db = await TGSqlite.getDB();
return await db.select("SELECT * FROM GachaRecords WHERE uid = ?;", [uid]);
}
/**
* @description 获取用户祈愿记录,并按照日期进行分组排序
* 获取用户祈愿记录,并按照日期进行分组排序
* @since Beta v0.6.8
* @param {string} uid - UID
* @param {string} type - 类型
* @return {Promise<Record<string, TGApp.Sqlite.GachaRecords.SingleTable[]>} 日期分组的祈愿记录
* @param uid - UID
* @param type - 类型
* @returns 日期分组的祈愿记录
*/
async function getGachaRecordsGroupByDate(
uid: string,
type?: string,
): Promise<Record<string, TGApp.Sqlite.GachaRecords.TableGacha[]>> {
): Promise<Record<string, Array<TGApp.Sqlite.Gacha.Gacha>>> {
const db = await TGSqlite.getDB();
type resType = Array<TGApp.Sqlite.GachaRecords.TableGacha>;
type resType = Array<TGApp.Sqlite.Gacha.Gacha>;
let res: resType;
if (type) {
res = await db.select<resType>(
@@ -146,7 +146,7 @@ async function getGachaRecordsGroupByDate(
uid,
]);
}
const map: Record<string, TGApp.Sqlite.GachaRecords.TableGacha[]> = {};
const map: Record<string, Array<TGApp.Sqlite.Gacha.Gacha>> = {};
for (const item of res) {
// key 是 yyyy-MM-dd hh:mm:ss按照日期分组
const key = item.time.split(" ")[0];
@@ -157,10 +157,10 @@ async function getGachaRecordsGroupByDate(
}
/**
* @description 删除指定UID的祈愿记录
* 删除指定UID的祈愿记录
* @since Beta v0.4.7
* @param {string} uid - UID
* @return {Promise<void>}
* @param uid - UID
* @returns 无返回值
*/
async function deleteGachaRecords(uid: string): Promise<void> {
const db = await TGSqlite.getDB();
@@ -168,17 +168,17 @@ async function deleteGachaRecords(uid: string): Promise<void> {
}
/**
* @description 清理祈愿记录
* 清理祈愿记录
* @since Beta v0.6.4
* @param {string} uid - UID
* @param {string} pool - 池子
* @param {Record<string,string[]>} map - 祈愿数据
* @return {Promise<void>}
* @param uid - UID
* @param pool - 池子
* @param map - 祈愿数据
* @returns 无返回值
*/
async function cleanGachaRecords(
uid: string,
pool: string,
map: Record<string, string[]>,
map: Record<string, Array<string>>,
): Promise<void> {
const db = await TGSqlite.getDB();
for (const [time, ids] of Object.entries(map)) {
@@ -200,10 +200,10 @@ async function cleanGachaRecords(
/**
* 合并祈愿数据
* @since Beta v0.9.0
* @param {string} uid - UID
* @param {Array<TGApp.Plugins.UIGF.GachaItem>} data - UIGF数据
* @param {boolean} showProgress - 是否显示进度
* @return {Promise<void>}
* @param uid - UID
* @param data - UIGF数据
* @param showProgress - 是否显示进度
* @returns 无返回值
*/
async function mergeUIGF(
uid: string,
@@ -240,9 +240,9 @@ async function mergeUIGF(
/**
* 合并祈愿数据v4.0
* @since Beta v0.9.0
* @param {TGApp.Plugins.UIGF.GachaHk4e} data - UIGF数据
* @param {boolean} showProgress - 是否显示进度
* @return {Promise<void>}
* @param data - UIGF数据
* @param showProgress - 是否显示进度
* @returns 无返回值
*/
async function mergeUIGF4(
data: TGApp.Plugins.UIGF.GachaHk4e,
@@ -278,8 +278,8 @@ async function mergeUIGF4(
/**
* 备份祈愿数据
* @since Beta v0.9.0
* @param {string} dir - 备份目录
* @returns {Promise<void>}
* @param dir - 备份目录
* @returns 无返回值
*/
async function backUpUigf(dir: string): Promise<void> {
if (!(await exists(dir))) {
@@ -295,8 +295,8 @@ async function backUpUigf(dir: string): Promise<void> {
/**
* 恢复祈愿数据
* @since Beta v0.9.0
* @param {string} dir - 备份目录
* @returns {Promise<boolean>}
* @param dir - 备份目录
* @returns 是否恢复成功
*/
async function restoreUigf(dir: string): Promise<boolean> {
if (!(await exists(dir))) {
@@ -357,14 +357,11 @@ async function restoreUigf(dir: string): Promise<boolean> {
/**
* 更新单条数据ID
* @since Beta v0.9.0
* @param {TGApp.Sqlite.GachaRecords.TableGacha} raw - 原始数据
* @param {number} itemId - 物品ID
* @returns {Promise<void>}
* @param raw - 原始数据
* @param itemId - 物品ID
* @returns 无返回值
*/
async function updateItemIdById(
raw: TGApp.Sqlite.GachaRecords.TableGacha,
itemId: string,
): Promise<void> {
async function updateItemIdById(raw: TGApp.Sqlite.Gacha.Gacha, itemId: string): Promise<void> {
const db = await TGSqlite.getDB();
await db.execute("UPDATE GachaRecords SET itemId = ? WHERE id = ?;", [itemId.toString(), raw.id]);
}

View File

@@ -11,8 +11,8 @@ import TGLogger from "@utils/TGLogger.js";
/**
* 获取导入 Sql
* @since Beta v0.8.4
* @param {TGApp.Game.Gacha.GachaBItem} gacha - 抽卡记录数据
* @returns {string}
* @param gacha - 抽卡记录数据
* @returns sql
*/
function getInsertSql(gacha: TGApp.Game.Gacha.GachaBItem): string {
return `
@@ -43,8 +43,8 @@ function getInsertSql(gacha: TGApp.Game.Gacha.GachaBItem): string {
/**
* 插入列表数据
* @since Beta v0.8.4
* @param {Array<TGApp.Game.Gacha.GachaBItem>} list - 抽卡记录列表
* @returns {Promise<void>}
* @param list - 抽卡记录列表
* @returns 无返回值
*/
async function insertGachaList(list: Array<TGApp.Game.Gacha.GachaBItem>): Promise<void> {
const db = await TGSqlite.getDB();
@@ -57,7 +57,7 @@ async function insertGachaList(list: Array<TGApp.Game.Gacha.GachaBItem>): Promis
/**
* 获取数据库UID列表
* @since Beta v0.8.4
* @returns {Promise<Array<string>>}
* @returns uid列表
*/
async function getUidList(): Promise<Array<string>> {
const db = await TGSqlite.getDB();
@@ -69,9 +69,9 @@ async function getUidList(): Promise<Array<string>> {
/**
* 获取增量更新的记录 ID
* @since Beta v0.8.4
* @param {string} uid - UID
* @param {string} type - 类型
* @returns {Promise<string|undefined>}
* @param uid - UID
* @param type - 类型
* @returns ID
*/
async function getGachaCheck(uid: string, type: string): Promise<string | undefined> {
const db = await TGSqlite.getDB();
@@ -85,16 +85,16 @@ async function getGachaCheck(uid: string, type: string): Promise<string | undefi
}
/**
* 获取用户愿记录
* 获取用户愿记录
* @since Beta v0.8.4
* @param {string} uid - UID
* @param {string} [type] - 类型
* @return {Promise<Array<TGApp.Sqlite.GachaRecords.TableGachaB>>}
* @param uid - UID
* @param type - 类型
* @returns 颂愿记录
*/
async function getGachaRecords(
uid: string,
type?: string,
): Promise<Array<TGApp.Sqlite.GachaRecords.TableGachaB>> {
): Promise<Array<TGApp.Sqlite.Gacha.GachaB>> {
const db = await TGSqlite.getDB();
if (type) {
return await db.select("SELECT * FROM GachaBRecords WHERE uid = ? AND opGachaType = ?;", [
@@ -108,7 +108,7 @@ async function getGachaRecords(
/**
* 备份祈愿数据
* @since Beta v0.8.4
* @param {string} dir - 备份目录
* @param dir - 备份目录
* @remarks 等UIGF标准最终确定后与TSUserGacha合并
*/
async function backUpUigf(dir: string): Promise<void> {
@@ -122,8 +122,9 @@ async function backUpUigf(dir: string): Promise<void> {
/**
* 恢复祈愿数据
* @since Beta v0.8.4
* @param {string} dir - 恢复目录
* @param dir - 恢复目录
* @remarks 等UIGF标准最终确定后与TSUserGacha合并
* @returns 是否恢复成功
*/
async function restoreUigf(dir: string): Promise<boolean> {
if (!(await exists(dir))) {
@@ -136,8 +137,8 @@ async function restoreUigf(dir: string): Promise<boolean> {
/**
* 删除用户祈愿数据
* @since Beta v0.8.4
* @param {string} uid - UID
* @returns {Promise<void>}
* @param uid - UID
* @returns 无返回值
*/
async function deleteRecords(uid: string): Promise<void> {
const db = await TGSqlite.getDB();

View File

@@ -1,6 +1,5 @@
/**
* @file plugins/Sqlite/modules/userRecord.ts
* @description Sqlite-用户战绩模块
* 用户战绩模块
* @since Beta v0.6.0
*/
@@ -10,13 +9,13 @@ import TGSqlite from "../index.js";
import { transUserRecord } from "../utils/transUserRecord.js";
/**
* @description 获取插入Sql
* 获取插入Sql
* @since Beta v0.6.0
* @param {number} uid - 游戏UID
* @param {TGApp.Sqlite.Record.SingleTable} data - 战绩数据
* @returns {string}
* @param uid - 游戏UID
* @param data - 战绩数据
* @returns sql
*/
function getInsertSql(uid: number, data: TGApp.Sqlite.Record.SingleTable): string {
function getInsertSql(uid: number, data: TGApp.Sqlite.Record.TableRaw): string {
return `
INSERT INTO UserRecord(uid, role, avatars, stats, worldExplore, homes, updated)
VALUES (${uid}, '${data.role}', '${data.avatars}', '${data.stats}',
@@ -32,12 +31,12 @@ function getInsertSql(uid: number, data: TGApp.Sqlite.Record.SingleTable): strin
}
/**
* @description 解析数据库数据
* 解析数据库数据
* @since Beta v0.6.0
* @param {TGApp.Sqlite.Record.SingleTable} data - 数据库数据
* @returns {TGApp.Sqlite.Record.RenderData} 渲染数据
* @param data - 数据库数据
* @returns 渲染数据
*/
function parseRecord(data: TGApp.Sqlite.Record.SingleTable): TGApp.Sqlite.Record.RenderData {
function parseRecord(data: TGApp.Sqlite.Record.TableRaw): TGApp.Sqlite.Record.TableTrans {
return {
uid: data.uid,
role: JSON.parse(data.role),
@@ -50,16 +49,13 @@ function parseRecord(data: TGApp.Sqlite.Record.SingleTable): TGApp.Sqlite.Record
}
/**
* @description 转换数据库数据
* 转换数据库数据
* @since Beta v0.6.0
* @param {number} uid - 游戏UID
* @param {TGApp.Game.Record.FullData} data - 战绩数据
* @returns {TGApp.Sqlite.Record.SingleTable}
* @param uid - 游戏UID
* @param data - 战绩数据
* @returns 数据库数据
*/
function transRecord(
uid: number,
data: TGApp.Game.Record.FullData,
): TGApp.Sqlite.Record.SingleTable {
function transRecord(uid: number, data: TGApp.Game.Record.FullData): TGApp.Sqlite.Record.TableRaw {
const transData = transUserRecord(uid, data);
return {
uid: uid,
@@ -73,11 +69,11 @@ function transRecord(
}
/**
* @description 获取UID列表
* 获取UID列表
* @since Beta v0.6.0
* @returns {Promise<number[]>}
* @returns uid列表
*/
async function getAllUid(): Promise<number[]> {
async function getAllUid(): Promise<Array<number>> {
const db = await TGSqlite.getDB();
type resType = Array<{ uid: number }>;
const res = await db.select<resType>("SELECT DISTINCT uid FROM UserRecord;");
@@ -85,14 +81,14 @@ async function getAllUid(): Promise<number[]> {
}
/**
* @description 获取指定UID的战绩数据
* 获取指定UID的战绩数据
* @since Beta v0.6.0
* @param {number} uid - 游戏UID
* @returns {Promise<TGApp.Sqlite.Record.RenderData | false>}
* @param uid - 游戏UID
* @returns 战绩数据
*/
async function getRecord(uid: number): Promise<TGApp.Sqlite.Record.RenderData | false> {
async function getRecord(uid: number): Promise<TGApp.Sqlite.Record.TableTrans | false> {
const db = await TGSqlite.getDB();
const res = await db.select<TGApp.Sqlite.Record.SingleTable[]>(
const res = await db.select<Array<TGApp.Sqlite.Record.TableRaw>>(
"SELECT * FROM UserRecord WHERE uid = ?;",
[uid],
);
@@ -101,11 +97,11 @@ async function getRecord(uid: number): Promise<TGApp.Sqlite.Record.RenderData |
}
/**
* @description 保存战绩数据
* 保存战绩数据
* @since Beta v0.6.0
* @param {number} uid - 游戏UID
* @param {TGApp.Game.Record.FullData} data - 战绩数据
* @returns {Promise<void>}
* @param uid - 游戏UID
* @param data - 战绩数据
* @returns 无返回值
*/
async function saveRecord(uid: number, data: TGApp.Game.Record.FullData): Promise<void> {
const db = await TGSqlite.getDB();
@@ -114,10 +110,10 @@ async function saveRecord(uid: number, data: TGApp.Game.Record.FullData): Promis
}
/**
* @description 删除战绩数据
* 删除战绩数据
* @since Beta v0.6.0
* @param {number} uid
* @returns {Promise<void>}
* @param uid - uid
* @returns 无返回值
*/
async function deleteUid(uid: number): Promise<void> {
const db = await TGSqlite.getDB();

View File

@@ -1,6 +1,5 @@
/**
* @file plugins/Sqlite/sql/initData.ts
* @description Sqlite 初始化数据 sql 语句
* Sqlite 初始化数据 sql 语句
* @since Beta v0.7.2
*/
@@ -10,12 +9,12 @@ import { getBuildTime } from "@utils/TGBuild.js";
import createTable from "./createTable.sql?raw";
/**
* @description 初始化应用表数据
* 初始化应用表数据
* @since Alpha v0.2.2
* @returns {Promise<string[]>} sql
* @returns sql
*/
async function initAppData(): Promise<string[]> {
const sqlRes: string[] = [];
async function initAppData(): Promise<Array<string>> {
const sqlRes: Array<string> = [];
const appVersion = await app.getVersion();
const buildTime: string = getBuildTime();
// 初始化应用版本
@@ -39,12 +38,12 @@ async function initAppData(): Promise<string[]> {
}
/**
* @description 初始化数据
* 初始化数据
* @since Beta v0.7.2
* @returns {Promise<string[]>} sql
* @returns sql
*/
async function initDataSql(): Promise<string[]> {
const sqlRes: string[] = [];
async function initDataSql(): Promise<Array<string>> {
const sqlRes: Array<string> = [];
sqlRes.push(createTable);
sqlRes.push(...(await initAppData()));
return sqlRes;

View File

@@ -1,21 +0,0 @@
/**
* @file plugins/Sqlite/sql/insertData.ts
* @description Sqlite 插入数据 sql 语句
* @since Beta v0.6.0
*/
/**
* @description 插入应用数据
* @since Alpha v0.2.0
* @param {string} key 键
* @param {string} value 值
* @returns {string} sql
*/
export function insertAppData(key: string, value: string): string {
return `
INSERT INTO AppData (key, value, updated)
VALUES ('${key}', '${value}', datetime('now', 'localtime'))
ON CONFLICT(key) DO UPDATE SET value = '${value}',
updated = datetime('now', 'localtime');
`;
}

View File

@@ -8,8 +8,8 @@ import { timestampToDate } from "@utils/toolFunc.js";
/**
* 转换角色数据
* @since Alpha v0.2.0
* @param {Array<TGApp.Game.Abyss.CharacterData>} data 接口获取角色数据
* @returns {string} 转换后的角色数据
* @param data - 接口获取角色数据
* @returns 转换后的角色数据
*/
export function transCharacterData(data: Array<TGApp.Game.Abyss.CharacterData>): string {
const res: Array<TGApp.Sqlite.Abyss.CharacterData> = data.map((item) => ({
@@ -23,11 +23,11 @@ export function transCharacterData(data: Array<TGApp.Game.Abyss.CharacterData>):
/**
* 转换楼层数据
* @since Beta v0.9.0
* @param {Array<TGApp.Game.Abyss.Floor>} data 接口获取楼层数据
* @returns {string} 转换后的楼层数据
* @param data - 接口获取楼层数据
* @returns 转换后的楼层数据
*/
export function transFloorData(data: Array<TGApp.Game.Abyss.Floor>): string {
const floor: TGApp.Sqlite.Abyss.Floor[] = data.map((item) => ({
const floor: Array<TGApp.Sqlite.Abyss.Floor> = data.map((item) => ({
id: item.index,
winStar: item.star,
maxStar: item.max_star,
@@ -41,8 +41,8 @@ export function transFloorData(data: Array<TGApp.Game.Abyss.Floor>): string {
/**
* 转换关卡数据
* @since Beta v0.9.0
* @param {TGApp.Game.Abyss.Level} data 接口获取关卡数据
* @returns {TGApp.Sqlite.Abyss.Level} 转换后的关卡数据
* @param data - 接口获取关卡数据
* @returns 转换后的关卡数据
*/
function transLevelData(data: TGApp.Game.Abyss.Level): TGApp.Sqlite.Abyss.Level {
const res: TGApp.Sqlite.Abyss.Level = {
@@ -60,9 +60,9 @@ function transLevelData(data: TGApp.Game.Abyss.Level): TGApp.Sqlite.Abyss.Level
/**
* 转换战斗数据
* @since Beta v0.9.0
* @param {TGApp.Game.Abyss.Battle} data 接口获取战斗数据
* @param {Array<TGApp.Game.Abyss.MonsterInfo>} monsters 对应战斗怪物数据
* @returns {TGApp.Sqlite.Abyss.Battle} 转换后的深渊数据
* @param data - 接口获取战斗数据
* @param monsters - 对应战斗怪物数据
* @returns 转换后的深渊数据
*/
function transBattleData(
data: TGApp.Game.Abyss.Battle,

View File

@@ -1,25 +1,25 @@
/**
* 原神战绩数据转换
* @since Beta v0.9.0
* @since Beta v0.9.1
*/
import { getZhElement } from "@utils/toolFunc.js";
/**
* @description 将通过 api 获取到的用户战绩数据转换为渲染用的数据
* @since Beta v0.6.0
* @param {number} uid - 用户UID
* @param {TGApp.Game.Record.FullData} data 用户战绩数据
* @returns {TGApp.Sqlite.Record.RenderData} 转换后的用户战绩数据
* 转换战绩口数据
* @since Beta v0.9.1
* @param uid - 用户UID
* @param data - 用户战绩数据
* @returns 转换后的用户战绩数据
*/
export function transUserRecord(
uid: number,
data: TGApp.Game.Record.FullData,
): TGApp.Sqlite.Record.RenderData {
): TGApp.Sqlite.Record.TableTrans {
return {
uid: uid,
role: transRole(data.role),
avatars: data.avatars.map(transAvatar).sort((a, b) => b.star - a.star || b.id - a.id),
avatars: data.avatars.map(transAvatar),
stats: transStat(data.stats),
worldExplore: transWorld(data.world_explorations),
homes: data.homes.map(transHome),
@@ -28,10 +28,10 @@ export function transUserRecord(
}
/**
* @description 将角色信息转换为数据库中的数据
* 转换用户信息
* @since Beta v0.6.0
* @param {TGApp.Game.Record.Role} data 角色信息
* @returns {TGApp.Sqlite.Record.Role} 转换后的角色信息
* @param data - 用户信息
* @returns 转换后的用户信息
*/
function transRole(data: TGApp.Game.Record.Role): TGApp.Sqlite.Record.Role {
return {
@@ -43,10 +43,10 @@ function transRole(data: TGApp.Game.Record.Role): TGApp.Sqlite.Record.Role {
}
/**
* @description 将角色列表转换为数据库中的数据
* 转换角色数据
* @since Beta v0.6.0
* @param {TGApp.Game.Record.Avatar} data 角色列表
* @returns {TGApp.Sqlite.Record.Avatar} 转换后的角色列表
* @param data - 角色数据
* @returns 转换后的角色数据
*/
function transAvatar(data: TGApp.Game.Record.Avatar): TGApp.Sqlite.Record.Avatar {
return {
@@ -64,8 +64,8 @@ function transAvatar(data: TGApp.Game.Record.Avatar): TGApp.Sqlite.Record.Avatar
/**
* 获取幽境危战难度描述
* @since Beta v0.9.0
* @param {number} difficulty 幽境危战难度
* @return {string} 幽境危战难度描述
* @param difficulty - 幽境危战难度
* @returns 幽境危战难度描述
*/
export function getHardChallengeDesc(difficulty: number): string {
switch (difficulty) {
@@ -89,10 +89,10 @@ export function getHardChallengeDesc(difficulty: number): string {
}
/**
* @description 将统计信息转换为数据库中的数据
* 转换统计信息
* @since Beta v0.8.1
* @param {TGApp.Game.Record.Stats} data 统计信息
* @return {TGApp.Sqlite.Record.Stats} 转换后的统计信息
* @param data - 统计信息
* @returns 转换后的统计信息
*/
function transStat(data: TGApp.Game.Record.Stats): TGApp.Sqlite.Record.Stats {
return {
@@ -123,24 +123,23 @@ function transStat(data: TGApp.Game.Record.Stats): TGApp.Sqlite.Record.Stats {
}
/**
* @description 将探索信息转换为数据库中的数据
* @since Beta v0.8.1
* @param {Array<TGApp.Game.Record.WorldExplore>} data 城市探索信息
* @returns {Array<TGApp.Sqlite.Record.WorldExplore>} 转换后的城市探索信息
* 转换探索信息
* @since Beta v0.9.1
* @param data - 城市探索信息
* @returns 转换后的城市探索信息
*/
function transWorld(
data: Array<TGApp.Game.Record.WorldExplore>,
): Array<TGApp.Sqlite.Record.WorldExplore> {
const areaParent = data.filter((i) => i.parent_id === 0);
const areaChild = data.filter((i) => i.parent_id !== 0);
const worlds: TGApp.Sqlite.Record.WorldExplore[] = [];
const worlds: Array<TGApp.Sqlite.Record.WorldExplore> = [];
// 先处理父级城市
for (const area of areaParent) {
const world: TGApp.Sqlite.Record.WorldExplore = {
id: area.id,
name: area.name,
iconLight: area.icon,
icon: area.icon,
bg: area.background_image,
cover: area.cover,
exploration: area.exploration_percentage,
@@ -151,23 +150,20 @@ function transWorld(
if (area.offerings !== undefined && area.offerings.length > 0) world.offerings = area.offerings;
// 对纳塔的特殊处理
if (area.name === "纳塔") {
world.icon =
world.iconLight =
"https://webstatic.mihoyo.com/app/community-game-records/images/world-logo-15.fd274778.png";
world.iconLight = world.icon;
world.bg =
"https://fastcdn.mihoyo.com/static-resource-v2/2024/08/19/8856eafed39be791276a21a6d522426b_6903333123294722705.png";
// 对远古圣山的特殊处理
} else if (area.name === "远古圣山") {
world.icon =
world.iconLight =
"https://webstatic.mihoyo.com/app/community-game-records/images/world-logo-16.1c751ac9.png";
world.iconLight = world.icon;
world.bg =
"https://fastcdn.mihoyo.com/static-resource-v2/2025/03/17/8ee1648101a8b292ffb37eb49559032e_6583057448168798147.png";
// 对挪德卡莱的特殊处理
} else if (area.name === "挪德卡莱") {
world.icon =
world.iconLight =
"https://webstatic.mihoyo.com/app/community-game-records/images/world-logo-17.dadac5bf.png";
world.iconLight = world.icon;
world.bg =
"https://fastcdn.mihoyo.com/static-resource-v2/2025/08/22/ace66cea9c5074b70310ecbbb712cd94_2619077306700596372.png";
}
@@ -185,10 +181,10 @@ function transWorld(
}
/**
* @description 将住宅信息转换为数据库中的数据
* 转换尘歌壶数据
* @since Beta v0.6.0
* @param {TGApp.Game.Record.Home} data 住宅信息
* @returns {TGApp.Sqlite.Record.Home} 转换后的住宅信息
* @param data - 尘歌壶信息
* @returns 转换后的尘歌壶信息
*/
function transHome(data: TGApp.Game.Record.Home): TGApp.Sqlite.Record.Home {
return {