mirror of
https://github.com/hydralauncher/hydra.git
synced 2026-01-25 03:41:02 +00:00
94 lines
3.5 KiB
TypeScript
94 lines
3.5 KiB
TypeScript
import { ShopAssets } from "@types";
|
|
import { HydraApi } from "../hydra-api";
|
|
import { gamesShopAssetsSublevel, gamesSublevel, levelKeys } from "@main/level";
|
|
|
|
type ProfileGame = {
|
|
id: string;
|
|
lastTimePlayed: Date | null;
|
|
playTimeInMilliseconds: number;
|
|
hasManuallyUpdatedPlaytime: boolean;
|
|
isFavorite?: boolean;
|
|
isPinned?: boolean;
|
|
achievementCount: number;
|
|
unlockedAchievementCount: number;
|
|
} & ShopAssets;
|
|
|
|
export const mergeWithRemoteGames = async () => {
|
|
return HydraApi.get<ProfileGame[]>("/profile/games")
|
|
.then(async (response) => {
|
|
for (const game of response) {
|
|
const gameKey = levelKeys.game(game.shop, game.objectId);
|
|
const localGame = await gamesSublevel.get(gameKey);
|
|
|
|
if (localGame) {
|
|
const updatedLastTimePlayed =
|
|
localGame.lastTimePlayed == null ||
|
|
(game.lastTimePlayed &&
|
|
new Date(game.lastTimePlayed) >
|
|
new Date(localGame.lastTimePlayed))
|
|
? game.lastTimePlayed
|
|
: localGame.lastTimePlayed;
|
|
|
|
const updatedPlayTime =
|
|
localGame.playTimeInMilliseconds < game.playTimeInMilliseconds
|
|
? game.playTimeInMilliseconds
|
|
: localGame.playTimeInMilliseconds;
|
|
|
|
await gamesSublevel.put(gameKey, {
|
|
...localGame,
|
|
remoteId: game.id,
|
|
lastTimePlayed: updatedLastTimePlayed,
|
|
playTimeInMilliseconds: updatedPlayTime,
|
|
favorite: game.isFavorite ?? localGame.favorite,
|
|
isPinned: game.isPinned ?? localGame.isPinned,
|
|
achievementCount: game.achievementCount,
|
|
unlockedAchievementCount: game.unlockedAchievementCount,
|
|
});
|
|
} else {
|
|
await gamesSublevel.put(gameKey, {
|
|
objectId: game.objectId,
|
|
title: game.title,
|
|
remoteId: game.id,
|
|
shop: game.shop,
|
|
iconUrl: game.iconUrl,
|
|
libraryHeroImageUrl: game.libraryHeroImageUrl,
|
|
logoImageUrl: game.logoImageUrl,
|
|
lastTimePlayed: game.lastTimePlayed,
|
|
playTimeInMilliseconds: game.playTimeInMilliseconds,
|
|
hasManuallyUpdatedPlaytime: game.hasManuallyUpdatedPlaytime,
|
|
isDeleted: false,
|
|
favorite: game.isFavorite ?? false,
|
|
isPinned: game.isPinned ?? false,
|
|
achievementCount: game.achievementCount,
|
|
unlockedAchievementCount: game.unlockedAchievementCount,
|
|
});
|
|
}
|
|
|
|
const localGameShopAsset = await gamesShopAssetsSublevel.get(gameKey);
|
|
|
|
// Construct coverImageUrl if not provided by backend (Steam games use predictable pattern)
|
|
const coverImageUrl =
|
|
game.coverImageUrl ||
|
|
(game.shop === "steam"
|
|
? `https://shared.steamstatic.com/store_item_assets/steam/apps/${game.objectId}/library_600x900_2x.jpg`
|
|
: null);
|
|
|
|
await gamesShopAssetsSublevel.put(gameKey, {
|
|
updatedAt: Date.now(),
|
|
...localGameShopAsset,
|
|
shop: game.shop,
|
|
objectId: game.objectId,
|
|
title: localGame?.title || game.title, // Preserve local title if it exists
|
|
coverImageUrl,
|
|
libraryHeroImageUrl: game.libraryHeroImageUrl,
|
|
libraryImageUrl: game.libraryImageUrl,
|
|
logoImageUrl: game.logoImageUrl,
|
|
iconUrl: game.iconUrl,
|
|
logoPosition: game.logoPosition,
|
|
downloadSources: game.downloadSources,
|
|
});
|
|
}
|
|
})
|
|
.catch(() => {});
|
|
};
|