Files
trweb/js/trweb.js

123 lines
3.8 KiB
JavaScript

"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) {};
#logcb = function(module, loglevel, msg) {
if (loglevel <= 5) {
this.#logger(`${module}: ${msg}`);
}
}.bind(this);
#log(loglevel, msg) {
if (this.#logcb !== null) {
this.#logcb('TRWEB', loglevel, msg);
}
}
#timer;
#container;
#guiFooter;
#dom_menubar = new trdom_menubar();
#dom_servermanager;
#dom_torrentmanagger;
constructor (container, loadcb, savecb, logger) {
this.#container = container;
if (loadcb != null) {
this.#loadcb = loadcb;
this.#savecb = savecb;
}
if (logger != null) {
this.#logger = logger;
}
this.#dom_servermanager = new trdom_servermanager(this.#loadcb, this.#savecb, this.#logcb);
this.#dom_torrentmanagger = new trdom_torrentmanager(this.#logcb);
/* trdom_torrentmanager uses this to add new server controls to existing torrents */
this.#dom_servermanager.addEventListener('torrentserver-added', this.#dom_torrentmanagger);
this.#dom_servermanager.addEventListener('torrent-created', this.#dom_torrentmanagger);
this.#dom_menubar.addMenuNode('servermanager', this.#dom_servermanager.menuentry);
this.#guiFooter = document.createElement('div');
this.#guiFooter.classList.add('trweb_footer');
if (document.readyState === 'complete' || document.readyState === 'interactive') {
this.#logger('Document already loaded, jumpstarting');
// we don't want to re-trigger every listener, so call handler directly instead of dispatching an event
this.handleEvent({'type': 'DOMContentLoaded'});
}
else {
this.#logger('Waiting for document to load');
document.addEventListener('DOMContentLoaded', this);
}
}
handleEvent(e) {
this.#log(6, `Handling event of type ${e.type}`);
switch (e.type) {
case 'DOMContentLoaded':
this.#logger('Activating TRWEB instance');
this.#container = document.getElementById(this.#container);
this.#container.classList.add('trweb_container', 'd-flex', 'flex-column', 'h-100');
this.#container.appendChild(this.#dom_menubar.element);
this.#container.appendChild(this.#dom_torrentmanagger.element);
this.#container.appendChild(this.#guiFooter);
this.#dom_servermanager.loadServers();
this.setTimer();
break;
default:
this.#log(5, `Event type ${e.type} not supported`);
break;
}
}
refresh() {
this.#log(6,'Refresh');
for (const [key, value] of Object.entries(this.#dom_servermanager.getServers())) {
value.refreshTorrentList();
}
}
#timercb = function() {
this.#log(6,'Timer tick');
this.refresh();
}.bind(this);
setTimer() {
this.#timer = window.setInterval(this.#timercb, 2000);
}
haltTimer() {
window.clearInterval(this.#timer);
}
save() {
this.#dom_servermanager.saveServers();
}
rpc(server, method, args) {
this.#dom_servermanager.getServers()[server].rpccall_debug(method, args);
}
addServer(name, url, user, pass) {
this.#dom_servermanager.addServer(name, url, user, pass);
}
removeServer(name) {
this.#dom_servermanager.removeServer(name);
}
}
var trinstance = new trweb('trcontainer', null, null, function(msg) {console.info(`TRWEB: ${msg}`)});
//var trinstance = new trweb('trcontainer', null, null, null);