feat: crete kill-torrent

This commit is contained in:
Zamitto 2024-07-03 12:06:26 -03:00
parent 75c8f69e81
commit 0f5db4f34e
5 changed files with 36 additions and 8 deletions

View File

@ -24,7 +24,7 @@ const signOut = async (_event: Electron.IpcMainInvokeEvent) => {
Sentry.setUser(null);
/* Disconnects libtorrent */
RPCManager.kill();
RPCManager.killTorrent();
await Promise.all([
databaseOperations,

View File

@ -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<string[] | null>("/process-list")).data;
return (await this.rpc.get<string[] | null>("/process-list")).data || [];
}
public static async getStatus() {

View File

@ -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!;

View File

@ -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

View File

@ -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()