mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2026-03-22 04:59:45 +08:00
♻️ types 重构后的问题搞完了,累死
This commit is contained in:
@@ -2,68 +2,71 @@
|
||||
* @file utils TGSql.ts
|
||||
* @description 数据库sql语句
|
||||
* @author BTMuli<bt-muli@outlook.com>
|
||||
* @since Alpha v0.2.0
|
||||
* @since Alpha v0.1.5
|
||||
*/
|
||||
|
||||
// tauri
|
||||
import { app } from "@tauri-apps/api";
|
||||
// utils
|
||||
import { getBuildTime } from "./TGBuild";
|
||||
import { TGAppData } from "../data";
|
||||
import minifySql from "./minifySql";
|
||||
import { AppAchievementsData, AppAchievementSeriesData, AppNameCardsData } from "../data";
|
||||
|
||||
/**
|
||||
* @description 初始化应用数据表
|
||||
* @since Alpha v0.1.4
|
||||
* @since Alpha v0.1.5
|
||||
* @returns {string[]} sql
|
||||
*/
|
||||
function initAppTable (): string[] {
|
||||
const sqlRes = [];
|
||||
// 创建应用数据表
|
||||
sqlRes.push(`
|
||||
sqlRes.push(minifySql(`
|
||||
CREATE TABLE IF NOT EXISTS AppData
|
||||
(
|
||||
key TEXT PRIMARY KEY,
|
||||
value TEXT DEFAULT NULL,
|
||||
updated TEXT DEFAULT NULL
|
||||
);
|
||||
`);
|
||||
`));
|
||||
return sqlRes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 初始化游戏账号数据表
|
||||
* @since Alpha v0.2.0
|
||||
* @see BTMuli.User.Game.Account
|
||||
* @since Alpha v0.1.5
|
||||
* @see TGApp.Sqlite.Account.Game
|
||||
* @returns {string[]} sql
|
||||
*/
|
||||
function initGameAccountTable (): string[] {
|
||||
const sqlRes = [];
|
||||
// 创建游戏账号数据表
|
||||
sqlRes.push(`
|
||||
sqlRes.push(minifySql(`
|
||||
CREATE TABLE IF NOT EXISTS GameAccount
|
||||
(
|
||||
game_biz TEXT NOT NULL,
|
||||
game_uid TEXT NOT NULL,
|
||||
is_chosen BOOLEAN DEFAULT 0,
|
||||
is_official BOOLEAN DEFAULT 0,
|
||||
gameBiz TEXT NOT NULL,
|
||||
gameUid TEXT NOT NULL,
|
||||
isChosen BOOLEAN DEFAULT 0,
|
||||
isOfficial BOOLEAN DEFAULT 0,
|
||||
level INTEGER DEFAULT 0,
|
||||
nickname TEXT DEFAULT NULL,
|
||||
region TEXT DEFAULT NULL,
|
||||
region_name TEXT DEFAULT NULL,
|
||||
regionName TEXT DEFAULT NULL,
|
||||
updated TEXT DEFAULT NULL,
|
||||
PRIMARY KEY (game_biz, game_uid)
|
||||
PRIMARY KEY (gameBiz, gameUid)
|
||||
);
|
||||
`);
|
||||
`));
|
||||
return sqlRes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 初始化成就系列数据表
|
||||
* @since Alpha v0.1.4
|
||||
* @since Alpha v0.1.5
|
||||
* @returns {string[]} sql
|
||||
*/
|
||||
function initAchievementSeriesTable (): string[] {
|
||||
const sqlRes = [];
|
||||
// 创建成就系列数据表
|
||||
sqlRes.push(`
|
||||
sqlRes.push(minifySql(`
|
||||
CREATE TABLE IF NOT EXISTS AchievementSeries
|
||||
(
|
||||
id INTEGER PRIMARY KEY,
|
||||
@@ -76,19 +79,19 @@ function initAchievementSeriesTable (): string[] {
|
||||
nameCard TEXT NOT NULL,
|
||||
updated TEXT DEFAULT NULL
|
||||
);
|
||||
`);
|
||||
`));
|
||||
return sqlRes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 初始化成就数据表
|
||||
* @since Alpha v0.1.4
|
||||
* @since Alpha v0.1.5
|
||||
* @returns {string[]} sql
|
||||
*/
|
||||
function initAchievementTable (): string[] {
|
||||
const sqlRes = [];
|
||||
// 创建成就数据表
|
||||
sqlRes.push(`
|
||||
sqlRes.push(minifySql(`
|
||||
CREATE TABLE IF NOT EXISTS Achievements
|
||||
(
|
||||
id INTEGER PRIMARY KEY,
|
||||
@@ -103,9 +106,9 @@ function initAchievementTable (): string[] {
|
||||
version TEXT DEFAULT NULL,
|
||||
updated TEXT DEFAULT NULL
|
||||
);
|
||||
`);
|
||||
`));
|
||||
// 创建触发器
|
||||
sqlRes.push(`
|
||||
sqlRes.push(minifySql(`
|
||||
CREATE TRIGGER IF NOT EXISTS updateAchievement
|
||||
AFTER UPDATE ON Achievements
|
||||
FOR EACH ROW
|
||||
@@ -115,8 +118,8 @@ function initAchievementTable (): string[] {
|
||||
UPDATE AchievementSeries SET finCount = finCount - 1, updated = datetime('now', 'localtime')
|
||||
WHERE id = NEW.series AND NEW.isCompleted = 0 AND OLD.isCompleted = 1;
|
||||
END;
|
||||
`);
|
||||
sqlRes.push(`
|
||||
`));
|
||||
sqlRes.push(minifySql(`
|
||||
CREATE TRIGGER IF NOT EXISTS insertAchievement
|
||||
AFTER INSERT ON Achievements
|
||||
FOR EACH ROW
|
||||
@@ -126,23 +129,23 @@ function initAchievementTable (): string[] {
|
||||
UPDATE AchievementSeries SET version = NEW.version, updated = datetime('now', 'localtime')
|
||||
WHERE id = NEW.series AND NEW.version > version;
|
||||
END;
|
||||
`);
|
||||
`));
|
||||
return sqlRes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 初始化名片数据表
|
||||
* @since Alpha v0.1.4
|
||||
* @since Alpha v0.1.5
|
||||
* @returns {string[]} sql
|
||||
*/
|
||||
function initNameCardTable (): string[] {
|
||||
const sqlRes = [];
|
||||
// 创建名片数据表
|
||||
sqlRes.push(`
|
||||
sqlRes.push(minifySql(`
|
||||
CREATE TABLE IF NOT EXISTS NameCard
|
||||
(
|
||||
name TEXT PRIMARY KEY,
|
||||
description TEXT DEFAULT NULL,
|
||||
"desc" TEXT DEFAULT NULL,
|
||||
icon TEXT NOT NULL,
|
||||
bg TEXT NOT NULL,
|
||||
profile TEXT NOT NULL,
|
||||
@@ -150,7 +153,7 @@ function initNameCardTable (): string[] {
|
||||
source TEXT DEFAULT NULL,
|
||||
updated TEXT DEFAULT NULL
|
||||
);
|
||||
`);
|
||||
`));
|
||||
return sqlRes;
|
||||
}
|
||||
|
||||
@@ -171,7 +174,7 @@ export function initSQLiteTable (): string[] {
|
||||
|
||||
/**
|
||||
* @description 初始化应用数据
|
||||
* @since Alpha v0.1.4
|
||||
* @since Alpha v0.1.5
|
||||
* @returns {Promise<string[]>} sql
|
||||
*/
|
||||
async function initAppData (): Promise<string[]> {
|
||||
@@ -180,39 +183,38 @@ async function initAppData (): Promise<string[]> {
|
||||
const buildTime = getBuildTime();
|
||||
const dataUpdated = buildTime.startsWith("dev") ? buildTime.slice(4) : buildTime;
|
||||
// 初始化应用版本
|
||||
sqlRes.push(`
|
||||
sqlRes.push(minifySql(`
|
||||
INSERT INTO AppData (key, value, updated)
|
||||
VALUES ('appVersion', '${appVersion}', datetime('now', 'localtime'))
|
||||
ON CONFLICT(key) DO UPDATE SET value = '${appVersion}', updated = datetime('now', 'localtime');
|
||||
`);
|
||||
`));
|
||||
// 初始化应用数据更新时间
|
||||
sqlRes.push(`
|
||||
sqlRes.push(minifySql(`
|
||||
INSERT INTO AppData (key, value, updated)
|
||||
VALUES ('dataUpdated', '${dataUpdated}', datetime('now', 'localtime'))
|
||||
ON CONFLICT(key) DO UPDATE SET value = '${dataUpdated}', updated = datetime('now', 'localtime');
|
||||
`);
|
||||
`));
|
||||
// 初始化 cookie
|
||||
sqlRes.push(`
|
||||
sqlRes.push(minifySql(`
|
||||
INSERT INTO AppData (key, value, updated)
|
||||
VALUES ('cookie', '{}', datetime('now', 'localtime'))
|
||||
ON CONFLICT(key) DO NOTHING;
|
||||
`);
|
||||
`));
|
||||
return sqlRes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 初始化成就系列数据
|
||||
* @since Alpha v0.1.4
|
||||
* @since Alpha v0.1.5
|
||||
* @returns {string[]} sql
|
||||
*/
|
||||
function initAchievementSeriesData (): string[] {
|
||||
const sqlRes: string[] = [];
|
||||
const oriData = TGAppData.achievementSeries;
|
||||
oriData.map((data) => {
|
||||
const sql = `
|
||||
AppAchievementSeriesData.map((data) => {
|
||||
const sql = minifySql(`
|
||||
INSERT OR IGNORE INTO AchievementSeries (id, "order", name, version, icon, nameCard, updated)
|
||||
VALUES (${data.id}, ${data.order}, '${data.name}', '${data.version}', '${data.icon}', '${data.card}', datetime('now', 'localtime'));
|
||||
`;
|
||||
`);
|
||||
return sqlRes.push(sql);
|
||||
});
|
||||
return sqlRes;
|
||||
@@ -220,17 +222,16 @@ function initAchievementSeriesData (): string[] {
|
||||
|
||||
/**
|
||||
* @description 初始化成就数据
|
||||
* @since Alpha v0.1.4
|
||||
* @since Alpha v0.1.5
|
||||
* @returns {string[]} sql
|
||||
*/
|
||||
function initAchievementData (): string[] {
|
||||
const sqlRes: string[] = [];
|
||||
const oriData = TGAppData.achievements;
|
||||
oriData.map((data) => {
|
||||
const sql = `
|
||||
AppAchievementsData.map((data) => {
|
||||
const sql = minifySql(`
|
||||
INSERT OR IGNORE INTO Achievements (id, series, "order", name, description, reward, version, updated)
|
||||
VALUES (${data.id}, ${data.series}, ${data.order}, '${data.name}', '${data.description}', ${data.reward}, '${data.version}', datetime('now', 'localtime'));
|
||||
`;
|
||||
`);
|
||||
return sqlRes.push(sql);
|
||||
});
|
||||
return sqlRes;
|
||||
@@ -238,17 +239,16 @@ function initAchievementData (): string[] {
|
||||
|
||||
/**
|
||||
* @description 初始化名片数据
|
||||
* @since Alpha v0.1.4
|
||||
* @since Alpha v0.1.5
|
||||
* @returns {string[]} sql
|
||||
*/
|
||||
function initNameCardData (): string[] {
|
||||
const sqlRes: string[] = [];
|
||||
const oriData = TGAppData.nameCards;
|
||||
oriData.map((data) => {
|
||||
const sql = `
|
||||
INSERT OR IGNORE INTO NameCard (name, description, icon, bg, profile, type, source, updated)
|
||||
VALUES ('${data.name}', '${data.description}', '${data.icon}', '${data.bg}', '${data.profile}', ${data.type}, '${data.source}', datetime('now', 'localtime'));
|
||||
`;
|
||||
AppNameCardsData.map((data) => {
|
||||
const sql = minifySql(`
|
||||
INSERT OR IGNORE INTO NameCard (name, "desc", icon, bg, profile, type, source, updated)
|
||||
VALUES ('${data.name}', '${data.desc}', '${data.icon}', '${data.bg}', '${data.profile}', ${data.type}, '${data.source}', datetime('now', 'localtime'));
|
||||
`);
|
||||
return sqlRes.push(sql);
|
||||
});
|
||||
return sqlRes;
|
||||
@@ -270,11 +270,11 @@ export async function initSQLiteData (): Promise<string[]> {
|
||||
|
||||
/**
|
||||
* @description 导入UIAF数据
|
||||
* @since Alpha v0.1.4
|
||||
* @param {TGPlugin.UIAF.Achievement[]} data
|
||||
* @since Alpha v0.1.5
|
||||
* @param {TGApp.Plugins.UIAF.Achievement[]} data
|
||||
* @returns {string[]} sql
|
||||
*/
|
||||
export function importUIAFData (data: TGPlugin.UIAF.Achievement[]): string[] {
|
||||
export function importUIAFData (data: TGApp.Plugins.UIAF.Achievement[]): string[] {
|
||||
const sqlRes: string[] = [];
|
||||
data.map((achievement) => {
|
||||
let sql;
|
||||
@@ -282,17 +282,17 @@ export function importUIAFData (data: TGPlugin.UIAF.Achievement[]): string[] {
|
||||
const isCompleted = achievement.status === 2 || achievement.status === 3;
|
||||
if (isCompleted) {
|
||||
const completedTime = new Date(achievement.timestamp * 1000).toISOString().replace("T", " ").slice(0, 19);
|
||||
sql = `
|
||||
sql = minifySql(`
|
||||
UPDATE Achievements
|
||||
SET isCompleted = 1, completedTime = '${completedTime}', progress = ${achievement.current}, updated = datetime('now', 'localtime')
|
||||
WHERE id = ${achievement.id} AND (isCompleted = 0 OR completedTime != '${completedTime}' OR progress != ${achievement.current});
|
||||
`;
|
||||
`);
|
||||
} else {
|
||||
sql = `
|
||||
sql = minifySql(`
|
||||
UPDATE Achievements
|
||||
SET progress = ${achievement.current}, updated = datetime('now', 'localtime')
|
||||
WHERE id = ${achievement.id} AND progress != ${achievement.current};
|
||||
`;
|
||||
`);
|
||||
}
|
||||
return sqlRes.push(sql);
|
||||
});
|
||||
|
||||
@@ -2,13 +2,14 @@
|
||||
* @file utils TGSqlite.ts
|
||||
* @description 数据库操作类
|
||||
* @author BTMuli<bt-muli@outlook.com>
|
||||
* @since Alpha v0.2.0
|
||||
* @since Alpha v0.1.5
|
||||
*/
|
||||
|
||||
// tauri
|
||||
import Database from "tauri-plugin-sql-api";
|
||||
// utils
|
||||
import { importUIAFData, initSQLiteData, initSQLiteTable } from "./TGSql";
|
||||
import minifySql from "./minifySql";
|
||||
import { getUiafStatus } from "./UIAF";
|
||||
|
||||
class TGSqlite {
|
||||
@@ -59,12 +60,12 @@ class TGSqlite {
|
||||
* @description 获取数据库信息
|
||||
* @memberOf TGSqlite
|
||||
* @since Alpha v0.1.4
|
||||
* @returns {Promise<{ key: string, value: string, updated: string }[]>}
|
||||
* @returns {Promise<TGApp.Sqlite.AppData.Item[]>}
|
||||
*/
|
||||
public async getAppData (): Promise<Array<{ key: string, value: string, updated: string }>> {
|
||||
public async getAppData (): Promise<TGApp.Sqlite.AppData.Item[]> {
|
||||
const db = await Database.load(this.dbPath);
|
||||
const sql = "SELECT * FROM AppData;";
|
||||
const res: Array<{ key: string, value: string, updated: string }> = await db.select(sql);
|
||||
const res: TGApp.Sqlite.AppData.Item[] = await db.select(sql);
|
||||
await db.close();
|
||||
return res;
|
||||
}
|
||||
@@ -86,29 +87,28 @@ class TGSqlite {
|
||||
/**
|
||||
* @description 插入 Account 数据
|
||||
* @memberOf TGSqlite
|
||||
* @since Alpha v0.2.0
|
||||
* @param {BTMuli.User.Game.Account[]} accounts
|
||||
* @since Alpha v0.1.5
|
||||
* @param {TGApp.User.Account.Game[]} accounts
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
public async insertAccount (accounts: BTMuli.User.Game.Account[]): Promise<void> {
|
||||
public async insertAccount (accounts: TGApp.User.Account.Game[]): Promise<void> {
|
||||
const db = await Database.load(this.dbPath);
|
||||
for (const a of accounts) {
|
||||
const is_chosen = a.is_chosen ? 1 : 0;
|
||||
const is_official = a.is_official ? 1 : 0;
|
||||
const sql = `
|
||||
INSERT INTO GameAccount (game_biz, game_uid, is_chosen, is_official, level, nickname, region, region_name, updated)
|
||||
VALUES ('${a.game_biz}', '${a.game_uid}', ${is_chosen}, ${is_official}, '${a.level}', '${a.nickname}',
|
||||
'${a.region}', '${a.region_name}', datetime('now', 'localtime'))
|
||||
ON CONFLICT(game_biz, game_uid) DO UPDATE SET
|
||||
is_chosen = ${is_chosen},
|
||||
is_official = ${is_official},
|
||||
level = ${a.level},
|
||||
nickname = '${a.nickname}',
|
||||
region = '${a.region}',
|
||||
region_name = '${a.region_name}',
|
||||
updated = datetime('now', 'localtime');
|
||||
`;
|
||||
console.log(sql);
|
||||
const isChosen = a.is_chosen ? 1 : 0;
|
||||
const isOfficial = a.is_official ? 1 : 0;
|
||||
const sql = minifySql(`
|
||||
INSERT INTO GameAccount (gameBiz, gameUid, isChosen, isOfficial, level, nickname, region, regionName, updated)
|
||||
VALUES ('${a.game_biz}', '${a.game_uid}', ${isChosen}, ${isOfficial}, '${a.level}', '${a.nickname}',
|
||||
'${a.region}', '${a.region_name}', datetime('now', 'localtime'))
|
||||
ON CONFLICT(gameBiz, gameUid) DO UPDATE SET
|
||||
isChosen = ${isChosen},
|
||||
isOfficial = ${isOfficial},
|
||||
level = ${a.level},
|
||||
nickname = '${a.nickname}',
|
||||
region = '${a.region}',
|
||||
regionName = '${a.region_name}',
|
||||
updated = datetime('now', 'localtime');
|
||||
`);
|
||||
await db.execute(sql);
|
||||
}
|
||||
await db.close();
|
||||
@@ -118,12 +118,12 @@ class TGSqlite {
|
||||
* @description 获取当前选择的游戏账号
|
||||
* @memberOf TGSqlite
|
||||
* @since Alpha v0.2.0
|
||||
* @returns {Promise<BTMuli.User.Game.Account|false>}
|
||||
* @returns {Promise<TGApp.User.Account.Game|false>}
|
||||
*/
|
||||
public async getCurAccount (): Promise<BTMuli.User.Game.Account | false> {
|
||||
public async getCurAccount (): Promise<TGApp.User.Account.Game | false> {
|
||||
const db = await Database.load(this.dbPath);
|
||||
const sql = "SELECT * FROM GameAccount WHERE is_chosen=1;";
|
||||
const res: BTMuli.User.Game.Account[] = await db.select(sql);
|
||||
const sql = "SELECT * FROM GameAccount WHERE isChosen=1;";
|
||||
const res: TGApp.User.Account.Game[] = await db.select(sql);
|
||||
await db.close();
|
||||
return res.length === 0 ? false : res[0];
|
||||
}
|
||||
@@ -131,18 +131,18 @@ class TGSqlite {
|
||||
/**
|
||||
* @description 保存 appData
|
||||
* @memberOf TGSqlite
|
||||
* @since Alpha v0.2.0
|
||||
* @since Alpha v0.1.5
|
||||
* @param {string} key
|
||||
* @param {string} value
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
public async saveAppData (key: string, value: string): Promise<void> {
|
||||
const db = await Database.load(this.dbPath);
|
||||
const sql = `
|
||||
const sql = minifySql(`
|
||||
INSERT INTO AppData (key, value, updated)
|
||||
VALUES ('${key}', '${value}', datetime('now', 'localtime'))
|
||||
ON CONFLICT(key) DO UPDATE SET value = '${value}',updated = datetime('now', 'localtime');
|
||||
`;
|
||||
`);
|
||||
await db.execute(sql);
|
||||
await db.close();
|
||||
}
|
||||
@@ -175,7 +175,7 @@ class TGSqlite {
|
||||
const sqlT = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;";
|
||||
const res: Array<{ name: string }> = await db.select(sqlT);
|
||||
// 考虑到 sqlite_sequence 表,所以需要 +1
|
||||
if (res.length === this.tables.length + 1) {
|
||||
if (res.length === this.tables.length) {
|
||||
if (this.tables.every((item) => res.map((i) => i.name).includes(item))) {
|
||||
isVerified = true;
|
||||
}
|
||||
@@ -203,13 +203,13 @@ class TGSqlite {
|
||||
/**
|
||||
* @description 获取成就系列列表
|
||||
* @memberOf TGSqlite
|
||||
* @since Alpha v0.1.4
|
||||
* @returns {Promise<BTMuli.SQLite.AchievementSeries[]>}
|
||||
* @since Alpha v0.1.5
|
||||
* @returns {Promise<TGApp.Sqlite.Achievement.SeriesTable[]>}
|
||||
*/
|
||||
public async getAchievementSeries (): Promise<BTMuli.SQLite.AchievementSeries[]> {
|
||||
public async getAchievementSeries (): Promise<TGApp.Sqlite.Achievement.SeriesTable[]> {
|
||||
const db = await Database.load(this.dbPath);
|
||||
const sql = "SELECT * FROM AchievementSeries ORDER BY `order`;";
|
||||
const res: BTMuli.SQLite.AchievementSeries[] = await db.select(sql);
|
||||
const res: TGApp.Sqlite.Achievement.SeriesTable[] = await db.select(sql);
|
||||
await db.close();
|
||||
return res;
|
||||
}
|
||||
@@ -217,17 +217,14 @@ class TGSqlite {
|
||||
/**
|
||||
* @description 获取成就系列对应的名片
|
||||
* @memberOf TGSqlite
|
||||
* @since Alpha v0.1.4
|
||||
* @since Alpha v0.1.5
|
||||
* @param {number} seriesId 系列 ID
|
||||
* @returns {Promise<BTMuli.SQLite.NameCard>}
|
||||
* @returns {Promise<TGApp.Sqlite.NameCard.Item>}
|
||||
*/
|
||||
public async getNameCard (seriesId: number): Promise<BTMuli.SQLite.NameCard> {
|
||||
public async getNameCard (seriesId: number): Promise<TGApp.Sqlite.NameCard.Item> {
|
||||
const db = await Database.load(this.dbPath);
|
||||
const sql = `SELECT *
|
||||
FROM NameCard
|
||||
WHERE name = (SELECT nameCard FROM AchievementSeries WHERE id = ${seriesId});
|
||||
`;
|
||||
const res: BTMuli.SQLite.NameCard[] = await db.select(sql);
|
||||
const sql = `SELECT * FROM NameCard WHERE name = (SELECT nameCard FROM AchievementSeries WHERE id = ${seriesId});`;
|
||||
const res: TGApp.Sqlite.NameCard.Item[] = await db.select(sql);
|
||||
await db.close();
|
||||
return res[0];
|
||||
}
|
||||
@@ -236,10 +233,10 @@ class TGSqlite {
|
||||
* @description 获取成就列表
|
||||
* @memberOf TGSqlite
|
||||
* @param {number} [seriesId] 系列 ID
|
||||
* @since Alpha v0.1.4
|
||||
* @returns {Promise<BTMuli.SQLite.Achievements[]>}
|
||||
* @since Alpha v0.1.5
|
||||
* @returns {Promise<TGApp.Sqlite.Achievement.SingleTable[]>}
|
||||
*/
|
||||
public async getAchievements (seriesId?: number): Promise<BTMuli.SQLite.Achievements[]> {
|
||||
public async getAchievements (seriesId?: number): Promise<TGApp.Sqlite.Achievement.SingleTable[]> {
|
||||
const db = await Database.load(this.dbPath);
|
||||
let sql;
|
||||
if (seriesId) {
|
||||
@@ -247,7 +244,7 @@ class TGSqlite {
|
||||
} else {
|
||||
sql = "SELECT * FROM Achievements ORDER BY isCompleted, `order`;";
|
||||
}
|
||||
const res: BTMuli.SQLite.Achievements[] = await db.select(sql);
|
||||
const res: TGApp.Sqlite.Achievement.SingleTable[] = await db.select(sql);
|
||||
await db.close();
|
||||
return res;
|
||||
}
|
||||
@@ -270,24 +267,20 @@ class TGSqlite {
|
||||
* @description 查询成就
|
||||
* @memberOf TGSqlite
|
||||
* @param {string} keyword 关键词
|
||||
* @since Alpha v0.1.4
|
||||
* @returns {Promise<BTMuli.SQLite.Achievements[]>}
|
||||
* @since Alpha v0.1.5
|
||||
* @returns {Promise<TGApp.Sqlite.Achievement.SingleTable[]>}
|
||||
*/
|
||||
public async searchAchievements (keyword: string): Promise<BTMuli.SQLite.Achievements[]> {
|
||||
public async searchAchievements (keyword: string): Promise<TGApp.Sqlite.Achievement.SingleTable[]> {
|
||||
const db = await Database.load(this.dbPath);
|
||||
let sql;
|
||||
if (keyword.startsWith("v")) {
|
||||
const version = keyword.replace("v", "");
|
||||
sql = `SELECT * FROM Achievements WHERE version LIKE '%${version}%' ORDER BY isCompleted, \`order\`;`;
|
||||
} else {
|
||||
sql = `SELECT *
|
||||
FROM Achievements
|
||||
WHERE name LIKE '%${keyword}%'
|
||||
OR description LIKE '%${keyword}%'
|
||||
ORDER BY isCompleted, \`order\`;
|
||||
`;
|
||||
sql = `SELECT * FROM Achievements WHERE name LIKE '%${keyword}%' OR description LIKE '%${keyword}%'
|
||||
ORDER BY isCompleted, \`order\`;`;
|
||||
}
|
||||
const res: BTMuli.SQLite.Achievements[] = await db.select(sql);
|
||||
const res: TGApp.Sqlite.Achievement.SingleTable[] = await db.select(sql);
|
||||
await db.close();
|
||||
return res;
|
||||
}
|
||||
@@ -295,11 +288,11 @@ class TGSqlite {
|
||||
/**
|
||||
* @description 合并 UIAF 数据
|
||||
* @memberOf TGSqlite
|
||||
* @param {BTMuli.UIAF.Achievement[]} achievements UIAF 数据
|
||||
* @param {TGApp.Plugins.UIAF.Achievement[]} achievements UIAF 数据
|
||||
* @since Alpha v0.1.4
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
public async mergeUIAF (achievements: TGPlugin.UIAF.Achievement[]): Promise<void> {
|
||||
public async mergeUIAF (achievements: TGApp.Plugins.UIAF.Achievement[]): Promise<void> {
|
||||
const db = await Database.load(this.dbPath);
|
||||
const sql = importUIAFData(achievements);
|
||||
for (const item of sql) {
|
||||
@@ -312,14 +305,14 @@ class TGSqlite {
|
||||
* @description 获取 UIAF 数据
|
||||
* @memberOf TGSqlite
|
||||
* @since Alpha v0.1.4
|
||||
* @returns {Promise<TGPlugin.UIAF.Achievement[]>}
|
||||
* @returns {Promise<TGApp.Plugins.UIAF.Achievement[]>}
|
||||
*/
|
||||
public async getUIAF (): Promise<TGPlugin.UIAF.Achievement[]> {
|
||||
public async getUIAF (): Promise<TGApp.Plugins.UIAF.Achievement[]> {
|
||||
const db = await Database.load(this.dbPath);
|
||||
const sql = "SELECT * FROM Achievements WHERE isCompleted = 1 OR progress > 0";
|
||||
const res: BTMuli.SQLite.Achievements[] = await db.select(sql);
|
||||
const res: TGApp.Sqlite.Achievement.SingleTable[] = await db.select(sql);
|
||||
await db.close();
|
||||
const achievements: TGPlugin.UIAF.Achievement[] = [];
|
||||
const achievements: TGApp.Plugins.UIAF.Achievement[] = [];
|
||||
for (const item of res) {
|
||||
const completed = item.isCompleted === 1;
|
||||
const status = getUiafStatus(completed, item.progress);
|
||||
|
||||
@@ -49,9 +49,9 @@ export function getUiafStatus (completed: boolean, progress: number): number {
|
||||
/**
|
||||
* @description 获取 UIAF 头部信息
|
||||
* @since Alpha v0.1.3
|
||||
* @returns {Promise<TGPlugin.UIAF.Header>}
|
||||
* @returns {Promise<TGApp.Plugins.UIAF.Export>}
|
||||
*/
|
||||
export async function getUiafHeader (): Promise<TGPlugin.UIAF.Header> {
|
||||
export async function getUiafHeader (): Promise<TGApp.Plugins.UIAF.Export> {
|
||||
return {
|
||||
// eslint-disable-next-line camelcase
|
||||
export_app: "Tauri.Genshin",
|
||||
@@ -73,7 +73,7 @@ export async function getUiafHeader (): Promise<TGPlugin.UIAF.Header> {
|
||||
*/
|
||||
export async function verifyUiafData (path: string): Promise<boolean> {
|
||||
const fileData: string = await fs.readTextFile(path);
|
||||
const UiafData: TGPlugin.UIAF.Header = JSON.parse(fileData).info;
|
||||
const UiafData: TGApp.Plugins.UIAF.Export = JSON.parse(fileData).info;
|
||||
return UiafData.uiaf_version !== undefined;
|
||||
}
|
||||
|
||||
@@ -99,10 +99,10 @@ export async function readUiafData (userPath: string): Promise<string | false> {
|
||||
/**
|
||||
* @description 根据成就数据导出 UIAF 数据
|
||||
* @since Alpha v0.1.4
|
||||
* @param {TGPlugin.UIAF.Achievement[]} achievementData - 成就数据
|
||||
* @param {TGApp.Plugins.UIAF.Achievement[]} achievementData - 成就数据
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
export async function backupUiafData (achievementData: TGPlugin.UIAF.Achievement[]): Promise<void> {
|
||||
export async function backupUiafData (achievementData: TGApp.Plugins.UIAF.Achievement[]): Promise<void> {
|
||||
const savePath = `${await path.appLocalDataDir()}\\userData\\UIAF.json`;
|
||||
await fs.writeTextFile(savePath, JSON.stringify(achievementData, null, 2));
|
||||
}
|
||||
@@ -118,7 +118,7 @@ export async function restoreUiafData (): Promise<boolean> {
|
||||
if (!await fs.exists(uiafPath)) {
|
||||
return false;
|
||||
}
|
||||
const uiafData = JSON.parse(await fs.readTextFile(uiafPath)) as TGPlugin.UIAF.Achievement[];
|
||||
const uiafData = JSON.parse(await fs.readTextFile(uiafPath)) as TGApp.Plugins.UIAF.Achievement[];
|
||||
await TGSqlite.mergeUIAF(uiafData);
|
||||
return true;
|
||||
}
|
||||
|
||||
18
src/utils/minifySql.ts
Normal file
18
src/utils/minifySql.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* @file utils minifySql.ts
|
||||
* @description 减少 sql 语句体积的工具函数
|
||||
* @author BTMuli<bt-muli@outlook.com>
|
||||
* @since Alpha v0.1.5
|
||||
*/
|
||||
|
||||
/**
|
||||
* @description 减少 sql 语句体积的工具函数
|
||||
* @function minifySql
|
||||
* @param {string} sql - sql 语句
|
||||
* @return {string} minifiedSql - 减少体积后的 sql 语句
|
||||
*/
|
||||
function minifySql (sql: string): string {
|
||||
return sql.replace(/\n/g, " ").replace(/\s+/g, " ").trim();
|
||||
}
|
||||
|
||||
export default minifySql;
|
||||
Reference in New Issue
Block a user