/** * @file plugins/Sqlite/modules/userAchi.ts * @description 用户成就模块 * @since Beta v0.4.7 */ import { getUiafStatus } from "../../../utils/UIAF.js"; import TGSqlite from "../index"; import { importUIAFData } from "../sql/updateData"; /** * @description 获取成就概况 * @since Beta v0.4.7 * @returns {Promise 成就概况 */ async function getOverview(): Promise { const db = await TGSqlite.getDB(); const res = await db.select( "SELECT SUM(totalCount) as total,SUM(finCount) AS fin From AchievementSeries", ); return res[0]; } /** * @description 获取最新成就版本 * @since Beta v0.4.7 * @returns {Promise} 最新成就版本 */ async function getLatestAchiVersion(): Promise { const db = await TGSqlite.getDB(); type resType = { version: string }; const res = await db.select( "SELECT version FROM Achievements ORDER BY version DESC LIMIT 1;", ); return res[0].version; } /** * @description 获取成就系列数据 * @since Beta v0.4.7 * @param {number|undefined} id 成就系列ID * @returns {Promise} 成就系列数据 */ async function getSeries(id?: number): Promise { const db = await TGSqlite.getDB(); let res: TGApp.Sqlite.Achievement.SeriesTable[]; if (id === undefined) { res = await db.select( "SELECT * FROM AchievementSeries ORDER BY `order`;", ); } else { res = await db.select( "SELECT * FROM AchievementSeries WHERE id = ?;", [id], ); } return res; } /** * @description 获取成就数据 * @since Beta v0.4.7 * @param {number|undefined} id 成就系列ID * @returns {Promise} 成就数据 */ async function getAchievements(id?: string): Promise { const db = await TGSqlite.getDB(); let res: TGApp.Sqlite.Achievement.SingleTable[]; if (id === undefined) { res = await db.select( "SELECT * FROM Achievements ORDER BY isCompleted,`order`;", ); } else { res = await db.select( "SELECT * FROM Achievements WHERE series = ? ORDER BY `order`;", [id], ); } return res; } /** * @description 获取成就名片 * @since Beta v0.4.7 * @param {string} id 成就系列ID * @returns {Promise} 成就名片 */ async function getSeriesNameCard(id: string): Promise { const db = await TGSqlite.getDB(); type resType = { nameCard: string }; const res = await db.select("SELECT nameCard FROM AchievementSeries WHERE id = ?;", [ id, ]); return res[0].nameCard; } /** * @description 查找成就数据 * @since Beta v0.4.7 * @param {string} keyword 关键词 * @returns {Promise} 成就数据 */ async function searchAchievements( keyword: string, ): Promise { if (keyword === "") return await getAchievements(); const db = await TGSqlite.getDB(); const versionReg = /^v\d+(\.\d+)?$/; if (versionReg.test(keyword)) { return await db.select( "SELECT * FROM Achievements WHERE version LIKE ? ORDER BY isCompleted,`order`;", [keyword], ); } return await db.select( "SELECT * FROM Achievements WHERE name LIKE ? OR description LIKE ? ORDER BY isCompleted,`order`;", [`%${keyword}%`, `%${keyword}%`], ); } /** * @description 更新成就数据 * @since Beta v0.4.7 * @param {TGApp.Sqlite.Achievement.SingleTable} data UIAF数据 * @returns {Promise} */ async function updateAchievement(data: TGApp.Sqlite.Achievement.SingleTable): Promise { const db = await TGSqlite.getDB(); await db.execute("UPDATE Achievements SET isCompleted = ?, completedTime = ? WHERE id = ?;", [ data.isCompleted, data.completedTime.toString(), data.id, ]); } /** * @description 将数据库数据转换为UIAF数据 * @since Beta v0.4.7 * @param {TGApp.Sqlite.Achievement.SingleTable} data 数据库数据 * @returns {TGApp.Plugins.UIAF.Achievement} UIAF数据 */ function transDb2Uiaf(data: TGApp.Sqlite.Achievement.SingleTable): TGApp.Plugins.UIAF.Achievement { const isCompleted = data.isCompleted === 1; let timestamp = 0; if (isCompleted) timestamp = new Date(data.completedTime).getTime(); const status = getUiafStatus(isCompleted, data.progress); return { id: data.id, timestamp: timestamp, current: data.progress, status, }; } /** * @description 获取UIAF数据 * @since Beta v0.4.7 * @returns {Promise} */ async function getUIAF(): Promise { const db = await TGSqlite.getDB(); const data = await db.select("SELECT * FROM Achievements;"); const res: TGApp.Plugins.UIAF.Achievement[] = []; for (const item: TGApp.Sqlite.Achievement.SingleTable of data) { res.push(transDb2Uiaf(item)); } return res; } /** * @description 合并UIAF数据 * @since Beta v0.4.7 * @param {TGApp.Plugins.UIAF.Achievement[]} data UIAF数据 * @returns {Promise} */ async function mergeUIAF(data: TGApp.Plugins.UIAF.Achievement[]): Promise { const db = await TGSqlite.getDB(); for (const item of data) { const sql = importUIAFData(item); await db.execute(sql); } } const TSUserAchi = { getOverview, getLatestAchiVersion, getSeries, getSeriesNameCard, getAchievements, searchAchievements, updateAchievement, getUIAF, mergeUIAF, }; export default TSUserAchi;