mirror of
https://github.com/hydralauncher/hydra.git
synced 2026-01-18 00:33:59 +00:00
fix: formatting
This commit is contained in:
@@ -11,6 +11,8 @@ export const getLastDownloadSourcesCheck = async (): Promise<string | null> => {
|
||||
}
|
||||
};
|
||||
|
||||
export const updateLastDownloadSourcesCheck = async (timestamp: string): Promise<void> => {
|
||||
export const updateLastDownloadSourcesCheck = async (
|
||||
timestamp: string
|
||||
): Promise<void> => {
|
||||
await db.put(levelKeys.lastDownloadSourcesCheck, timestamp);
|
||||
};
|
||||
};
|
||||
|
||||
@@ -57,7 +57,7 @@ export const loadState = async () => {
|
||||
|
||||
const { syncDownloadSourcesFromApi } = await import("./services/user");
|
||||
void syncDownloadSourcesFromApi();
|
||||
|
||||
|
||||
// Check for new download options on startup
|
||||
void DownloadSourcesChecker.checkForChanges();
|
||||
// WSClient.connect();
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
import { HydraApi } from "./hydra-api";
|
||||
import { gamesSublevel, getLastDownloadSourcesCheck, updateLastDownloadSourcesCheck, downloadSourcesSublevel } from "@main/level";
|
||||
import {
|
||||
gamesSublevel,
|
||||
getLastDownloadSourcesCheck,
|
||||
updateLastDownloadSourcesCheck,
|
||||
downloadSourcesSublevel,
|
||||
} from "@main/level";
|
||||
import { logger } from "./logger";
|
||||
import { WindowManager } from "./window-manager";
|
||||
import type { Game } from "@types";
|
||||
@@ -14,62 +19,85 @@ interface DownloadSourcesChangeResponse {
|
||||
export class DownloadSourcesChecker {
|
||||
static async checkForChanges(): Promise<void> {
|
||||
logger.info("DownloadSourcesChecker.checkForChanges() called");
|
||||
|
||||
|
||||
try {
|
||||
// Get all installed games (excluding custom games)
|
||||
const installedGames = await gamesSublevel.values().all();
|
||||
const nonCustomGames = installedGames.filter((game: Game) => game.shop !== 'custom');
|
||||
logger.info(`Found ${installedGames.length} total games, ${nonCustomGames.length} non-custom games`);
|
||||
|
||||
const nonCustomGames = installedGames.filter(
|
||||
(game: Game) => game.shop !== "custom"
|
||||
);
|
||||
logger.info(
|
||||
`Found ${installedGames.length} total games, ${nonCustomGames.length} non-custom games`
|
||||
);
|
||||
|
||||
if (nonCustomGames.length === 0) {
|
||||
logger.info("No non-custom games found, skipping download sources check");
|
||||
logger.info(
|
||||
"No non-custom games found, skipping download sources check"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
// Get download sources
|
||||
const downloadSources = await downloadSourcesSublevel.values().all();
|
||||
const downloadSourceIds = downloadSources.map(source => source.id);
|
||||
logger.info(`Found ${downloadSourceIds.length} download sources: ${downloadSourceIds.join(', ')}`);
|
||||
const downloadSourceIds = downloadSources.map((source) => source.id);
|
||||
logger.info(
|
||||
`Found ${downloadSourceIds.length} download sources: ${downloadSourceIds.join(", ")}`
|
||||
);
|
||||
|
||||
if (downloadSourceIds.length === 0) {
|
||||
logger.info("No download sources found, skipping download sources check");
|
||||
logger.info(
|
||||
"No download sources found, skipping download sources check"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
// Get last check timestamp or use a default (24 hours ago)
|
||||
const lastCheck = await getLastDownloadSourcesCheck();
|
||||
const since = lastCheck || new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
|
||||
const since =
|
||||
lastCheck || new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
|
||||
logger.info(`Last check: ${lastCheck}, using since: ${since}`);
|
||||
|
||||
// Clear any previously stored new download option counts so badges don't persist across restarts
|
||||
const previouslyFlaggedGames = nonCustomGames.filter(
|
||||
(game: Game) => (game as Game).newDownloadOptionsCount && (game as Game).newDownloadOptionsCount! > 0
|
||||
(game: Game) =>
|
||||
(game as Game).newDownloadOptionsCount &&
|
||||
(game as Game).newDownloadOptionsCount! > 0
|
||||
);
|
||||
|
||||
const clearedPayload: { gameId: string; count: number }[] = [];
|
||||
if (previouslyFlaggedGames.length > 0) {
|
||||
logger.info(`Clearing stale newDownloadOptionsCount for ${previouslyFlaggedGames.length} games`);
|
||||
logger.info(
|
||||
`Clearing stale newDownloadOptionsCount for ${previouslyFlaggedGames.length} games`
|
||||
);
|
||||
for (const game of previouslyFlaggedGames) {
|
||||
await gamesSublevel.put(`${game.shop}:${game.objectId}`, {
|
||||
...game,
|
||||
newDownloadOptionsCount: undefined,
|
||||
});
|
||||
clearedPayload.push({ gameId: `${game.shop}:${game.objectId}`, count: 0 });
|
||||
clearedPayload.push({
|
||||
gameId: `${game.shop}:${game.objectId}`,
|
||||
count: 0,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Prepare games array for API call (excluding custom games)
|
||||
const games = nonCustomGames.map((game: Game) => ({
|
||||
shop: game.shop,
|
||||
objectId: game.objectId
|
||||
objectId: game.objectId,
|
||||
}));
|
||||
|
||||
logger.info(`Checking download sources changes for ${games.length} non-custom games since ${since}`);
|
||||
logger.info(`Making API call to HydraApi.checkDownloadSourcesChanges with:`, {
|
||||
downloadSourceIds,
|
||||
gamesCount: games.length,
|
||||
since
|
||||
});
|
||||
logger.info(
|
||||
`Checking download sources changes for ${games.length} non-custom games since ${since}`
|
||||
);
|
||||
logger.info(
|
||||
`Making API call to HydraApi.checkDownloadSourcesChanges with:`,
|
||||
{
|
||||
downloadSourceIds,
|
||||
gamesCount: games.length,
|
||||
since,
|
||||
}
|
||||
);
|
||||
|
||||
// Call the API
|
||||
const response = await HydraApi.checkDownloadSourcesChanges(
|
||||
@@ -77,7 +105,7 @@ export class DownloadSourcesChecker {
|
||||
games,
|
||||
since
|
||||
);
|
||||
|
||||
|
||||
logger.info("API call completed, response:", response);
|
||||
|
||||
// Update the last check timestamp
|
||||
@@ -86,37 +114,45 @@ export class DownloadSourcesChecker {
|
||||
// Process the response and store newDownloadOptionsCount for games with new options
|
||||
if (response && Array.isArray(response)) {
|
||||
const gamesWithNewOptions: { gameId: string; count: number }[] = [];
|
||||
|
||||
|
||||
for (const gameUpdate of response as DownloadSourcesChangeResponse[]) {
|
||||
if (gameUpdate.newDownloadOptionsCount > 0) {
|
||||
const game = nonCustomGames.find(g =>
|
||||
g.shop === gameUpdate.shop && g.objectId === gameUpdate.objectId
|
||||
const game = nonCustomGames.find(
|
||||
(g) =>
|
||||
g.shop === gameUpdate.shop && g.objectId === gameUpdate.objectId
|
||||
);
|
||||
|
||||
|
||||
if (game) {
|
||||
// Store the new download options count in the game data
|
||||
await gamesSublevel.put(`${game.shop}:${game.objectId}`, {
|
||||
...game,
|
||||
newDownloadOptionsCount: gameUpdate.newDownloadOptionsCount
|
||||
newDownloadOptionsCount: gameUpdate.newDownloadOptionsCount,
|
||||
});
|
||||
|
||||
|
||||
gamesWithNewOptions.push({
|
||||
gameId: `${game.shop}:${game.objectId}`,
|
||||
count: gameUpdate.newDownloadOptionsCount
|
||||
count: gameUpdate.newDownloadOptionsCount,
|
||||
});
|
||||
|
||||
logger.info(`Game ${game.title} has ${gameUpdate.newDownloadOptionsCount} new download options`);
|
||||
|
||||
logger.info(
|
||||
`Game ${game.title} has ${gameUpdate.newDownloadOptionsCount} new download options`
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Send IPC event to renderer to clear stale badges and set fresh counts from response
|
||||
const eventPayload = [...clearedPayload, ...gamesWithNewOptions];
|
||||
if (eventPayload.length > 0 && WindowManager.mainWindow) {
|
||||
WindowManager.mainWindow.webContents.send("on-new-download-options", eventPayload);
|
||||
WindowManager.mainWindow.webContents.send(
|
||||
"on-new-download-options",
|
||||
eventPayload
|
||||
);
|
||||
}
|
||||
|
||||
logger.info(`Found new download options for ${gamesWithNewOptions.length} games`);
|
||||
|
||||
logger.info(
|
||||
`Found new download options for ${gamesWithNewOptions.length} games`
|
||||
);
|
||||
}
|
||||
|
||||
logger.info("Download sources check completed successfully");
|
||||
@@ -124,4 +160,4 @@ export class DownloadSourcesChecker {
|
||||
logger.error("Failed to check download sources changes:", error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -409,22 +409,31 @@ export class HydraApi {
|
||||
downloadSourceIds,
|
||||
gamesCount: games.length,
|
||||
since,
|
||||
isLoggedIn: this.isLoggedIn()
|
||||
isLoggedIn: this.isLoggedIn(),
|
||||
});
|
||||
|
||||
try {
|
||||
const result = await this.post<Array<{
|
||||
shop: string;
|
||||
objectId: string;
|
||||
newDownloadOptionsCount: number;
|
||||
downloadSourceIds: string[];
|
||||
}>>("/download-sources/changes", {
|
||||
downloadSourceIds,
|
||||
games,
|
||||
since,
|
||||
}, { needsAuth: true });
|
||||
|
||||
logger.info("HydraApi.checkDownloadSourcesChanges completed successfully:", result);
|
||||
const result = await this.post<
|
||||
Array<{
|
||||
shop: string;
|
||||
objectId: string;
|
||||
newDownloadOptionsCount: number;
|
||||
downloadSourceIds: string[];
|
||||
}>
|
||||
>(
|
||||
"/download-sources/changes",
|
||||
{
|
||||
downloadSourceIds,
|
||||
games,
|
||||
since,
|
||||
},
|
||||
{ needsAuth: true }
|
||||
);
|
||||
|
||||
logger.info(
|
||||
"HydraApi.checkDownloadSourcesChanges completed successfully:",
|
||||
result
|
||||
);
|
||||
return result;
|
||||
} catch (error) {
|
||||
logger.error("HydraApi.checkDownloadSourcesChanges failed:", error);
|
||||
|
||||
@@ -84,7 +84,9 @@ export function SidebarGameItem({
|
||||
{game.newDownloadOptionsCount && game.newDownloadOptionsCount > 0 && (
|
||||
<span className="sidebar__game-badge">
|
||||
<div className="sidebar__game-badge-plus">+</div>
|
||||
<div className="sidebar__game-badge-count">{game.newDownloadOptionsCount}</div>
|
||||
<div className="sidebar__game-badge-count">
|
||||
{game.newDownloadOptionsCount}
|
||||
</div>
|
||||
</span>
|
||||
)}
|
||||
</button>
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
}
|
||||
|
||||
&__game-badge {
|
||||
background: rgba(255, 255, 255, 0.1);;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
color: #fff;
|
||||
font-size: 10px;
|
||||
font-weight: bold;
|
||||
|
||||
@@ -39,4 +39,8 @@ export const librarySlice = createSlice({
|
||||
},
|
||||
});
|
||||
|
||||
export const { setLibrary, updateGameNewDownloadOptions, clearNewDownloadOptions } = librarySlice.actions;
|
||||
export const {
|
||||
setLibrary,
|
||||
updateGameNewDownloadOptions,
|
||||
clearNewDownloadOptions,
|
||||
} = librarySlice.actions;
|
||||
|
||||
@@ -16,4 +16,4 @@ export function useDownloadOptionsListener() {
|
||||
|
||||
return unsubscribe;
|
||||
}, [dispatch]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user