hydra/src/main/events/torrenting/start-game-download.ts

102 lines
2.1 KiB
TypeScript

import { getSteamGameIconUrl, writePipe } from "@main/services";
import { gameRepository, repackRepository } from "@main/repository";
import { GameStatus } from "@main/constants";
import { registerEvent } from "../register-event";
import type { GameShop } from "@types";
import { getImageBase64 } from "@main/helpers";
import { In } from "typeorm";
const startGameDownload = async (
_event: Electron.IpcMainInvokeEvent,
repackId: number,
objectID: string,
title: string,
gameShop: GameShop,
downloadPath: string
) => {
const [game, repack] = await Promise.all([
gameRepository.findOne({
where: {
objectID,
},
}),
repackRepository.findOne({
where: {
id: repackId,
},
}),
]);
if (!repack) return;
if (game?.status === GameStatus.Downloading) {
return;
}
writePipe.write({ action: "pause" });
await gameRepository.update(
{
status: In([
GameStatus.Downloading,
GameStatus.DownloadingMetadata,
GameStatus.CheckingFiles,
]),
},
{ status: GameStatus.Paused }
);
if (game) {
await gameRepository.update(
{
id: game.id,
},
{
status: GameStatus.DownloadingMetadata,
downloadPath: downloadPath,
repack: { id: repackId },
isDeleted: false,
}
);
writePipe.write({
action: "start",
game_id: game.id,
magnet: repack.magnet,
save_path: downloadPath,
});
game.status = GameStatus.DownloadingMetadata;
return game;
} else {
const iconUrl = await getImageBase64(await getSteamGameIconUrl(objectID));
const createdGame = await gameRepository.save({
title,
iconUrl,
objectID,
shop: gameShop,
status: GameStatus.DownloadingMetadata,
downloadPath: downloadPath,
repack: { id: repackId },
});
writePipe.write({
action: "start",
game_id: createdGame.id,
magnet: repack.magnet,
save_path: downloadPath,
});
const { repack: _, ...rest } = createdGame;
return rest;
}
};
registerEvent(startGameDownload, {
name: "startGameDownload",
});