Merge branch 'main' into fix-catalogue-decode-publishers

This commit is contained in:
Chubby Granny Chaser
2025-05-30 05:38:27 +01:00
committed by GitHub
6 changed files with 54 additions and 3 deletions

View File

@@ -20,6 +20,7 @@ import "./library/create-game-shortcut";
import "./library/close-game";
import "./library/delete-game-folder";
import "./library/get-game-by-object-id";
import "./library/sync-game-by-object-id";
import "./library/get-library";
import "./library/extract-game-download";
import "./library/open-game";

View File

@@ -0,0 +1,28 @@
import { registerEvent } from "../register-event";
import { gamesSublevel, levelKeys } from "@main/level";
import { HydraApi } from "@main/services";
import type { GameShop, UserGameDetails } from "@types";
const syncGameByObjectId = async (
_event: Electron.IpcMainInvokeEvent,
shop: GameShop,
objectId: string
) => {
return HydraApi.get<UserGameDetails>(
`/profile/games/${shop}/${objectId}`
).then(async (res) => {
const { id, playTimeInSeconds, ...rest } = res;
const gameKey = levelKeys.game(shop, objectId);
await gamesSublevel.put(gameKey, {
...rest,
remoteId: id,
playTimeInMilliseconds: playTimeInSeconds * 1000,
});
return res;
});
};
registerEvent("syncGameByObjectId", syncGameByObjectId);

View File

@@ -187,6 +187,8 @@ contextBridge.exposeInMainWorld("electron", {
ipcRenderer.invoke("deleteGameFolder", shop, objectId),
getGameByObjectId: (shop: GameShop, objectId: string) =>
ipcRenderer.invoke("getGameByObjectId", shop, objectId),
syncGameByObjectId: (shop: GameShop, objectId: string) =>
ipcRenderer.invoke("syncGameByObjectId", shop, objectId),
resetGameAchievements: (shop: GameShop, objectId: string) =>
ipcRenderer.invoke("resetGameAchievements", shop, objectId),
extractGameDownload: (shop: GameShop, objectId: string) =>

View File

@@ -108,7 +108,7 @@ export function GameDetailsContextProvider({
return window.electron
.getGameByObjectId(shop, objectId)
.then((result) => setGame(result));
}, [setGame, shop, objectId]);
}, [shop, objectId]);
const isGameDownloading =
lastPacket?.gameId === game?.id && game?.download?.status === "active";
@@ -183,11 +183,13 @@ export function GameDetailsContextProvider({
.catch(() => {});
}
updateGame();
window.electron.syncGameByObjectId(shop, objectId).then(() => {
if (abortController.signal.aborted) return;
updateGame();
});
}, [
updateGame,
dispatch,
gameTitle,
objectId,
shop,
i18n.language,

View File

@@ -155,6 +155,7 @@ declare global {
shop: GameShop,
objectId: string
) => Promise<LibraryGame | null>;
syncGameByObjectId: (shop: GameShop, objectId: string) => Promise<void>;
onGamesRunning: (
cb: (
gamesRunning: Pick<GameRunning, "id" | "sessionDurationInMillis">[]

View File

@@ -343,6 +343,23 @@ export type LibraryGame = Game &
download: Download | null;
};
export type UserGameDetails = ShopAssets & {
id: string;
playTimeInSeconds: number;
unlockedAchievementCount: number;
achievementsPointsEarnedSum: number;
lastTimePlayed: Date | null;
isDeleted: boolean;
isFavorite: boolean;
friendsWhoPlayed: {
id: string;
displayName: string;
profileImageUrl: string | null;
lastTimePlayed: Date | null;
playTimeInSeconds: number;
}[];
};
export * from "./game.types";
export * from "./steam.types";
export * from "./download.types";