From ac6eb247df4cfe5d57172bc10fbda0ccefbc31b1 Mon Sep 17 00:00:00 2001 From: Hachi-R Date: Tue, 17 Dec 2024 13:15:55 -0300 Subject: [PATCH] feat: implement reset game achievements functionality --- src/main/events/index.ts | 1 + .../events/library/reset-game-achievements.ts | 52 +++++++++++++++++++ src/preload/index.ts | 2 + src/renderer/src/declaration.d.ts | 2 +- .../modals/game-options-modal.tsx | 7 ++- .../modals/reset-achievements-modal.tsx | 6 +-- 6 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 src/main/events/library/reset-game-achievements.ts diff --git a/src/main/events/index.ts b/src/main/events/index.ts index eff62531..e26ed91c 100644 --- a/src/main/events/index.ts +++ b/src/main/events/index.ts @@ -25,6 +25,7 @@ import "./library/verify-executable-path"; import "./library/remove-game"; import "./library/remove-game-from-library"; import "./library/select-game-wine-prefix"; +import "./library/reset-game-achievements"; import "./misc/open-checkout"; import "./misc/open-external"; import "./misc/show-open-dialog"; diff --git a/src/main/events/library/reset-game-achievements.ts b/src/main/events/library/reset-game-achievements.ts new file mode 100644 index 00000000..7780c3ed --- /dev/null +++ b/src/main/events/library/reset-game-achievements.ts @@ -0,0 +1,52 @@ +import { gameAchievementRepository, gameRepository } from "@main/repository"; +import { registerEvent } from "../register-event"; +import { findAchievementFiles } from "@main/services/achievements/find-achivement-files"; +import fs from "fs"; +import { WindowManager } from "@main/services"; +import { getUnlockedAchievements } from "../user/get-unlocked-achievements"; + +const resetGameAchievements = async ( + _event: Electron.IpcMainInvokeEvent, + gameId: number +) => { + const game = await gameRepository.findOne({ where: { id: gameId } }); + + if (!game) return; + + const achievementFiles = findAchievementFiles(game); + + if (achievementFiles.length) { + try { + await Promise.all( + achievementFiles.map(async (achievementFile) => { + await fs.promises.rm(achievementFile.filePath, { recursive: true }); + }) + ); + } catch (error) { + console.error(error); + } + } + + await gameAchievementRepository.update( + { objectId: game.objectID }, + { + unlockedAchievements: null, + achievements: null, + } + ); + + // TODO: remove from db + + const gameAchievements = await getUnlockedAchievements( + game.objectID, + game.shop, + false + ); + + WindowManager.mainWindow?.webContents.send( + `on-update-achievements-${game.objectID}-${game.shop}`, + gameAchievements + ); +}; + +registerEvent("resetGameAchievements", resetGameAchievements); diff --git a/src/preload/index.ts b/src/preload/index.ts index f9d19644..d100228f 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -110,6 +110,8 @@ contextBridge.exposeInMainWorld("electron", { ipcRenderer.invoke("deleteGameFolder", gameId), getGameByObjectId: (objectId: string) => ipcRenderer.invoke("getGameByObjectId", objectId), + resetGameAchievements: (gameId: number) => + ipcRenderer.invoke("resetGameAchievements", gameId), onGamesRunning: ( cb: ( gamesRunning: Pick[] diff --git a/src/renderer/src/declaration.d.ts b/src/renderer/src/declaration.d.ts index 93c423e0..343c3ffe 100644 --- a/src/renderer/src/declaration.d.ts +++ b/src/renderer/src/declaration.d.ts @@ -105,7 +105,7 @@ declare global { ) => void ) => () => Electron.IpcRenderer; onLibraryBatchComplete: (cb: () => void) => () => Electron.IpcRenderer; - + resetGameAchievements: (gameId: number) => Promise; /* User preferences */ getUserPreferences: () => Promise; updateUserPreferences: ( diff --git a/src/renderer/src/pages/game-details/modals/game-options-modal.tsx b/src/renderer/src/pages/game-details/modals/game-options-modal.tsx index 0d1fdc2c..c4592e13 100644 --- a/src/renderer/src/pages/game-details/modals/game-options-modal.tsx +++ b/src/renderer/src/pages/game-details/modals/game-options-modal.tsx @@ -122,6 +122,11 @@ export function GameOptionsModal({ const shouldShowWinePrefixConfiguration = window.electron.platform === "linux"; + const handleResetAchievements = async () => { + await window.electron.resetGameAchievements(game.id); + updateGame(); + }; + return ( <> setShowResetAchievementsModal(false)} - // resetAchievements={handleResetAchievements} + resetAchievements={handleResetAchievements} game={game} /> diff --git a/src/renderer/src/pages/game-details/modals/reset-achievements-modal.tsx b/src/renderer/src/pages/game-details/modals/reset-achievements-modal.tsx index 409fedbe..d8861076 100644 --- a/src/renderer/src/pages/game-details/modals/reset-achievements-modal.tsx +++ b/src/renderer/src/pages/game-details/modals/reset-achievements-modal.tsx @@ -7,19 +7,19 @@ interface ResetAchievementsModalProps { visible: boolean; game: Game; onClose: () => void; -// resetAchievements: () => Promise; + resetAchievements: () => Promise; } export function ResetAchievementsModal({ onClose, game, visible, -// resetAchievements, + resetAchievements, }: ResetAchievementsModalProps) { const { t } = useTranslation("game_details"); const handleResetAchievements = async () => { - // await resetAchievements(); + await resetAchievements(); onClose(); };