"use strict"; class trdom_torrentcontrol extends EventTarget { #logcb; #log(loglevel, msg) { if (this.#logcb !== null) { this.#logcb(`server:${this.#server.name}:${this.#hash}`, loglevel, msg); } } #element = document.createElement('div'); get element() { return this.#element; } #hash; #server; #data; get exists() { return this.#data != null && this.#data.name != null; } get name() { return this.exists ? this.#data.name : this.#hash; } get magnet() { return this.#data != null ? this.#data.magnetLink : null; } set magnet(value) { if (this.#data == null) { this.#data = {}; } this.#data.magnetLink = value; this.updateDOM(); } updateDOM() { 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 { if (!this.exists) { //this.#log(5, JSON.stringify(this.#data)); statustext = "Not available"; statusclass = 'trweb_status_nonexistent'; barwidth = 0; } else { let server_status = this.#data; 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) { this.#log(6, `Handling event of type ${e.type}`); 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': e.stopPropagation(); if (this.magnet != null) { this.#server.torrent_add_url(this.magnet, true, null); } else { this.#log(3, 'Couldn\'t find magnet link!'); window.alert('Couldn\'t find magnet link!'); } break; case 'download': e.stopPropagation(); window.alert('not implemented'); break; } } break; case 'torrent-deleted': this.#log(6, 'we be delet'); this.#data = null; this.updateDOM(); break; case 'torrent-updated': if (e.detail.torrentHash == this.#hash) { this.#log(6, `Got data from server: ${JSON.stringify(e.detail.torrentInfo)}`); this.#data = e.detail.torrentInfo; this.updateDOM(); } 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; this.#data = initdata; this.updateDOM(); this.addEventListener('torrent-updated', this); this.addEventListener('torrent-deleted', this); server.addControl(hash, this); } }