diff --git a/src/main/events/auth/sign-out.ts b/src/main/events/auth/sign-out.ts index 0eb8cf07..a38e9d9e 100644 --- a/src/main/events/auth/sign-out.ts +++ b/src/main/events/auth/sign-out.ts @@ -24,7 +24,7 @@ const signOut = async (_event: Electron.IpcMainInvokeEvent) => { Sentry.setUser(null); /* Disconnects libtorrent */ - RPCManager.kill(); + RPCManager.killTorrent(); await Promise.all([ databaseOperations, diff --git a/src/main/services/download/rpc-manager.ts b/src/main/services/download/rpc-manager.ts index 12d40a28..9ada3e54 100644 --- a/src/main/services/download/rpc-manager.ts +++ b/src/main/services/download/rpc-manager.ts @@ -1,7 +1,11 @@ import cp from "node:child_process"; import { Game } from "@main/entity"; -import { RPC_PASSWORD, RPC_PORT, startTorrentClient } from "./torrent-client"; +import { + RPC_PASSWORD, + RPC_PORT, + startTorrentClient as startRPCClient, +} from "./torrent-client"; import { gameRepository } from "@main/repository"; import { DownloadProgress } from "@types"; import { QueryDeepPartialEntity } from "typeorm/query-builder/QueryPartialEntity"; @@ -27,7 +31,7 @@ export class RPCManager { }); public static spawn(args?: StartDownloadPayload) { - this.rpcProcess = startTorrentClient(args); + this.rpcProcess = startRPCClient(args); } public static kill() { @@ -38,8 +42,15 @@ export class RPCManager { } } + public static killTorrent() { + if (this.rpcProcess) { + this.rpc.post("/action", { action: "kill-torrent" }); + this.downloadingGameId = -1; + } + } + public static async getProccessList() { - return (await this.rpc.get("/process-list")).data; + return (await this.rpc.get("/process-list")).data || []; } public static async getStatus() { diff --git a/src/main/services/process-watcher.ts b/src/main/services/process-watcher.ts index 4dc12bc1..8512f1d8 100644 --- a/src/main/services/process-watcher.ts +++ b/src/main/services/process-watcher.ts @@ -20,7 +20,7 @@ export const watchProcesses = async () => { if (games.length === 0) return; - const processes = (await RPCManager.getProccessList()) || []; + const processes = await RPCManager.getProccessList(); for (const game of games) { const executablePath = game.executablePath!; diff --git a/torrent-client/downloader.py b/torrent-client/downloader.py index 5ddbcf67..2368ff17 100644 --- a/torrent-client/downloader.py +++ b/torrent-client/downloader.py @@ -30,6 +30,15 @@ class Downloader: self.torrent_handles[game_id] = None self.downloading_game_id = -1 + def cancel_all_downloads(self): + for game_id in self.torrent_handles: + torrent_handle = self.torrent_handles[game_id] + torrent_handle.pause() + self.session.remove_torrent(torrent_handle) + + self.torrent_handles = {} + self.downloading_game_id = -1 + def get_download_status(self): if self.downloading_game_id == -1: return None diff --git a/torrent-client/main.py b/torrent-client/main.py index eb04b77c..1099af91 100644 --- a/torrent-client/main.py +++ b/torrent-client/main.py @@ -33,23 +33,28 @@ class Handler(BaseHTTPRequestHandler): status = downloader.get_download_status() self.wfile.write(json.dumps(status).encode('utf-8')) - if self.path == "/healthcheck": + + elif self.path == "/healthcheck": self.send_response(200) self.end_headers() - if self.path == "/process-list": + elif self.path == "/process-list": if self.headers.get(self.rpc_password_header) != rpc_password: self.send_response(401) self.end_headers() return process_path = list(set([proc.info["exe"] for proc in psutil.process_iter(['exe'])])) + self.send_response(200) self.send_header("Content-type", "application/json") self.end_headers() + self.wfile.write(json.dumps(process_path).encode('utf-8')) def do_POST(self): + global downloader + if self.path == "/action": if self.headers.get(self.rpc_password_header) != rpc_password: self.send_response(401) @@ -69,7 +74,10 @@ class Handler(BaseHTTPRequestHandler): downloader.pause_download(data['game_id']) elif data['action'] == 'cancel': downloader.cancel_download(data['game_id']) - + elif data['action'] == 'kill-torrent': + downloader.cancel_all_downloads() + downloader = None + self.send_response(200) self.end_headers()