Files
trweb/js/trdom_torrentcontrol.js
Fehér Roland 53ae5495aa REVERT: I'm not proud
This is slow af
Definitely needs more work
2025-10-09 15:42:31 +02:00

214 lines
8.4 KiB
JavaScript

"use strict";
class trdom_torrentcontrol extends EventTarget {
#logcb;
#log(loglevel, msg) {
if (this.#logcb !== null) {
this.#logcb('trdom_servermanager', loglevel, msg);
}
}
#element = document.createElement('div');
getElement() {
return this.#element;
}
#hash;
#server;
#updateDOM(data) {
let control_element = this.#element;
let status = control_element.element_status;
control_element.classList.remove(
'trweb_status_asdf',
'trweb_status_offline',
'trweb_status_nonexistent',
'trweb_status_paused',
'trweb_status_verifqueued',
'trweb_status_verifying',
'trweb_status_downloading',
'trweb_status_seeding'
);
nukeChildren(status);
let statustext = 'Nothing to see here';
let statusclass = 'trweb_status_asdf'
let barwidth = 50;
if (!this.#server.isOnline()) {
statustext = "Server offline";
statusclass = 'trweb_status_offline';
barwidth = 0;
}
else {
let server_status = data;
if (server_status == undefined || server_status.deleted) {
statustext = "Not available";
statusclass = 'trweb_status_nonexistent';
barwidth = 0;
}
else {
statustext = `${server_status.status}`;
barwidth = server_status.percentDone;
switch (server_status.status) {
case 0:
statustext = 'Paused';
statusclass = 'trweb_status_paused';
break;
case 1:
statustext = 'Queued for verification';
statusclass = 'trweb_status_verifqueued';
break;
case 2:
statustext = 'Verifying';
statusclass = 'trweb_status_verifying';
break;
case 3:
statustext = 'Queued';
break;
case 4:
statustext = 'Downloading';
statusclass = 'trweb_status_downloading';
break;
case 6:
statustext = 'Seeding';
statusclass = 'trweb_status_seeding';
break;
}
statustext = `[${this.#server.name}]: ${statustext} - ${server_status.percentDone}%`;
}
}
control_element.element_statusbar.style.width = `${barwidth}%`;
control_element.classList.add(statusclass);
status.appendChild(document.createTextNode(statustext));
}
handleEvent(e) {
switch (e.type) {
case 'click':
if (e.currentTarget.hasAttributeNS('trweb', 'torrentlistfield')) {
switch (e.currentTarget.getAttributeNS('trweb', 'torrentlistfield')) {
case 'start':
this.#server.torrent_start(this.#hash);
e.stopPropagation();
break;
case 'pause':
this.#server.torrent_pause(this.#hash);
e.stopPropagation();
break;
case 'magnet':
/*let magneturl;
for (const [srv, data] of Object.entries(this.#getKnownTorrents()[this.#hash].servers)) {
if (data.magnetLink != null) {
magneturl = data.magnetLink;
break;
}
}
if (magneturl != null) {
this.#server.torrent_add_url(magneturl, false, null);
}
else {
this.#log(3, `Couldn't find magnet link! ${JSON.stringify(this.#getKnownTorrents()[this.#hash].servers)}`);
}*/
e.stopPropagation();
window.alert('not implemented');
break;
case 'download':
e.stopPropagation();
window.alert('not implemented');
break;
}
}
break;
case 'torrent-update':
if (e.detail.torrentHash == this.#hash) {
this.#updateDOM(e.detail.torrentInfo);
}
break;
}
}
constructor(hash, server, initdata = null, logcb = null) {
super();
this.#hash = hash;
this.#server = server;
this.#logcb = logcb;
let srv = server.name;
// statusbar
let element_statusbar = document.createElement('div');
element_statusbar.classList.add('trweb_torrentliststatusbar');
// Current status and percentage
let element_status = document.createElement('div');
element_status.classList.add('trweb_torrentliststatus', 'col-12');
element_status.setAttributeNS('trweb', 'server', srv);
element_status.setAttributeNS('trweb', 'torrentlistfield', 'status');
let element_start = document.createElement('div');
element_start.classList.add('trweb_torrentlistcontrol', 'col-4');
element_start.setAttributeNS('trweb', 'server', srv);
element_start.setAttributeNS('trweb', 'torrent', this.#hash);
element_start.setAttributeNS('trweb', 'torrentlistfield', 'start');
element_start.appendChild(document.createTextNode("Start"));
element_start.addEventListener("click", this);
let element_pause = document.createElement('div');
element_pause.classList.add('trweb_torrentlistcontrol', 'col-4');
element_pause.setAttributeNS('trweb', 'server', srv);
element_pause.setAttributeNS('trweb', 'torrent', this.#hash);
element_pause.setAttributeNS('trweb', 'torrentlistfield', 'pause');
element_pause.appendChild(document.createTextNode("Pause"));
element_pause.addEventListener("click", this);
// Download by magnet
let element_magnet = document.createElement('div');
element_magnet.classList.add('trweb_torrentlistmagnet', 'col');
element_magnet.setAttributeNS('trweb', 'server', srv);
element_magnet.setAttributeNS('trweb', 'torrent', this.#hash);
element_magnet.setAttributeNS('trweb', 'torrentlistfield', 'magnet');
element_magnet.appendChild(document.createTextNode(`[${srv}] Magnet`));
element_magnet.addEventListener("click", this);
// Download by torrent file
let element_download = document.createElement('div');
element_download.classList.add('trweb_torrentlistdownload', 'col');
element_download.setAttributeNS('trweb', 'server', srv);
element_download.setAttributeNS('trweb', 'torrent', this.#hash);
element_download.setAttributeNS('trweb', 'torrentlistfield', 'download');
element_download.appendChild(document.createTextNode(`[${srv}] Get torrent`));
element_download.addEventListener("click", this);
// row container
let element_serverrow = document.createElement('div');
element_serverrow.classList.add('trweb_torrentlistserverrow', 'row');
element_serverrow.appendChild(element_status);
element_serverrow.appendChild(element_start);
element_serverrow.appendChild(element_pause);
element_serverrow.appendChild(element_magnet);
element_serverrow.appendChild(element_download);
this.#element.classList.add('trweb_torrentlistserver', 'col-2', 'container');
this.#element.setAttributeNS('trweb', 'torrentlistfield', 'server');
this.#element.setAttributeNS('trweb', 'server', srv);
this.#element.element_statusbar = element_statusbar;
this.#element.appendChild(element_statusbar);
this.#element.element_row = element_serverrow;
this.#element.appendChild(element_serverrow);
this.#element.element_status = element_status;
this.#element.element_start = element_start;
this.#element.element_pause = element_pause;
this.#element.element_magnet = element_magnet;
this.#element.element_download = element_download;
if (initdata != null) {
this.#updateDOM(initdata);
}
server.addEventListener('torrent-update', this);
}
}