Add player list stuff, fix formatting, and mote

This commit is contained in:
2025-06-09 19:05:25 -05:00
parent bf068bfd40
commit 5739c2d394

View File

@ -1,344 +1,354 @@
/** /**
Main JS file for WebConsole. Main JS file for WebConsole.
https://github.com/mesacarlos https://github.com/mesacarlos
2019-2020 Carlos Mesa under MIT License. 2019-2020 Carlos Mesa under MIT License.
*/ */
/** /**
* Global variables * Global variables
*/ */
const persistenceManager = new WebConsolePersistenceManager(); const persistenceManager = new WebConsolePersistenceManager();
const connectionManager = new WebConsoleManager(); const connectionManager = new WebConsoleManager();
let lang; let lang;
let autoPasswordCompleted = false; //When true, saved password was used. If a 401 is received, then saved password is not correct let autoPasswordCompleted = false; //When true, saved password was used. If a 401 is received, then saved password is not correct
let statusCommandsInterval = -1; let statusCommandsInterval = -1;
let commandHistoryIndex = -1; //Saves current command history index. -1 when not browsing history. let commandHistoryIndex = -1; //Saves current command history index. -1 when not browsing history.
var reconnecting = false;
/**
* Load list of servers in file servers.json
* and auto update in next request when file is changed /**
*/ * Load list of servers in file servers.json
function readServerList() { * and auto update in next request when file is changed
let hash = persistenceManager.getSetting('server:hash') */
function readServerList() {
/** let hash = persistenceManager.getSetting('server:hash')
* Hash code function used for compare version of file servers.json
* https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript /**
*/ * Hash code function used for compare version of file servers.json
const hashCode = s => s.split('').reduce((a,b)=>{a=((a<<5)-a)+b.charCodeAt(0);return a&a},0); * https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript
*/
fetch('servers.json') const hashCode = s => s.split('').reduce((a,b)=>{a=((a<<5)-a)+b.charCodeAt(0);return a&a},0);
.then(res => res.text())
.then(json => { fetch('servers.json')
if (hash !== hashCode(json)) { .then(res => res.text())
persistenceManager.setSetting('server:hash', hashCode(json)) .then(json => {
JSON.parse(json).forEach(server => persistenceManager.saveServer(server)) if (hash !== hashCode(json)) {
} persistenceManager.setSetting('server:hash', hashCode(json))
}) JSON.parse(json).forEach(server => persistenceManager.saveServer(server))
.then(updateServerList) }
.catch(() => console.info('Ignore load new list in file servers.json.')); })
} .then(updateServerList)
.catch(() => console.info('Ignore load new list in file servers.json.'));
/** }
* Prepare and show server to user
*/
function openServer(serverName){ function reconnectServer(serverName) {
//Hide welcome div if user is not in welcome page $('#disconnectionModal').hide();
$("#welcomeContainer").hide(); reconnecting = true;
$("#serverContainer").show(); openServer(serverName);
}
//Change server name and related info
$("#serverTitle").text(serverName); /**
$("#consoleTextArea").text(""); * Prepare and show server to user
$("#commandInput").prop("disabled", false); */
$("#sendCommandButton").prop("disabled", false); function openServer(serverName){
//Hide welcome div if user is not in welcome page
//New server, new variables: $("#welcomeContainer").hide();
autoPasswordCompleted = false; $("#serverContainer").show();
commandHistoryIndex = -1; //Reset command history index $("#serverTitle").text(serverName); //Change server name and related info
//Create or retrieve connection $("#consoleTextArea").css("font-size", persistenceManager.getSetting("consoleFontSize")+"px");
connectionManager.loadConnection(serverName);
if (!reconnecting && typeof connectionManager.activeConnection === 'undefined') $("#consoleTextArea").text("");
//Load saved messages
let i; $("#commandInput").prop("disabled", false);
const messages = connectionManager.activeConnection.messages; $("#sendCommandButton").prop("disabled", false);
for(i = 0; i < messages.length; i++){
if(messages[i].status !== 401){ //New server, new variables:
onWebSocketsMessage(messages[i]); autoPasswordCompleted = false;
} commandHistoryIndex = -1; //Reset command history index
}
connectionManager.loadConnection(serverName); //Create or retrieve connection
//Subscribe a function
connectionManager.activeConnection.subscribe(onWebSocketsMessage); //Load saved messages
} // let i;
// const messages = connectionManager.activeConnection.messages;
function onWebSocketsMessage(message){ // for(i = 0; i < messages.length; i++){
switch (message.status) { // if(messages[i].status !== 401){
case 10: // onWebSocketsMessage(messages[i]);
//Console Output // }
writeToWebConsole(message.message, message.time); // }
break; //Subscribe a function
case 200: connectionManager.activeConnection.subscribe(onWebSocketsMessage);
//LoggedIn }
writeToWebConsole(message.message);
function onWebSocketsMessage(message){
//Show user and permissions switch (message.status) {
$("#loggedUsernameLabel").text(message.username); case 10: //Console Output
$("#loggedUserTypeLabel").text(message.as); writeToWebConsole(message.message, message.time);
break;
//Disable command bar if user is viewer case 200: //LoggedIn
if(message.as.toLowerCase() === "viewer"){ writeToWebConsole(message.message);
$("#commandInput").prop("disabled", true); //Show user and permissions
$("#sendCommandButton").prop("disabled", true); $("#loggedUsernameLabel").text(message.username);
} $("#loggedUserTypeLabel").text(message.as);
//Disable command bar if user is viewer
//Read log file if enabled if(message.as.toLowerCase() === "viewer"){
if(connectionManager.activeConnection.isLogged === false){ $("#commandInput").prop("disabled", true);
connectionManager.activeConnection.isLogged = true; $("#sendCommandButton").prop("disabled", true);
if(persistenceManager.getSetting("retrieveLogFile") === true) }
connectionManager.askForLogs(); //Read log file if enabled
} if(connectionManager.activeConnection.isLogged === false){
break; connectionManager.activeConnection.isLogged = true;
case 400: if(persistenceManager.getSetting("retrieveLogFile") === true) {
//Unknown Command if (reconnecting) reconnecting = false;
writeToWebConsole(message.message); else connectionManager.askForLogs();
break; }
case 401: }
//Waiting for login. Show password modal or retrieve password break;
const savedPwd = persistenceManager.getServer(connectionManager.activeConnection.serverName).serverPassword; case 400:
if(typeof savedPwd !== "undefined" && !autoPasswordCompleted){ //Unknown Command
connectionManager.sendPassword(savedPwd); writeToWebConsole(message.message);
autoPasswordCompleted = true; break;
}else{ case 401: //Waiting for login. Show password modal or retrieve password
$('#passwordModal').modal('show'); const savedPwd = persistenceManager.getServer(connectionManager.activeConnection.serverName).serverPassword;
} if(typeof savedPwd !== "undefined" && !autoPasswordCompleted){
break; connectionManager.sendPassword(savedPwd);
case 1000: autoPasswordCompleted = true;
//Players } else { $('#passwordModal').modal('show'); }
writePlayerInfo(message.connectedPlayers, message.maxPlayers); break;
connectionManager.activeConnection.players = JSON.parse(message.players); case 1000: //Players
break; writePlayerInfo(message.connectedPlayers, message.maxPlayers);
case 1001: connectionManager.activeConnection.players = JSON.parse(message.players);
//Cpu Usage break;
writeCpuInfo(message.usage); case 1001: //Cpu Usage
break; writeCpuInfo(message.usage);
case 1002: break;
//RAM Usage case 1002: //RAM Usage
writeRamInfo(message.free, message.used, message.max); writeRamInfo(message.free, message.used, message.max);
break; break;
case 1003: case 1003: //Server TPS
//Server TPS writeTpsInfo(message.tps, 20);
writeTpsInfo(message.tps, 20); break;
break; default:
default: console.log('Unknown server response:');
console.log('Unknown server response:'); }
} console.log(message);
console.log(message);
//Add interval for Players, CPU and RAM info, if not set
//Add interval for Players, CPU and RAM info, if not set if(statusCommandsInterval === -1 && message.status !== 401){
if(statusCommandsInterval === -1 && message.status !== 401){ statusCommandsInterval = setInterval(function(){
statusCommandsInterval = setInterval(function(){ connectionManager.askForInfo();
connectionManager.askForInfo(); }, persistenceManager.getSetting("infoRefreshInterval"));
}, 2500); }
} }
}
/**
/** * Write to console
* Write to console */
*/ function writeToWebConsole(msg, time){
function writeToWebConsole(msg, time){ const textArea = document.getElementById("consoleTextArea")
const isScrolledDown = document.getElementById("consoleTextArea").scrollHeight - document.getElementById("consoleTextArea").scrollTop - 40 === $("#consoleTextArea").height(); const isScrolledDown = (textArea.scrollHeight-textArea.scrollTop-40) <= ($("#consoleTextArea").height()+100);
//Write to div, replacing < to &lt; (to avoid XSS) and replacing new line to br.
//Write to div, replacing < to &lt; (to avoid XSS) and replacing new line to br. msg = msg.replace(/</g, "&lt;");
msg = msg.replace(/</g, "&lt;"); msg = msg.replace(/(?:\r\n|\r|\n)/g, "<br>");
msg = msg.replace(/(?:\r\n|\r|\n)/g, "<br>");
// LINUX color codes:
//Color filter for Windows (thanks to SuperPykkon) msg = msg.replace(/\033\[30m/g, "</span><span style='color: #000000;'>"); //&0
msg = msg.replace(/\[0;30;22m/g, "<span style='color: #000000;'>"); //&0 msg = msg.replace(/\033\[90m/g, "</span><span style='color: #000000;'>"); //&0
msg = msg.replace(/\[0;34;22m/g, "<span style='color: #0000AA;'>"); //&1
msg = msg.replace(/\[0;32;22m/g, "<span style='color: #00AA00;'>"); //&2 msg = msg.replace(/\033\[34m/g, "</span><span style='color: #0000AA;'>"); //&1
msg = msg.replace(/\[0;36;22m/g, "<span style='color: #00AAAA;'>"); //&3 msg = msg.replace(/\033\[32m/g, "</span><span style='color: #55FF55;'>"); //&2 was \/
msg = msg.replace(/\[0;31;22m/g, "<span style='color: #AA0000;'>"); //&4 msg = msg.replace(/\033\[92m/g, "</span><span style='color: #55FF55;'>"); //&2 was #00AA00
msg = msg.replace(/\[0;35;22m/g, "<span style='color: #AA00AA;'>"); //&5 // msg = msg.replace(/\033\[36m/g, "</span><span style='color: #00AAAA;'>"); //&3
msg = msg.replace(/\[0;33;22m/g, "<span style='color: #FFAA00;'>"); //&6 msg = msg.replace(/\033\[96m/g, "</span><span style='color: #55FFFF;'>"); //&3 was #00AAAA
msg = msg.replace(/\[0;37;22m/g, "<span style='color: #AAAAAA;'>"); //&7 // msg = msg.replace(/\033\[31m/g, "</span><span style='color: #AA0000;'>"); //&4
msg = msg.replace(/\[0;30;1m/g, "<span style='color: #555555;'>"); //&8 msg = msg.replace(/\033\[91m/g, "</span><span style='color: #FF5555;'>"); //&4 was #AA0000
msg = msg.replace(/\[0;34;1m/g, "<span style='color: #5555FF;'>"); //&9
msg = msg.replace(/\[0;32;1m/g, "<span style='color: #55FF55;'>"); //&a msg = msg.replace(/\033\[35m/g, "</span><span style='color: #AA00AA;'>"); //&5
msg = msg.replace(/\[0;36;1m/g, "<span style='color: #55FFFF;'>"); //&b msg = msg.replace(/\033\[33m/g, "</span><span style='color: #FFAA00;'>"); //&6
msg = msg.replace(/\[0;31;1m/g, "<span style='color: #FF5555;'>"); //&c msg = msg.replace(/\033\[37m/g, "</span><span style='color: #AAAAAA;'>"); //&7
msg = msg.replace(/\[0;35;1m/g, "<span style='color: #FF55FF;'>"); //&d msg = msg.replace(/\033\[30m/g, "</span><span style='color: #555555;'>"); //&8
msg = msg.replace(/\[0;33;1m/g, "<span style='color: #FFFF55;'>"); //&e msg = msg.replace(/\033\[34m/g, "</span><span style='color: #5555FF;'>"); //&9
msg = msg.replace(/\[0;37;1m/g, "<span style='color: #FFFFFF;'>"); //&f msg = msg.replace(/\033\[33m/g, "</span><span style='color: #00AA00;'>"); //&a was #55FF55
msg = msg.replace(/\[m/g, "</span>"); //&f msg = msg.replace(/\033\[36m/g, "</span><span style='color: #00AAAA;'>"); //&b was #55FFFF
msg = msg.replace(/\033\[31m/g, "</span><span style='color: #AA0000;'>"); //&c was #FF5555
//Color filter for UNIX (This is easier!) // msg = msg.replace(/\033\[35m/g, "</span><span style='color: #FF55FF;'>"); //&d
//span may not be closed every time but browsers will do for ourselves msg = msg.replace(/\033\[95m/g, "</span><span style='color: #FF55FF;'>"); //&d
msg = msg.replace(/§0/g, "<span style='color: #000000;'>"); //&0 // msg = msg.replace(/\033\[33m/g, "</span><span style='color: #FFFF55;'>"); //&e
msg = msg.replace(/§1/g, "<span style='color: #0000AA;'>"); //&1 msg = msg.replace(/\033\[93m/g, "</span><span style='color: #FFFF55;'>"); //&e
msg = msg.replace(/§2/g, "<span style='color: #00AA00;'>"); //&2 // msg = msg.replace(/\033\[37m/g, "</span><span style='color: #FFFFFF;'>"); //&f
msg = msg.replace(/§3/g, "<span style='color: #00AAAA;'>"); //&3 msg = msg.replace(/\033\[97m/g, "</span><span style='color: #FFFFFF;'>"); //&f
msg = msg.replace(/§4/g, "<span style='color: #AA0000;'>"); //&4
msg = msg.replace(/§5/g, "<span style='color: #AA00AA;'>"); //&5 msg = msg.replace(/\033\[1m/g, "<span style='font-weight:bold;'>"); //&l
msg = msg.replace(/§6/g, "<span style='color: #FFAA00;'>"); //&6 // msg = msg.replace(/\022\[2m/g, "<span style='text-decoration: line-through;'>"); //&m
msg = msg.replace(/§7/g, "<span style='color: #AAAAAA;'>"); //&7 msg = msg.replace(/\033\[3m/g, "<span style='font-style: italic;'>"); //&o
msg = msg.replace(/§8/g, "<span style='color: #555555;'>"); //&8 msg = msg.replace(/\033\[4m/g, "<span style='text-decoration: underline;'>"); //&n
msg = msg.replace(/§9/g, "<span style='color: #5555FF;'>"); //&9
msg = msg.replace(/§a/g, "<span style='color: #55FF55;'>"); //&a msg = msg.replace(/\033\[8m/g, ""); //crazy text
msg = msg.replace(/§b/g, "<span style='color: #55FFFF;'>"); //&b
msg = msg.replace(/§c/g, "<span style='color: #FF5555;'>"); //&c msg = msg.replace(/\033\[0m/g, "</span>"); //&r
msg = msg.replace(/§d/g, "<span style='color: #FF55FF;'>"); //&d
msg = msg.replace(/§e/g, "<span style='color: #FFFF55;'>"); //&e
msg = msg.replace(/§f/g, "<span style='color: #FFFFFF;'>"); //&f //Color filter for Windows (thanks to SuperPykkon)
// msg = msg.replace(/\[0;30;22m/g, "<span style='color: #000000;'>"); //&0
msg = msg.replace(/§l/g, "<span style='font-weight:bold;'>"); //&l // msg = msg.replace(/\[0;34;22m/g, "<span style='color: #0000AA;'>"); //&1
msg = msg.replace(/§m/g, "<span style='text-decoration: line-through;'>"); //&m // msg = msg.replace(/\[0;32;22m/g, "<span style='color: #00AA00;'>"); //&2
msg = msg.replace(/§n/g, "<span style='text-decoration: underline;'>"); //&n // msg = msg.replace(/\[0;36;22m/g, "<span style='color: #00AAAA;'>"); //&3
msg = msg.replace(/§o/g, "<span style='font-style: italic;'>"); //&o // msg = msg.replace(/\[0;31;22m/g, "<span style='color: #AA0000;'>"); //&4
// msg = msg.replace(/\[0;35;22m/g, "<span style='color: #AA00AA;'>"); //&5
msg = msg.replace(/§r/g, "</span>"); //&r // msg = msg.replace(/\[0;33;22m/g, "<span style='color: #FFAA00;'>"); //&6
// msg = msg.replace(/\[0;37;22m/g, "<span style='color: #AAAAAA;'>"); //&7
//Color filter for MC 1.18 (Also easy :D) // msg = msg.replace(/\[0;30;1m/g, "<span style='color: #555555;'>"); //&8
//span may not be closed every time but browsers will do for ourselves // msg = msg.replace(/\[0;34;1m/g, "<span style='color: #5555FF;'>"); //&9
msg = msg.replace(/0/g, "<span style='color: #000000;'>"); //&0 // msg = msg.replace(/\[0;32;1m/g, "<span style='color: #55FF55;'>"); //&a
msg = msg.replace(/1/g, "<span style='color: #0000AA;'>"); //&1 // msg = msg.replace(/\[0;36;1m/g, "<span style='color: #55FFFF;'>"); //&b
msg = msg.replace(/2/g, "<span style='color: #00AA00;'>"); //&2 // msg = msg.replace(/\[0;31;1m/g, "<span style='color: #FF5555;'>"); //&c
msg = msg.replace(/3/g, "<span style='color: #00AAAA;'>"); //&3 // msg = msg.replace(/\[0;35;1m/g, "<span style='color: #FF55FF;'>"); //&d
msg = msg.replace(/4/g, "<span style='color: #AA0000;'>"); //&4 // msg = msg.replace(/\[0;33;1m/g, "<span style='color: #FFFF55;'>"); //&e
msg = msg.replace(/5/g, "<span style='color: #AA00AA;'>"); //&5 // msg = msg.replace(/\[0;37;1m/g, "<span style='color: #FFFFFF;'>"); //&f
msg = msg.replace(/6/g, "<span style='color: #FFAA00;'>"); //&6 // // msg = msg.replace(/\[m/g, "</span>"); //&f
msg = msg.replace(/7/g, "<span style='color: #AAAAAA;'>"); //&7
msg = msg.replace(/8/g, "<span style='color: #555555;'>"); //&8 //Color filter for UNIX (This is easier!)
msg = msg.replace(/9/g, "<span style='color: #5555FF;'>"); //&9 //span may not be closed every time but browsers will do for ourselves
msg = msg.replace(/a/g, "<span style='color: #55FF55;'>"); //&a // msg = msg.replace(/§0/g, "<span style='color: #000000;'>"); //&0
msg = msg.replace(/b/g, "<span style='color: #55FFFF;'>"); //&b // msg = msg.replace(/§1/g, "<span style='color: #0000AA;'>"); //&1
msg = msg.replace(/c/g, "<span style='color: #FF5555;'>"); //&c // msg = msg.replace(/§2/g, "<span style='color: #00AA00;'>"); //&2
msg = msg.replace(/d/g, "<span style='color: #FF55FF;'>"); //&d // msg = msg.replace(/§3/g, "<span style='color: #00AAAA;'>"); //&3
msg = msg.replace(/e/g, "<span style='color: #FFFF55;'>"); //&e // msg = msg.replace(/§4/g, "<span style='color: #AA0000;'>"); //&4
msg = msg.replace(/f/g, "<span style='color: #FFFFFF;'>"); //&f // msg = msg.replace(/§5/g, "<span style='color: #AA00AA;'>"); //&5
// msg = msg.replace(/§6/g, "<span style='color: #FFAA00;'>"); //&6
msg = msg.replace(/l/g, "<span style='font-weight:bold;'>"); //&l // msg = msg.replace(/§7/g, "<span style='color: #AAAAAA;'>"); //&7
msg = msg.replace(/m/g, "<span style='text-decoration: line-through;'>"); //&m // msg = msg.replace(/§8/g, "<span style='color: #555555;'>"); //&8
msg = msg.replace(/n/g, "<span style='text-decoration: underline;'>"); //&n // msg = msg.replace(/§9/g, "<span style='color: #5555FF;'>"); //&9
msg = msg.replace(/o/g, "<span style='font-style: italic;'>"); //&o // msg = msg.replace(/§a/g, "<span style='color: #55FF55;'>"); //&a
// msg = msg.replace(/§b/g, "<span style='color: #55FFFF;'>"); //&b
msg = msg.replace(/r/g, "</span>"); //&r // msg = msg.replace(/§c/g, "<span style='color: #FF5555;'>"); //&c
// msg = msg.replace(/§d/g, "<span style='color: #FF55FF;'>"); //&d
//Append datetime if enabled // msg = msg.replace(/§e/g, "<span style='color: #FFFF55;'>"); //&e
if(persistenceManager.getSetting("dateTimePrefix")){ // msg = msg.replace(/§f/g, "<span style='color: #FFFFFF;'>"); //&f
if(typeof time !== 'undefined' && time !== null) //if time is present and not null
msg = "[" + time + "] " + msg; // msg = msg.replace(/§l/g, "<span style='font-weight:bold;'>"); //&l
else if(typeof time !== 'undefined' && time === null) //if time is present and null // msg = msg.replace(/§m/g, "<span style='text-decoration: line-through;'>"); //&m
; //no time (is already printed) // msg = msg.replace(/§n/g, "<span style='text-decoration: underline;'>"); //&n
else // msg = msg.replace(/§o/g, "<span style='font-style: italic;'>"); //&o
msg = "[" + new Date().toLocaleTimeString() + "] " + msg;
} // msg = msg.replace(/§r/g, "</span>"); //&r
$("#consoleTextArea").append(msg + "<br>"); //Color filter for MC codes.
msg = msg.replace(/§0/g, "<span style='color: #000000;'>"); //&0
if(isScrolledDown){ msg = msg.replace(/§1/g, "<span style='color: #0000AA;'>"); //&1
const textarea = document.getElementById('consoleTextArea'); msg = msg.replace(/§2/g, "<span style='color: #00AA00;'>"); //&2
textarea.scrollTop = textarea.scrollHeight; msg = msg.replace(/§3/g, "<span style='color: #00AAAA;'>"); //&3
} msg = msg.replace(/§4/g, "<span style='color: #AA0000;'>"); //&4
} msg = msg.replace(/§5/g, "<span style='color: #AA00AA;'>"); //&5
msg = msg.replace(/§6/g, "<span style='color: #FFAA00;'>"); //&6
/** msg = msg.replace(/§7/g, "<span style='color: #AAAAAA;'>"); //&7
* Fill connected players card msg = msg.replace(/§8/g, "<span style='color: #555555;'>"); //&8
*/ msg = msg.replace(/§9/g, "<span style='color: #5555FF;'>"); //&9
function writePlayerInfo(connected, maximum){ msg = msg.replace(/§a/g, "<span style='color: #55FF55;'>"); //&a
$("#connectedPlayers").text(connected); msg = msg.replace(/§b/g, "<span style='color: #55FFFF;'>"); //&b
$("#maxPlayers").text(maximum); msg = msg.replace(/§c/g, "<span style='color: #FF5555;'>"); //&c
msg = msg.replace(/§d/g, "<span style='color: #FF55FF;'>"); //&d
const percent = (connected / maximum) * 100; msg = msg.replace(/§e/g, "<span style='color: #FFFF55;'>"); //&e
$("#playerProgressBar").width(percent + "%"); msg = msg.replace(/§f/g, "<span style='color: #FFFFFF;'>"); //&f
}
msg = msg.replace(/§l/g, "<span style='font-weight:bold;'>"); //&l
/** msg = msg.replace(/§m/g, "<span style='text-decoration: line-through;'>"); //&m
* Fill CPU info card msg = msg.replace(/§n/g, "<span style='text-decoration: underline;'>"); //&n
*/ msg = msg.replace(/§o/g, "<span style='font-style: italic;'>"); //&o
function writeCpuInfo(usage){
$("#cpuInfo").text(usage + "%"); msg = msg.replace(/§r/g, "</span>"); //&r
$("#CpuProgressBar").width(usage + "%"); //Append datetime if enabled
} if(persistenceManager.getSetting("dateTimePrefix")){
if(typeof time !== 'undefined') {//if time is present
/** if(time !== null) msg = "[" + time + "] " + msg; //and not null
* Fill RAM info card else msg = "["+new Date().toLocaleTimeString()+"] "+msg; // and is null
*/ }
function writeRamInfo(free, used, total){ }
$("#usedRam").text(used); $("#consoleTextArea").append(msg + "<br>");
$("#totalRam").text(total); if(isScrolledDown){ textArea.scrollTop = textArea.scrollHeight; }
}
const percent = (used / total) * 100; /**
$("#RamProgressBar").width(percent + "%"); * Fill connected players card
} */
function writePlayerInfo(connected, maximum){
/** $("#connectedPlayers").text(connected); $("#maxPlayers").text(maximum);
* Fill TPS info card const percent = (connected / maximum) * 100; $("#playerProgressBar").width(percent + "%");
*/ if(connectionManager.activeConnection){
function writeTpsInfo(tps, max){ $("#playerList").text(connectionManager.activeConnection.players.splice(",&nbsp;&nbsp;"));
if(tps > 20) { } else $("#playerList").text("");
tps = 20; }
} /**
$("#tps").text(tps); * Fill CPU info card
$("#maxTps").text(max); */
function writeCpuInfo(usage){
const percent = (tps / max) * 100; $("#cpuInfo").text(usage + "%"); $("#CpuProgressBar").width(usage + "%");
$("#TpsProgressBar").width(percent + "%"); }
} /**
* Fill RAM info card
/** */
* Called from WebConsoleConnector only. function writeRamInfo(free, used, total){
*/ $("#usedRam").text(used); $("#totalRam").text(total);
function closedConnection(serverName){ const percent = (used / total) * 100; $("#RamProgressBar").width(percent + "%");
if(connectionManager.activeConnection.serverName === serverName){ }
//Disable command input and button /**
$("#commandInput").prop("disabled", true); * Fill TPS info card
$("#sendCommandButton").prop("disabled", true); */
function writeTpsInfo(tps, max){
//Inform user if(tps > 20) { tps = 20; }
$('#disconnectionModal').modal('show'); $("#tps").text(tps);
} $("#maxTps").text(max);
connectionManager.deleteConnection(serverName, true); const percent = (tps / max) * 100;
} $("#TpsProgressBar").width(percent + "%");
}
/** /**
* Shows welcome screen * Called from WebConsoleConnector and 'Disconnect' button
*/ */
function backToHomepage(){ function closedConnection(serverName){
//Stop gathering info from server if(connectionManager.activeConnection.serverName === serverName){
clearInterval(statusCommandsInterval); //Disable command input and button
statusCommandsInterval = -1; $("#commandInput").prop("disabled", true);
$("#sendCommandButton").prop("disabled", true);
//Reset command history index //Inform user
commandHistoryIndex = -1; $('#disconnectionModal').modal('show');
$("#disconnectionModalReconnectButton").click(function() {
//Clear all server indicators reconnectServer(serverName);
writePlayerInfo(0, 0); });
writeCpuInfo(0); }
writeRamInfo(0, 0, 0); connectionManager.deleteConnection(serverName, false);
clearInterval(statusCommandsInterval); // Stop gathering info from server
$("#welcomeContainer").show(); statusCommandsInterval = -1;
$("#serverContainer").hide(); commandHistoryIndex = -1; //Reset command history index
} }
/**
/** * Shows welcome screen
* Update dropdown with saved server list */
*/ function backToHomepage(){
function updateServerList(){ clearInterval(statusCommandsInterval); //Stop gathering info from server
//Delete all servers in dropdown if(connectionManager.activeConnection === null) { $("#consoleTextArea").text(""); }
$('.servermenuitem').remove(); statusCommandsInterval = -1;
commandHistoryIndex = -1; //Reset command history index
//Add all servers writePlayerInfo(0, 0); writeCpuInfo(0); writeRamInfo(0, 0, 0); //Clear all server indicators
const servers = persistenceManager.getAllServers();
for(let i = 0; i < servers.length; i++){ $("#welcomeContainer").show();
$('#ServerListDropDown').append('<a class="dropdown-item servermenuitem" href="#" onclick="openServer(\'' + servers[i].serverName + '\')">' + servers[i].serverName.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"").replace(/"/g,"") + '</a>'); $("#serverContainer").hide();
} }
/**
//Show a "no servers" message when no servers are added * Update dropdown with saved server list
if(servers.length === 0){ */
$('#ServerListDropDown').append('<a class="dropdown-item servermenuitem disabled" href="#" id="noServersAdded">No servers added</a>'); function updateServerList(){
} //Delete all servers in dropdown
} $('.servermenuitem').remove();
//Add all servers
const servers = persistenceManager.getAllServers();
for(let i = 0; i < servers.length; i++){
$('#ServerListDropDown').append(`<a class="dropdown-item servermenuitem" onclick="openServer('${servers[i].serverName}')">${servers[i].serverName.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"").replace(/"/g,"")}</a>`);
}
//Show a "no servers" message when no servers are added
if(servers.length === 0){
$('#ServerListDropDown').append('<a class="dropdown-item servermenuitem disabled" id="noServersAdded">No servers added</a>');
}
}