2025-10-08 12:28:02 +02:00
|
|
|
"use strict";
|
|
|
|
|
|
|
|
|
|
class trweb {
|
|
|
|
|
#needsSort = false;
|
|
|
|
|
|
|
|
|
|
#loadcb = function(key) {return localStorage.getItem(`trweb.${key}`)};
|
|
|
|
|
#savecb = function(key, value) {localStorage.setItem(`trweb.${key}`, value)};
|
|
|
|
|
#logger = function(msg) {};
|
2025-10-09 13:07:51 +02:00
|
|
|
#logcb = function(module, loglevel, msg) {
|
|
|
|
|
if (loglevel <= 5) {
|
|
|
|
|
this.#logger(`${module}: ${msg}`);
|
|
|
|
|
}
|
|
|
|
|
}.bind(this);
|
2025-10-09 15:42:31 +02:00
|
|
|
#log(loglevel, msg) {
|
|
|
|
|
if (this.#logcb !== null) {
|
|
|
|
|
this.#logcb('TRWEB', loglevel, msg);
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-10-08 12:28:02 +02:00
|
|
|
|
|
|
|
|
#timer;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#container;
|
2025-10-08 12:46:33 +02:00
|
|
|
#guiFooter;
|
2025-10-08 12:28:02 +02:00
|
|
|
|
2025-10-08 14:30:54 +02:00
|
|
|
#dom_menubar = new trdom_menubar();
|
|
|
|
|
#dom_servermanager;
|
2025-10-09 15:42:31 +02:00
|
|
|
#dom_torrentmanagger;
|
2025-10-08 14:30:54 +02:00
|
|
|
|
2025-10-08 12:28:02 +02:00
|
|
|
constructor (container, loadcb, savecb, logger) {
|
|
|
|
|
this.#container = container;
|
|
|
|
|
if (loadcb != null) {
|
|
|
|
|
this.#loadcb = loadcb;
|
|
|
|
|
this.#savecb = savecb;
|
|
|
|
|
}
|
|
|
|
|
if (logger != null) {
|
|
|
|
|
this.#logger = logger;
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-09 15:42:31 +02:00
|
|
|
this.#dom_servermanager = new trdom_servermanager(this.#loadcb, this.#savecb, this.#logcb);
|
|
|
|
|
this.#dom_torrentmanagger = new trdom_torrentmanager(this.#logcb);
|
|
|
|
|
|
2025-10-14 08:57:28 +02:00
|
|
|
/* trdom_torrentmanager uses this to add new server controls to existing torrents */
|
2025-10-09 15:42:31 +02:00
|
|
|
this.#dom_servermanager.addEventListener('torrentserver-added', this.#dom_torrentmanagger);
|
|
|
|
|
this.#dom_servermanager.addEventListener('torrent-created', this.#dom_torrentmanagger);
|
2025-10-08 14:30:54 +02:00
|
|
|
|
2025-10-14 14:27:54 +02:00
|
|
|
this.#dom_menubar.addMenuNode('servermanager', this.#dom_servermanager.menuentry);
|
|
|
|
|
|
2025-10-08 14:30:54 +02:00
|
|
|
this.#guiFooter = document.createElement('div');
|
|
|
|
|
this.#guiFooter.classList.add('trweb_footer');
|
|
|
|
|
|
2025-10-08 12:28:02 +02:00
|
|
|
if (document.readyState === 'complete' || document.readyState === 'interactive') {
|
|
|
|
|
this.#logger('Document already loaded, jumpstarting');
|
2025-10-09 11:35:35 +02:00
|
|
|
// we don't want to re-trigger every listener, so call handler directly instead of dispatching an event
|
|
|
|
|
this.handleEvent({'type': 'DOMContentLoaded'});
|
2025-10-08 12:28:02 +02:00
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
this.#logger('Waiting for document to load');
|
2025-10-09 11:35:35 +02:00
|
|
|
document.addEventListener('DOMContentLoaded', this);
|
2025-10-08 12:28:02 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-09 11:35:35 +02:00
|
|
|
handleEvent(e) {
|
2025-10-09 15:42:31 +02:00
|
|
|
this.#log(6, `Handling event of type ${e.type}`);
|
2025-10-08 12:28:02 +02:00
|
|
|
switch (e.type) {
|
2025-10-09 15:42:31 +02:00
|
|
|
case 'DOMContentLoaded':
|
|
|
|
|
this.#logger('Activating TRWEB instance');
|
|
|
|
|
|
|
|
|
|
this.#container = document.getElementById(this.#container);
|
2025-10-14 13:00:09 +02:00
|
|
|
this.#container.classList.add('trweb_container', 'd-flex', 'flex-column', 'h-100');
|
2025-10-13 15:50:31 +02:00
|
|
|
this.#container.appendChild(this.#dom_menubar.element);
|
|
|
|
|
this.#container.appendChild(this.#dom_torrentmanagger.element);
|
2025-10-09 15:42:31 +02:00
|
|
|
this.#container.appendChild(this.#guiFooter);
|
|
|
|
|
|
|
|
|
|
this.#dom_servermanager.loadServers();
|
2025-10-14 12:58:58 +02:00
|
|
|
this.setTimer();
|
2025-10-09 15:42:31 +02:00
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
this.#log(5, `Event type ${e.type} not supported`);
|
|
|
|
|
break;
|
2025-10-08 12:28:02 +02:00
|
|
|
}
|
2025-10-09 11:35:35 +02:00
|
|
|
}
|
2025-10-08 12:28:02 +02:00
|
|
|
|
|
|
|
|
refresh() {
|
2025-10-14 12:58:58 +02:00
|
|
|
this.#log(6,'Refresh');
|
2025-10-08 14:30:54 +02:00
|
|
|
for (const [key, value] of Object.entries(this.#dom_servermanager.getServers())) {
|
2025-10-08 12:28:02 +02:00
|
|
|
value.refreshTorrentList();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-09 10:27:23 +02:00
|
|
|
#timercb = function() {
|
2025-10-14 12:58:58 +02:00
|
|
|
this.#log(6,'Timer tick');
|
2025-10-08 12:28:02 +02:00
|
|
|
this.refresh();
|
2025-10-09 10:27:23 +02:00
|
|
|
}.bind(this);
|
2025-10-08 12:28:02 +02:00
|
|
|
|
|
|
|
|
setTimer() {
|
2025-10-09 10:27:23 +02:00
|
|
|
this.#timer = window.setInterval(this.#timercb, 2000);
|
2025-10-08 12:28:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
haltTimer() {
|
|
|
|
|
window.clearInterval(this.#timer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
save() {
|
2025-10-08 14:30:54 +02:00
|
|
|
this.#dom_servermanager.saveServers();
|
2025-10-08 12:28:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rpc(server, method, args) {
|
2025-10-08 14:30:54 +02:00
|
|
|
this.#dom_servermanager.getServers()[server].rpccall_debug(method, args);
|
2025-10-08 12:28:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addServer(name, url, user, pass) {
|
2025-10-09 15:42:31 +02:00
|
|
|
this.#dom_servermanager.addServer(name, url, user, pass);
|
2025-10-08 12:28:02 +02:00
|
|
|
}
|
|
|
|
|
|
2025-10-09 15:42:31 +02:00
|
|
|
/*removeServer(name) {
|
2025-10-09 10:06:29 +02:00
|
|
|
delete this.#dom_servermanager.getServers()[name];
|
2025-10-08 12:28:02 +02:00
|
|
|
|
|
|
|
|
for (const [hash, entry] of Object.entries(this.#knownTorrents)) {
|
|
|
|
|
entry.element.removeChild(entry.element_server[name]);
|
|
|
|
|
delete entry.servers[name];
|
|
|
|
|
delete entry.element_server[name]
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-08 14:30:54 +02:00
|
|
|
this.#dom_servermanager.saveServers();
|
2025-10-09 15:42:31 +02:00
|
|
|
}*/
|
2025-10-08 12:28:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var trinstance = new trweb('trcontainer', null, null, function(msg) {console.info(`TRWEB: ${msg}`)});
|
|
|
|
|
//var trinstance = new trweb('trcontainer', null, null, null);
|