From 944f3891bf3ed007c68394c2acd216dd0c952df9 Mon Sep 17 00:00:00 2001 From: Chubby Granny Chaser Date: Wed, 19 Jun 2024 02:35:57 +0100 Subject: [PATCH] feat: dispatching event when remote games are fetched --- src/main/main.ts | 7 ++----- src/main/services/hydra-api.ts | 6 ++---- src/main/services/library-sync/index.ts | 4 ++-- ...remote-games.ts => merge-with-remote-games.ts} | 2 +- ...pload-batch-games.ts => upload-games-batch.ts} | 15 ++++++++++++--- src/preload/index.ts | 6 ++++++ src/renderer/src/app.tsx | 5 ++++- src/renderer/src/declaration.d.ts | 3 ++- 8 files changed, 31 insertions(+), 17 deletions(-) rename src/main/services/library-sync/{get-remote-games.ts => merge-with-remote-games.ts} (97%) rename src/main/services/library-sync/{upload-batch-games.ts => upload-games-batch.ts} (66%) diff --git a/src/main/main.ts b/src/main/main.ts index 6c82fe34..1abd8c2f 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -10,7 +10,7 @@ import { fetchDownloadSourcesAndUpdate } from "./helpers"; import { publishNewRepacksNotifications } from "./services/notifications"; import { MoreThan } from "typeorm"; import { HydraApi } from "./services/hydra-api"; -import { getRemoteGames, uploadBatchGames } from "./services/library-sync"; +import { uploadGamesBatch } from "./services/library-sync"; startMainLoop(); @@ -23,10 +23,7 @@ const loadState = async (userPreferences: UserPreferences | null) => { RealDebridClient.authorize(userPreferences?.realDebridApiToken); HydraApi.setupApi().then(async () => { - if (HydraApi.isLoggedIn()) { - await uploadBatchGames(); - getRemoteGames(); - } + if (HydraApi.isLoggedIn()) uploadGamesBatch(); }); const [nextQueueItem] = await downloadQueueRepository.find({ diff --git a/src/main/services/hydra-api.ts b/src/main/services/hydra-api.ts index 7b50f7a9..009d15ac 100644 --- a/src/main/services/hydra-api.ts +++ b/src/main/services/hydra-api.ts @@ -2,7 +2,7 @@ import { userAuthRepository } from "@main/repository"; import axios, { AxiosError, AxiosInstance } from "axios"; import { WindowManager } from "./window-manager"; import url from "url"; -import { getRemoteGames, uploadBatchGames } from "./library-sync"; +import { uploadGamesBatch } from "./library-sync"; export class HydraApi { private static instance: AxiosInstance; @@ -50,9 +50,7 @@ export class HydraApi { if (WindowManager.mainWindow) { WindowManager.mainWindow.webContents.send("on-signin"); - - await uploadBatchGames(); - await getRemoteGames(); + uploadGamesBatch(); } } diff --git a/src/main/services/library-sync/index.ts b/src/main/services/library-sync/index.ts index aa0d94de..24fafc03 100644 --- a/src/main/services/library-sync/index.ts +++ b/src/main/services/library-sync/index.ts @@ -1,4 +1,4 @@ -export * from "./get-remote-games"; -export * from "./upload-batch-games"; +export * from "./merge-with-remote-games"; +export * from "./upload-games-batch"; export * from "./update-game-playtime"; export * from "./create-game"; diff --git a/src/main/services/library-sync/get-remote-games.ts b/src/main/services/library-sync/merge-with-remote-games.ts similarity index 97% rename from src/main/services/library-sync/get-remote-games.ts rename to src/main/services/library-sync/merge-with-remote-games.ts index 1a85ca2d..e31310fc 100644 --- a/src/main/services/library-sync/get-remote-games.ts +++ b/src/main/services/library-sync/merge-with-remote-games.ts @@ -5,7 +5,7 @@ import { getSteamAppAsset } from "@main/helpers"; import { logger } from "../logger"; import { AxiosError } from "axios"; -export const getRemoteGames = async () => { +export const mergeWithRemoteGames = async () => { try { const games = await HydraApi.get("/games"); diff --git a/src/main/services/library-sync/upload-batch-games.ts b/src/main/services/library-sync/upload-games-batch.ts similarity index 66% rename from src/main/services/library-sync/upload-batch-games.ts rename to src/main/services/library-sync/upload-games-batch.ts index 5f12522b..63eee82a 100644 --- a/src/main/services/library-sync/upload-batch-games.ts +++ b/src/main/services/library-sync/upload-games-batch.ts @@ -5,13 +5,17 @@ import { HydraApi } from "../hydra-api"; import { logger } from "../logger"; import { AxiosError } from "axios"; -export const uploadBatchGames = async () => { +import { mergeWithRemoteGames } from "./merge-with-remote-games"; +import { WindowManager } from "../window-manager"; + +export const uploadGamesBatch = async () => { try { const games = await gameRepository.find({ where: { remoteId: IsNull(), isDeleted: false }, }); const gamesChunks = chunk(games, 200); + for (const chunk of gamesChunks) { await HydraApi.post( "/games/batch", @@ -25,11 +29,16 @@ export const uploadBatchGames = async () => { }) ); } + + await mergeWithRemoteGames(); + + if (WindowManager.mainWindow) + WindowManager.mainWindow.webContents.send("on-library-batch-complete"); } catch (err) { if (err instanceof AxiosError) { - logger.error("uploadBatchGames", err.response, err.message); + logger.error("uploadGamesBatch", err.response, err.message); } else { - logger.error("uploadBatchGames", err); + logger.error("uploadGamesBatch", err); } } }; diff --git a/src/preload/index.ts b/src/preload/index.ts index faae6ef9..883091f6 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -96,6 +96,12 @@ contextBridge.exposeInMainWorld("electron", { ipcRenderer.on("on-game-close", listener); return () => ipcRenderer.removeListener("on-game-close", listener); }, + onLibraryBatchComplete: (cb: () => void) => { + const listener = (_event: Electron.IpcRendererEvent) => cb(); + ipcRenderer.on("on-library-batch-complete", listener); + return () => + ipcRenderer.removeListener("on-library-batch-complete", listener); + }, /* Hardware */ getDiskFreeSpace: (path: string) => diff --git a/src/renderer/src/app.tsx b/src/renderer/src/app.tsx index 792a2df2..916105e7 100644 --- a/src/renderer/src/app.tsx +++ b/src/renderer/src/app.tsx @@ -81,6 +81,9 @@ export function App() { window.electron.onSignIn(() => { updateUser(); }), + window.electron.onLibraryBatchComplete(() => { + updateLibrary(); + }), window.electron.onSignOut(() => { clearUser(); }), @@ -89,7 +92,7 @@ export function App() { return () => { listeners.forEach((unsubscribe) => unsubscribe()); }; - }, [updateUser, clearUser]); + }, [updateUser, updateLibrary, clearUser]); const handleSearch = useCallback( (query: string) => { diff --git a/src/renderer/src/declaration.d.ts b/src/renderer/src/declaration.d.ts index 48c7bdc6..dd73ffb5 100644 --- a/src/renderer/src/declaration.d.ts +++ b/src/renderer/src/declaration.d.ts @@ -73,6 +73,7 @@ declare global { getGameByObjectID: (objectID: string) => Promise; onPlaytime: (cb: (gameId: number) => void) => () => Electron.IpcRenderer; onGameClose: (cb: (gameId: number) => void) => () => Electron.IpcRenderer; + onLibraryBatchComplete: (cb: () => void) => () => Electron.IpcRenderer; /* User preferences */ getUserPreferences: () => Promise; @@ -111,7 +112,7 @@ declare global { checkForUpdates: () => Promise; restartAndInstallUpdate: () => Promise; - /* Authg */ + /* Auth */ signOut: () => Promise; onSignIn: (cb: () => void) => () => Electron.IpcRenderer; onSignOut: (cb: () => void) => () => Electron.IpcRenderer;