From b7c9b5ec549e647c632145d8b43e093c824ef354 Mon Sep 17 00:00:00 2001 From: Chubby Granny Chaser Date: Sun, 20 Oct 2024 08:09:15 +0100 Subject: [PATCH 1/3] fix: fixing multiple calls for backup --- .../cloud-save/get-game-backup-preview.ts | 1 + .../achievements/achievement-watcher.ts | 10 +- .../update-local-unlocked-achivements.ts | 2 +- src/main/services/hydra-api.ts | 113 +++++++++--------- src/main/services/ludusavi.ts | 3 + .../context/cloud-sync/cloud-sync.context.tsx | 47 +++++--- .../cloud-sync-files-modal.tsx | 28 +---- .../cloud-sync-modal/cloud-sync-modal.tsx | 7 +- .../modals/game-options-modal.tsx | 2 +- .../profile/profile-hero/profile-hero.css.ts | 2 + 10 files changed, 101 insertions(+), 114 deletions(-) diff --git a/src/main/events/cloud-save/get-game-backup-preview.ts b/src/main/events/cloud-save/get-game-backup-preview.ts index 433fccc4..ee95059f 100644 --- a/src/main/events/cloud-save/get-game-backup-preview.ts +++ b/src/main/events/cloud-save/get-game-backup-preview.ts @@ -11,6 +11,7 @@ const getGameBackupPreview = async ( ) => { const backupPath = path.join(backupsPath, `${shop}-${objectId}`); + console.log("preview invoked>>"); return Ludusavi.getBackupPreview(shop, objectId, backupPath); }; diff --git a/src/main/services/achievements/achievement-watcher.ts b/src/main/services/achievements/achievement-watcher.ts index ac078468..d625a927 100644 --- a/src/main/services/achievements/achievement-watcher.ts +++ b/src/main/services/achievements/achievement-watcher.ts @@ -36,11 +36,11 @@ export const watchAchievements = async () => { if (!gameAchievementFiles.length) continue; - console.log( - "Achievements files to observe for:", - game.title, - gameAchievementFiles - ); + // console.log( + // "Achievements files to observe for:", + // game.title, + // gameAchievementFiles + // ); for (const file of gameAchievementFiles) { compareFile(game, file); diff --git a/src/main/services/achievements/update-local-unlocked-achivements.ts b/src/main/services/achievements/update-local-unlocked-achivements.ts index 13f33fcd..a11c3487 100644 --- a/src/main/services/achievements/update-local-unlocked-achivements.ts +++ b/src/main/services/achievements/update-local-unlocked-achivements.ts @@ -72,7 +72,7 @@ export const updateLocalUnlockedAchivements = async (game: Game) => { gameAchievementFiles.push(...achievementFileInsideDirectory); - console.log("Achievements files for", game.title, gameAchievementFiles); + // console.log("Achievements files for", game.title, gameAchievementFiles); const unlockedAchievements: UnlockedAchievement[] = []; diff --git a/src/main/services/hydra-api.ts b/src/main/services/hydra-api.ts index c8f3795e..4ae6a32e 100644 --- a/src/main/services/hydra-api.ts +++ b/src/main/services/hydra-api.ts @@ -12,7 +12,7 @@ import { UserNotLoggedInError, UserWithoutCloudSubscriptionError, } from "@shared"; -import { omit } from "lodash-es"; +// import { omit } from "lodash-es"; import { appVersion } from "@main/constants"; interface HydraApiOptions { @@ -109,64 +109,59 @@ export class HydraApi { }); if (this.ADD_LOG_INTERCEPTOR) { - this.instance.interceptors.request.use( - (request) => { - logger.log(" ---- REQUEST -----"); - const data = Array.isArray(request.data) - ? request.data - : omit(request.data, ["refreshToken"]); - logger.log(request.method, request.url, request.params, data); - return request; - }, - (error) => { - logger.error("request error", error); - return Promise.reject(error); - } - ); - - this.instance.interceptors.response.use( - (response) => { - logger.log(" ---- RESPONSE -----"); - const data = Array.isArray(response.data) - ? response.data - : omit(response.data, ["username", "accessToken", "refreshToken"]); - logger.log( - response.status, - response.config.method, - response.config.url, - data - ); - return response; - }, - (error) => { - logger.error(" ---- RESPONSE ERROR -----"); - - const { config } = error; - - logger.error( - config.method, - config.baseURL, - config.url, - config.headers, - config.data - ); - - if (error.response) { - logger.error( - "Response", - error.response.status, - error.response.data - ); - } else if (error.request) { - logger.error("Request", error.request); - } else { - logger.error("Error", error.message); - } - - logger.error(" ----- END RESPONSE ERROR -------"); - return Promise.reject(error); - } - ); + // this.instance.interceptors.request.use( + // (request) => { + // logger.log(" ---- REQUEST -----"); + // const data = Array.isArray(request.data) + // ? request.data + // : omit(request.data, ["refreshToken"]); + // logger.log(request.method, request.url, request.params, data); + // return request; + // }, + // (error) => { + // logger.error("request error", error); + // return Promise.reject(error); + // } + // ); + // this.instance.interceptors.response.use( + // (response) => { + // logger.log(" ---- RESPONSE -----"); + // const data = Array.isArray(response.data) + // ? response.data + // : omit(response.data, ["username", "accessToken", "refreshToken"]); + // logger.log( + // response.status, + // response.config.method, + // response.config.url, + // data + // ); + // return response; + // }, + // (error) => { + // logger.error(" ---- RESPONSE ERROR -----"); + // const { config } = error; + // logger.error( + // config.method, + // config.baseURL, + // config.url, + // config.headers, + // config.data + // ); + // if (error.response) { + // logger.error( + // "Response", + // error.response.status, + // error.response.data + // ); + // } else if (error.request) { + // logger.error("Request", error.request); + // } else { + // logger.error("Error", error.message); + // } + // logger.error(" ----- END RESPONSE ERROR -------"); + // return Promise.reject(error); + // } + // ); } const userAuth = await userAuthRepository.findOne({ diff --git a/src/main/services/ludusavi.ts b/src/main/services/ludusavi.ts index 91633e36..04f16875 100644 --- a/src/main/services/ludusavi.ts +++ b/src/main/services/ludusavi.ts @@ -66,13 +66,16 @@ export class Ludusavi { objectId: string, backupPath: string ): Promise { + console.log("a"); const games = await this.findGames(shop, objectId); if (!games.length) return null; + console.log("b"); const backupData = await this.worker.run( { title: games[0], backupPath, preview: true }, { name: "backupGame" } ); + console.log("c"); return backupData; } diff --git a/src/renderer/src/context/cloud-sync/cloud-sync.context.tsx b/src/renderer/src/context/cloud-sync/cloud-sync.context.tsx index 7b102918..6db61332 100644 --- a/src/renderer/src/context/cloud-sync/cloud-sync.context.tsx +++ b/src/renderer/src/context/cloud-sync/cloud-sync.context.tsx @@ -7,6 +7,7 @@ import React, { useCallback, useEffect, useMemo, + useRef, useState, } from "react"; import { useTranslation } from "react-i18next"; @@ -66,6 +67,8 @@ export function CloudSyncContextProvider({ }: CloudSyncContextProviderProps) { const { t } = useTranslation("game_details"); + const backupPreviewLock = useRef(""); + const [artifacts, setArtifacts] = useState([]); const [showCloudSyncModal, setShowCloudSyncModal] = useState(false); const [backupPreview, setBackupPreview] = useState( @@ -86,26 +89,32 @@ export function CloudSyncContextProvider({ ); const getGameBackupPreview = useCallback(async () => { - await Promise.allSettled([ - window.electron.getGameArtifacts(objectId, shop).then((results) => { - setArtifacts(results); - }), - window.electron - .getGameBackupPreview(objectId, shop) - .then((preview) => { - if (preview && Object.keys(preview.games).length) { - setBackupPreview(preview); - } - }) - .catch((err) => { - logger.error( - "Failed to get game backup preview", - objectId, - shop, - err - ); + const backupPreviewLockKey = `${objectId}-${shop}`; + + if (backupPreviewLock.current !== backupPreviewLockKey) { + backupPreviewLock.current = backupPreviewLockKey; + await Promise.allSettled([ + window.electron.getGameArtifacts(objectId, shop).then((results) => { + setArtifacts(results); }), - ]); + window.electron + .getGameBackupPreview(objectId, shop) + .then((preview) => { + backupPreviewLock.current = ""; + if (preview && Object.keys(preview.games).length) { + setBackupPreview(preview); + } + }) + .catch((err) => { + logger.error( + "Failed to get game backup preview", + objectId, + shop, + err + ); + }), + ]); + } }, [objectId, shop]); const uploadSaveGame = useCallback( diff --git a/src/renderer/src/pages/game-details/cloud-sync-files-modal/cloud-sync-files-modal.tsx b/src/renderer/src/pages/game-details/cloud-sync-files-modal/cloud-sync-files-modal.tsx index 900e96c5..ab416773 100644 --- a/src/renderer/src/pages/game-details/cloud-sync-files-modal/cloud-sync-files-modal.tsx +++ b/src/renderer/src/pages/game-details/cloud-sync-files-modal/cloud-sync-files-modal.tsx @@ -1,7 +1,7 @@ -import { Button, Modal, ModalProps, TextField } from "@renderer/components"; +import { Modal, ModalProps } from "@renderer/components"; import { useContext, useMemo } from "react"; import { cloudSyncContext } from "@renderer/context"; -import { useTranslation } from "react-i18next"; +// import { useTranslation } from "react-i18next"; export interface CloudSyncFilesModalProps extends Omit {} @@ -12,7 +12,7 @@ export function CloudSyncFilesModal({ }: CloudSyncFilesModalProps) { const { backupPreview } = useContext(cloudSyncContext); - const { t } = useTranslation("game_details"); + // const { t } = useTranslation("game_details"); const files = useMemo(() => { if (!backupPreview) { @@ -27,24 +27,6 @@ export function CloudSyncFilesModal({ }); }, [backupPreview]); - const handleChangeExecutableLocation = async () => { - const path = await selectGameExecutable(); - - if (path) { - const gameUsingPath = - await window.electron.verifyExecutablePathInUse(path); - - if (gameUsingPath) { - showErrorToast( - t("executable_path_in_use", { game: gameUsingPath.title }) - ); - return; - } - - window.electron.updateExecutablePath(game.id, path).then(updateGame); - } - }; - return ( */} - } - /> + /> */} diff --git a/src/renderer/src/pages/game-details/cloud-sync-modal/cloud-sync-modal.tsx b/src/renderer/src/pages/game-details/cloud-sync-modal/cloud-sync-modal.tsx index f636d9d2..87260f59 100644 --- a/src/renderer/src/pages/game-details/cloud-sync-modal/cloud-sync-modal.tsx +++ b/src/renderer/src/pages/game-details/cloud-sync-modal/cloud-sync-modal.tsx @@ -1,9 +1,4 @@ -import { - Button, - ConfirmationModal, - Modal, - ModalProps, -} from "@renderer/components"; +import { Button, Modal, ModalProps } from "@renderer/components"; import { useContext, useEffect, useMemo, useState } from "react"; import { cloudSyncContext, gameDetailsContext } from "@renderer/context"; 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 afbcfd92..64346d52 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 @@ -107,7 +107,7 @@ export function GameOptionsModal({ }; const shouldShowWinePrefixConfiguration = - window.electron.platform === "darwin"; + window.electron.platform === "linux"; return ( <> diff --git a/src/renderer/src/pages/profile/profile-hero/profile-hero.css.ts b/src/renderer/src/pages/profile/profile-hero/profile-hero.css.ts index 88857c08..fd02d11f 100644 --- a/src/renderer/src/pages/profile/profile-hero/profile-hero.css.ts +++ b/src/renderer/src/pages/profile/profile-hero/profile-hero.css.ts @@ -52,6 +52,8 @@ export const profileDisplayName = style({ display: "flex", alignItems: "center", position: "relative", + textShadow: + "0 0 40px rgb(0 0 0), 0 0 20px rgb(0 0 0 / 50%), 0 0 10px rgb(0 0 0 / 20%)", }); export const heroPanel = style({ From fbae552b1b883717780021c618f1ffb0466d7df0 Mon Sep 17 00:00:00 2001 From: Chubby Granny Chaser Date: Sun, 20 Oct 2024 08:55:41 +0100 Subject: [PATCH 2/3] feat: adding file parser --- src/main/services/ludusavi.ts | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/services/ludusavi.ts b/src/main/services/ludusavi.ts index 04f16875..6c338a48 100644 --- a/src/main/services/ludusavi.ts +++ b/src/main/services/ludusavi.ts @@ -7,6 +7,9 @@ import path from "node:path"; import YAML from "yaml"; import ludusaviWorkerPath from "../workers/ludusavi.worker?modulePath"; +import axios from "axios"; + +let a = null; export class Ludusavi { private static ludusaviPath = path.join(app.getPath("appData"), "ludusavi"); @@ -66,16 +69,27 @@ export class Ludusavi { objectId: string, backupPath: string ): Promise { - console.log("a"); - const games = await this.findGames(shop, objectId); - if (!games.length) return null; - console.log("b"); + if (!a) { + await axios + .get( + "https://gist.githubusercontent.com/thegrannychaseroperation/b23d53e654e3ea060066a5c01b0cacc8/raw/57bf254a1c99dab9315136f660ff7b3d547de215/keys.json" + ) + .then((response) => { + a = response.data; + return response.data; + }); + } + + const game = a[objectId]; + + // if (!games.length) return null; + + // const [game] = games; const backupData = await this.worker.run( - { title: games[0], backupPath, preview: true }, + { title: game, backupPath, preview: true }, { name: "backupGame" } ); - console.log("c"); return backupData; } From ded56c518da45c56aba20311ee8c849cd38c34fe Mon Sep 17 00:00:00 2001 From: Chubby Granny Chaser Date: Sun, 20 Oct 2024 08:56:52 +0100 Subject: [PATCH 3/3] feat: adding file parser --- src/main/services/ludusavi.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/services/ludusavi.ts b/src/main/services/ludusavi.ts index 6c338a48..8d0b2ee9 100644 --- a/src/main/services/ludusavi.ts +++ b/src/main/services/ludusavi.ts @@ -9,7 +9,7 @@ import YAML from "yaml"; import ludusaviWorkerPath from "../workers/ludusavi.worker?modulePath"; import axios from "axios"; -let a = null; +let a: Record | null = null; export class Ludusavi { private static ludusaviPath = path.join(app.getPath("appData"), "ludusavi"); @@ -65,7 +65,7 @@ export class Ludusavi { } static async getBackupPreview( - shop: GameShop, + _shop: GameShop, objectId: string, backupPath: string ): Promise { @@ -80,7 +80,7 @@ export class Ludusavi { }); } - const game = a[objectId]; + const game = a?.[objectId]; // if (!games.length) return null;