feat: use main-loop to watch seeding list

This commit is contained in:
Hachi-R 2024-11-06 19:10:13 -03:00
parent cd4715e00d
commit e0f7f34d14
9 changed files with 67 additions and 12 deletions

View File

@ -98,6 +98,17 @@ export class DownloadManager {
}
}
public static async watchSeedingList() {
const seedingList = await PythonInstance.getSeedingList();
if (seedingList) {
WindowManager.mainWindow?.webContents.send(
"on-seeding-list",
JSON.parse(JSON.stringify(seedingList))
);
}
}
static async pauseDownload() {
if (this.currentDownloader === Downloader.Torrent) {
await PythonInstance.pauseDownload();

View File

@ -60,14 +60,15 @@ export class PythonInstance {
);
}
public static async getStatus() {
if (this.downloadingGameId === -1) return null;
public static async getSeedingList() {
const response = await this.rpc.get<LibtorrentPayload | null>("/status");
if (response.data === null) return null;
return response.data?.seeding || [];
}
console.log(response.data);
public static async getStatus() {
const response = await this.rpc.get<LibtorrentPayload | null>("/status");
if (response.data?.downloading === null) return null;
try {
const {
@ -80,7 +81,7 @@ export class PythonInstance {
folderName,
status,
gameId,
} = response.data;
} = response.data?.downloading!;
this.downloadingGameId = gameId;

View File

@ -20,7 +20,7 @@ export enum LibtorrentStatus {
Seeding = 5,
}
export interface LibtorrentPayload {
export interface LibtorrentGamePayload {
progress: number;
numPeers: number;
numSeeds: number;
@ -32,6 +32,23 @@ export interface LibtorrentPayload {
gameId: number;
}
export interface LibtorrentPayload {
downloading?: LibtorrentGamePayload;
seeding: LibtorrentGamePayload[];
}
export interface LibtorrentSeedingPayload {
progress: number;
numPeers: number;
numSeeds: number;
uploadSpeed: number;
// isCheckingFiles: boolean;
fileSize: number;
folderName: string;
status: LibtorrentStatus;
gameId: number;
}
export interface ProcessPayload {
exe: string;
pid: number;

View File

@ -10,6 +10,7 @@ export const startMainLoop = async () => {
watchProcesses(),
DownloadManager.watchDownloads(),
AchievementWatcherManager.watchAchievements(),
DownloadManager.watchSeedingList(),
]);
await sleep(1500);

View File

@ -15,6 +15,7 @@ import type {
import type { CatalogueCategory } from "@shared";
import type { AxiosProgressEvent } from "axios";
import { GameAchievement } from "@main/entity";
import { LibtorrentSeedingPayload } from "@main/services/download/types";
contextBridge.exposeInMainWorld("electron", {
/* Torrenting */
@ -36,6 +37,12 @@ contextBridge.exposeInMainWorld("electron", {
ipcRenderer.on("on-download-progress", listener);
return () => ipcRenderer.removeListener("on-download-progress", listener);
},
onSeedingList: (cb: (value: LibtorrentSeedingPayload[]) => void) => {
const listener = (_event: Electron.IpcRendererEvent, value: LibtorrentSeedingPayload[]) => cb(value);
ipcRenderer.on("on-seeding-list", listener);
return () => ipcRenderer.removeListener("on-seeding-list", listener);
},
/* Catalogue */
searchGames: (query: string) => ipcRenderer.invoke("searchGames", query),

View File

@ -49,6 +49,9 @@ declare global {
onDownloadProgress: (
cb: (value: DownloadProgress) => void
) => () => Electron.IpcRenderer;
onSeedingList: (
cb: (value: LibtorrentSeedingPayload[]) => void
) => () => Electron.IpcRenderer;
/* Catalogue */
searchGames: (query: string) => Promise<CatalogueEntry[]>;

View File

@ -2,12 +2,12 @@ import { useTranslation } from "react-i18next";
import { useDownload, useLibrary } from "@renderer/hooks";
import { useMemo, useRef, useState } from "react";
import { useEffect, useMemo, useRef, useState } from "react";
import { BinaryNotFoundModal } from "../shared-modals/binary-not-found-modal";
import * as styles from "./downloads.css";
import { DeleteGameModal } from "./delete-game-modal";
import { DownloadGroup } from "./download-group";
import type { LibraryGame } from "@types";
import type { LibraryGame, SeedingList } from "@types";
import { orderBy } from "lodash-es";
import { ArrowDownIcon } from "@primer/octicons-react";
@ -30,6 +30,14 @@ export default function Downloads() {
const { lastPacket } = useDownload();
const [seedingList, setSeedingList] = useState<SeedingList[]>([]);
useEffect(() => {
window.electron.onSeedingList((value) => setSeedingList(value));
}, []);
console.log("sexo", seedingList);
const handleOpenGameInstaller = (gameId: number) =>
window.electron.openGameInstaller(gameId).then((isBinaryInPath) => {
if (!isBinaryInPath) setShowBinaryNotFoundModal(true);

View File

@ -151,6 +151,13 @@ export interface DownloadProgress {
game: LibraryGame;
}
export interface SeedingList {
progress: number;
numPeers: number;
numSeeds: number;
uploadSpeed: number;
}
export interface UserPreferences {
downloadsPath: string | null;
language: string;

View File

@ -169,6 +169,6 @@ class TorrentDownloader:
elif status.state == 5:
response['seeding'].append(torrent_info)
print(response)
# return response
return None
# print(response)
return response
# return None