From 7ddbe149c17144205d96d7cceef51d03966476d5 Mon Sep 17 00:00:00 2001 From: BTMuli Date: Thu, 1 Jun 2023 19:51:40 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E6=B7=BB=E5=8A=A0=20AppCharacter?= =?UTF-8?q?=20=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/Sqlite/index.ts | 36 ++++++++-- src/plugins/Sqlite/sql/createTable.sql | 3 +- src/plugins/Sqlite/sql/initData.ts | 18 ++++- src/plugins/Sqlite/sql/insertData.ts | 95 ++++++++++++++++++++++---- src/types/Sqlite/Character.d.ts | 35 ++++++++++ 5 files changed, 168 insertions(+), 19 deletions(-) create mode 100644 src/types/Sqlite/Character.d.ts diff --git a/src/plugins/Sqlite/index.ts b/src/plugins/Sqlite/index.ts index 3ad9ba88..f801ed1e 100644 --- a/src/plugins/Sqlite/index.ts +++ b/src/plugins/Sqlite/index.ts @@ -29,6 +29,7 @@ class Sqlite { private readonly tables: string[] = [ "Achievements", "AchievementSeries", + "AppCharacters", "AppData", "GameAccount", "NameCard", @@ -187,7 +188,9 @@ class Sqlite { */ public async getNameCard (seriesId: number): Promise { const db = await Database.load(this.dbPath); - const sql = `SELECT * FROM NameCard WHERE name = (SELECT nameCard FROM AchievementSeries WHERE id = ${seriesId});`; + 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]; @@ -203,7 +206,10 @@ class Sqlite { const db = await Database.load(this.dbPath); let sql; if (seriesId) { - sql = `SELECT * FROM Achievements WHERE series=${seriesId} ORDER BY isCompleted, \`order\`;`; + sql = `SELECT * + FROM Achievements + WHERE series = ${seriesId} + ORDER BY isCompleted, \`order\`;`; } else { sql = "SELECT * FROM Achievements ORDER BY isCompleted, `order`;"; } @@ -249,9 +255,15 @@ class Sqlite { let sql; if (keyword.startsWith("v")) { const version = keyword.replace("v", ""); - sql = `SELECT * FROM Achievements WHERE version LIKE '%${version}%' ORDER BY isCompleted, \`order\`;`; + 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}%' + sql = `SELECT * + FROM Achievements + WHERE name LIKE '%${keyword}%' + OR description LIKE '%${keyword}%' ORDER BY isCompleted, \`order\`;`; } const res: TGApp.Sqlite.Achievement.SingleTable[] = await db.select(sql); @@ -318,11 +330,25 @@ class Sqlite { */ public async getAbyss (): Promise { const db = await Database.load(this.dbPath); - const sql = "SELECT * FROM SpiralAbyss"; + const sql = "SELECT * FROM SpiralAbyss order by id desc"; const res: TGApp.Sqlite.Abyss.SingleTable[] = await db.select(sql); await db.close(); return res; } + + /** + * @description 获取角色数据 + * @since Alpha v0.2.0 + * @param {number} id 角色 ID + * @returns {Promise 角色数据 + */ + public async getAppCharacter (id: number): Promise { + const db = await Database.load(this.dbPath); + const sql = `SELECT * FROM AppCharacters WHERE id = ${id}`; + const res: TGApp.Sqlite.Character.AppData[] = await db.select(sql); + await db.close(); + return res[0]; + } } const TGSqlite = new Sqlite(); diff --git a/src/plugins/Sqlite/sql/createTable.sql b/src/plugins/Sqlite/sql/createTable.sql index 0071cf21..33c8d7f0 100644 --- a/src/plugins/Sqlite/sql/createTable.sql +++ b/src/plugins/Sqlite/sql/createTable.sql @@ -42,7 +42,8 @@ create table if not exists AppCharacters star integer, element text, weapon text, - nameCard text default '无' + nameCard text, + updated text ); -- @brief 创建应用数据表 diff --git a/src/plugins/Sqlite/sql/initData.ts b/src/plugins/Sqlite/sql/initData.ts index caa31b3a..bb17ad07 100644 --- a/src/plugins/Sqlite/sql/initData.ts +++ b/src/plugins/Sqlite/sql/initData.ts @@ -9,11 +9,17 @@ import { app } from "@tauri-apps/api"; // utils import { getBuildTime } from "../../../utils/TGBuild"; -import { insertAchievementData, insertAchievementSeriesData, insertNameCardData } from "./insertData"; +import { + insertAchievementData, + insertAchievementSeriesData, + insertNameCardData, + insertCharacterData, +} from "./insertData"; import { AppAchievementsData, AppAchievementSeriesData, AppNameCardsData, + AppCharacterData, } from "../../../data"; /** @@ -73,6 +79,15 @@ function initNameCardData (): string[] { return AppNameCardsData.map((item) => insertNameCardData(item)); } +/** + * @description 初始化角色数据 + * @since Alpha v0.2.0 + * @returns {string[]} sql + */ +function initCharacterData (): string[] { + return AppCharacterData.map((item) => insertCharacterData(item)); +} + /** * @description 初始化数据 * @since Alpha v0.2.0 @@ -84,6 +99,7 @@ async function initDataSql (): Promise { sqlRes.push(...initAchievementSeriesData()); sqlRes.push(...initAchievementData()); sqlRes.push(...initNameCardData()); + sqlRes.push(...initCharacterData()); return sqlRes; } diff --git a/src/plugins/Sqlite/sql/insertData.ts b/src/plugins/Sqlite/sql/insertData.ts index fec242d4..5274601d 100644 --- a/src/plugins/Sqlite/sql/insertData.ts +++ b/src/plugins/Sqlite/sql/insertData.ts @@ -5,13 +5,17 @@ * @since Alpha v0.2.0 */ +// utils +import { timeToSecond } from "../utils/transTime"; +import { transCharacterData, transFloorData } from "../utils/transAbyssData"; + /** * @description 插入成就数据 * @since Alpha v0.2.0 * @param {TGApp.App.Achievement.Item} data 成就数据 * @returns {string} sql */ -export function insertAchievementData (data: TGApp.App.Achievement.Item): string { +export function insertAchievementData(data: TGApp.App.Achievement.Item): string { return ` INSERT INTO Achievements (id, series, "order", name, description, reward, completedTime, version, updated) VALUES (${data.id}, ${data.series}, ${data.order}, '${data.name}', '${data.description}', ${data.reward}, '', @@ -33,16 +37,17 @@ export function insertAchievementData (data: TGApp.App.Achievement.Item): string * @param {TGApp.App.Achievement.Series} data 成就系列数据 * @returns {string} sql */ -export function insertAchievementSeriesData (data: TGApp.App.Achievement.Series): string { +export function insertAchievementSeriesData(data: TGApp.App.Achievement.Series): string { return ` INSERT INTO AchievementSeries (id, "order", name, version, nameCard, updated) - VALUES (${data.id}, ${data.order}, '${data.name}', '${data.version}','${data.card}', datetime('now', 'localtime')) + VALUES (${data.id}, ${data.order}, '${data.name}', '${data.version}', '${data.card}', + datetime('now', 'localtime')) ON CONFLICT(id) DO UPDATE - SET name = '${data.name}', - "order" = ${data.order}, - version = '${data.version}', - nameCard = '${data.card}', - updated = datetime('now', 'localtime'); + SET name = '${data.name}', + "order" = ${data.order}, + version = '${data.version}', + nameCard = '${data.card}', + updated = datetime('now', 'localtime'); `; } @@ -53,11 +58,12 @@ export function insertAchievementSeriesData (data: TGApp.App.Achievement.Series) * @param {string} value 值 * @returns {string} sql */ -export function insertAppData (key: string, value: string): string { +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'); + ON CONFLICT(key) DO UPDATE SET value = '${value}', + updated = datetime('now', 'localtime'); `; } @@ -67,7 +73,7 @@ export function insertAppData (key: string, value: string): string { * @param {TGApp.User.Account.Game} data 游戏账号数据 * @returns {string} sql */ -export function insertGameAccountData (data: TGApp.User.Account.Game): string { +export function insertGameAccountData(data: TGApp.User.Account.Game): string { const isChosen = data.is_chosen ? 1 : 0; const isOfficial = data.is_official ? 1 : 0; return ` @@ -91,7 +97,7 @@ export function insertGameAccountData (data: TGApp.User.Account.Game): string { * @param {TGApp.App.NameCard.Item} data 名片数据 * @returns {string} sql */ -export function insertNameCardData (data: TGApp.App.NameCard.Item): string { +export function insertNameCardData(data: TGApp.App.NameCard.Item): string { return ` INSERT INTO NameCard (name, "desc", type, source, updated) VALUES ('${data.name}', '${data.desc}', '${data.type}', '${data.source}', datetime('now', 'localtime')) @@ -101,3 +107,68 @@ export function insertNameCardData (data: TGApp.App.NameCard.Item): string { updated = datetime('now', 'localtime'); `; } + +/** + * @description 插入角色数据 + * @since Alpha v0.2.0 + * @param {TGApp.User.Character.Item} data 角色数据 + * @returns {string} sql + */ +export function insertCharacterData(data: TGApp.App.Character.WikiBriefInfo): string { + return ` + INSERT INTO AppCharacters (id, name, star, element, weapon, nameCard, birthday, updated) + VALUES (${data.id}, '${data.name}', ${data.star}, '${data.element}', '${data.weapon}', + '${data.nameCard}', '${data.birthday}', datetime('now', 'localtime')) + ON CONFLICT(id) DO UPDATE + SET name = '${data.name}', + star = ${data.star}, + element = '${data.element}', + weapon = '${data.weapon}', + nameCard = '${data.nameCard}', + birthday = '${data.birthday}'; + `; +} + +/** + * @description 插入深渊数据 + * @since Alpha v0.2.0 + * @param {TGApp.User.Abyss} data 深渊数据 + * @returns {string} sql + */ +export function insertAbyssData(data: TGApp.Game.Abyss.FullData): string { + const startTime = timeToSecond(data.start_time); + const endTime = timeToSecond(data.end_time); + const isUnlock = data.is_unlock ? 1 : 0; + const revealRank = transCharacterData(data.reveal_rank); + const defeatRank = transCharacterData(data.defeat_rank); + const damageRank = transCharacterData(data.damage_rank); + const takeDamageRank = transCharacterData(data.take_damage_rank); + const normalSkillRank = transCharacterData(data.normal_skill_rank); + const energySkillRank = transCharacterData(data.energy_skill_rank); + const floors = transFloorData(data.floors); + return ` + INSERT INTO SpiralAbyss (id, startTime, endTime, totalBattleTimes, totalWinTimes, maxFloor, totalStar, isUnlock, + revealRank, defeatRank, damageRank, takeDamageRank, normalSkillRank, energySkillRank, + floors, updated) + VALUES (${data.schedule_id}, '${startTime}', '${endTime}', ${data.total_battle_times}, ${data.total_win_times}, + '${data.max_floor}', ${data.total_star}, + ${isUnlock}, '${revealRank}', '${defeatRank}', '${damageRank}', '${takeDamageRank}', '${normalSkillRank}', + '${energySkillRank}', '${floors}', datetime('now', 'localtime')) + ON CONFLICT(id) DO UPDATE + SET startTime = '${startTime}', + endTime = '${endTime}', + totalBattleTimes = ${data.total_battle_times}, + totalWinTimes = ${data.total_win_times}, + maxFloor = '${data.max_floor}', + totalStar = ${data.total_star}, + isUnlock = ${isUnlock}, + revealRank = '${revealRank}', + defeatRank = '${defeatRank}', + damageRank = '${damageRank}', + takeDamageRank = '${takeDamageRank}', + normalSkillRank = '${normalSkillRank}', + energySkillRank = '${energySkillRank}', + floors = '${floors}', + updated = datetime('now', 'localtime'); + `; +} diff --git a/src/types/Sqlite/Character.d.ts b/src/types/Sqlite/Character.d.ts new file mode 100644 index 00000000..fdbcccd6 --- /dev/null +++ b/src/types/Sqlite/Character.d.ts @@ -0,0 +1,35 @@ +/** + * @file types Sqlite Character.d.ts + * @description 角色相关类型定义文件 + * @author BTMuli + * @since Alpha v0.2.0 + */ + +declare namespace TGApp.Sqlite.Character { + /** + * @description 应用数据库中的角色类型 + * @since Alpha v0.2.0 + * @interface AppData + * @property {number} id - 角色 ID + * @property {string} name - 角色名称 + * @property {string} title - 角色称号 + * @property {string} birthday - 角色生日 + * @property {number} star - 角色星级 + * @property {string} element - 角色元素类型 + * @property {string} weapon - 角色武器类型 + * @property {string} nameCard - 角色名片 + * @property {string} updated - 数据更新时间 + * @return AppData + */ + export interface AppData { + id: number + name: string + title: string + birthday: string + star: number + element: string + weapon: string + nameCard: string + updated: string + } +}