From 500cd2a53100696036ac26c6f2e89cc00882ad5d Mon Sep 17 00:00:00 2001 From: Zamitto <167933696+zamitto@users.noreply.github.com> Date: Tue, 24 Sep 2024 13:04:46 -0300 Subject: [PATCH] feat: saving achievements on open launcher --- src/main/entity/game-achievements.entity.ts | 3 + .../get-game-achievements-to-watch.ts | 4 +- .../save-all-local-steam-achivements.ts | 82 +++++++++---------- .../steam/steam-find-game-achivement-files.ts | 16 ++-- .../achievements/util/parseAchievementFile.ts | 2 +- src/main/main.ts | 3 + .../20240919030940_create_game_achievement.ts | 11 +-- 7 files changed, 63 insertions(+), 58 deletions(-) diff --git a/src/main/entity/game-achievements.entity.ts b/src/main/entity/game-achievements.entity.ts index e50d3294..9bad73e5 100644 --- a/src/main/entity/game-achievements.entity.ts +++ b/src/main/entity/game-achievements.entity.ts @@ -16,6 +16,9 @@ export class GameAchievement { @JoinColumn() game: Game; + @Column("text", { nullable: true }) + unlockedAchievements: string; + @Column("text", { nullable: true }) achievements: string; } diff --git a/src/main/events/achievements/services/get-game-achievements-to-watch.ts b/src/main/events/achievements/services/get-game-achievements-to-watch.ts index c44d7b6b..e95ecd02 100644 --- a/src/main/events/achievements/services/get-game-achievements-to-watch.ts +++ b/src/main/events/achievements/services/get-game-achievements-to-watch.ts @@ -22,7 +22,9 @@ export const getGameAchievementsToWatch = async ( const steamId = Number(game.objectID); const achievements = await steamGetAchivement(game); + console.log(achievements); + if (!achievements || !achievements.length) return; const achievementFiles = steamFindGameAchievementFiles(game.objectID)[ @@ -50,7 +52,7 @@ export const getGameAchievementsToWatch = async ( game: { id: gameId }, }, { - achievements: JSON.stringify(checkedAchievements.all), + unlockedAchievements: JSON.stringify(checkedAchievements.all), } ); } diff --git a/src/main/events/achievements/services/save-all-local-steam-achivements.ts b/src/main/events/achievements/services/save-all-local-steam-achivements.ts index cb28edbe..dad2c2b8 100644 --- a/src/main/events/achievements/services/save-all-local-steam-achivements.ts +++ b/src/main/events/achievements/services/save-all-local-steam-achivements.ts @@ -1,11 +1,7 @@ import { gameAchievementRepository, gameRepository } from "@main/repository"; import { steamFindGameAchievementFiles } from "../steam/steam-find-game-achivement-files"; -import { steamGlobalAchievementPercentages } from "../steam/steam-global-achievement-percentages"; -import { steamAchievementInfo } from "../steam/steam-achievement-info"; -import { steamAchievementMerge } from "../steam/steam-achievement-merge"; import { parseAchievementFile } from "../util/parseAchievementFile"; -import { checkUnlockedAchievements } from "../util/check-unlocked-achievements"; -import { CheckedAchievements } from "../types"; +import { HydraApi } from "@main/services"; export const saveAllLocalSteamAchivements = async () => { const gameAchievementFiles = steamFindGameAchievementFiles(); @@ -19,56 +15,56 @@ export const saveAllLocalSteamAchivements = async () => { if (!game) continue; - const hasOnDb = await gameAchievementRepository.existsBy({ + const savedGameAchievements = await gameAchievementRepository.findOneBy({ game: game, }); - if (hasOnDb) continue; - - const achievementPercentage = - await steamGlobalAchievementPercentages(objectId); - - if (!achievementPercentage) { - await gameAchievementRepository.save({ - game, - achievements: "[]", - }); - continue; + if (!savedGameAchievements || !savedGameAchievements.achievements) { + HydraApi.get( + "/games/achievements", + { + shop: "steam", + objectId, + }, + { needsAuth: false } + ) + .then((achievements) => { + return gameAchievementRepository.upsert( + { + game: { id: game.id }, + achievements: JSON.stringify(achievements), + }, + ["game"] + ); + }) + .catch(console.log); } - const achievementInfo = await steamAchievementInfo(objectId); - - if (!achievementInfo) continue; - - const achievements = steamAchievementMerge( - achievementPercentage, - achievementInfo - ); - - if (!achievements) continue; - - const checkedAchievements: CheckedAchievements = { - all: achievements, - new: [], - }; + const unlockedAchievements: { name: string; unlockTime: number }[] = []; for (const achievementFile of gameAchievementFiles[key]) { const localAchievementFile = await parseAchievementFile( achievementFile.filePath ); - checkedAchievements.new.push( - ...checkUnlockedAchievements( - achievementFile.type, - localAchievementFile, - achievements - ).new - ); + console.log(achievementFile.filePath); + console.log(localAchievementFile); + + for (const a of Object.keys(localAchievementFile)) { + // TODO: use checkUnlockedAchievements after refactoring it to be generic + unlockedAchievements.push({ + name: a, + unlockTime: localAchievementFile[a].UnlockTime, + }); + } } - await gameAchievementRepository.save({ - game, - achievements: JSON.stringify(checkedAchievements.all), - }); + await gameAchievementRepository.upsert( + { + game: { id: game.id }, + unlockedAchievements: JSON.stringify(unlockedAchievements), + }, + ["game"] + ); } }; diff --git a/src/main/events/achievements/steam/steam-find-game-achivement-files.ts b/src/main/events/achievements/steam/steam-find-game-achivement-files.ts index cc73490a..631a3a74 100644 --- a/src/main/events/achievements/steam/steam-find-game-achivement-files.ts +++ b/src/main/events/achievements/steam/steam-find-game-achivement-files.ts @@ -1,21 +1,21 @@ import path from "node:path"; -import { existsSync, readdirSync } from "node:fs"; +import fs from "node:fs"; import { Cracker, GameAchievementFiles } from "../types"; import { app } from "electron"; const addGame = ( achievementFiles: GameAchievementFiles, - gamePath: string, + achievementPath: string, objectId: string, fileLocation: string[], type: Cracker ) => { - const filePath = path.join(gamePath, objectId, ...fileLocation); + const filePath = path.join(achievementPath, objectId, ...fileLocation); - if (existsSync(filePath)) { + if (fs.existsSync(filePath)) { const achivementFile = { type, - filePath: filePath, + filePath, }; achievementFiles[objectId] @@ -33,7 +33,7 @@ export const steamFindGameAchievementFiles = ( const gameAchievementFiles: GameAchievementFiles = {}; - const crackers: Cracker[] = [ + const crackers = [ Cracker.codex, Cracker.goldberg, Cracker.rune, @@ -55,9 +55,9 @@ export const steamFindGameAchievementFiles = ( fileLocation = ["achievements.ini"]; } - if (!existsSync(achievementPath)) continue; + if (!fs.existsSync(achievementPath)) continue; - const objectIds = readdirSync(achievementPath); + const objectIds = fs.readdirSync(achievementPath); if (objectId) { if (objectIds.includes(objectId)) { diff --git a/src/main/events/achievements/util/parseAchievementFile.ts b/src/main/events/achievements/util/parseAchievementFile.ts index 1adf9512..64aa120a 100644 --- a/src/main/events/achievements/util/parseAchievementFile.ts +++ b/src/main/events/achievements/util/parseAchievementFile.ts @@ -25,7 +25,7 @@ const iniParse = async (filePath: string) => { }); let objectName = ""; - const object: any = {}; + const object: Record> = {}; for await (const line of lines) { if (line.startsWith("###") || !line.length) continue; diff --git a/src/main/main.ts b/src/main/main.ts index af594e20..abaa93a7 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -16,6 +16,7 @@ import { publishNewRepacksNotifications } from "./services/notifications"; import { MoreThan } from "typeorm"; import { HydraApi } from "./services/hydra-api"; import { uploadGamesBatch } from "./services/library-sync"; +import { saveAllLocalSteamAchivements } from "./events/achievements/services/save-all-local-steam-achivements"; const loadState = async (userPreferences: UserPreferences | null) => { RepacksManager.updateRepacks(); @@ -58,6 +59,8 @@ const loadState = async (userPreferences: UserPreferences | null) => { if (newRepacksCount > 0) publishNewRepacksNotifications(newRepacksCount); }); + + saveAllLocalSteamAchivements(); }; userPreferencesRepository diff --git a/src/main/migrations/20240919030940_create_game_achievement.ts b/src/main/migrations/20240919030940_create_game_achievement.ts index 16d90fa7..a03ea2fc 100644 --- a/src/main/migrations/20240919030940_create_game_achievement.ts +++ b/src/main/migrations/20240919030940_create_game_achievement.ts @@ -3,16 +3,17 @@ import type { Knex } from "knex"; export const CreateGameAchievement: HydraMigration = { name: "CreateGameAchievement", - up: async (knex: Knex) => { - await knex.schema.createTable("game_achievement", (table) => { + up: (knex: Knex) => { + return knex.schema.createTable("game_achievement", (table) => { table.increments("id").primary(); - table.integer("gameId").notNullable(); + table.integer("gameId").notNullable().unique(); table.text("achievements"); + table.text("unlockedAchievements"); table.foreign("gameId").references("game.id").onDelete("CASCADE"); }); }, - down: async (knex: Knex) => { - await knex.schema.dropTable("game_achievement"); + down: (knex: Knex) => { + return knex.schema.dropTable("game_achievement"); }, };