From 0d6b89a7d3a656f08d083b6cef042df257da88bb Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Fri, 3 Apr 2026 22:52:06 +0200 Subject: [PATCH] some stuff --- server/datahandler.js | 18 ++-- server/index.js | 50 ++++++---- server/plugins.js | 14 +-- server/server_config.js | 4 +- server/stream/index.js | 2 +- server/tunnel.js | 2 +- views/403.ejs | 2 +- web/js/3las_helper.js | 3 + web/js/audio.js | 4 +- web/js/confighandler.js | 3 + web/js/main.js | 199 +++++++++++++++------------------------- web/js/settings.js | 19 +--- web/js/setup.js | 5 - web/js/ver.js | 2 +- web/js/wizard.js | 2 +- 15 files changed, 137 insertions(+), 192 deletions(-) diff --git a/server/datahandler.js b/server/datahandler.js index 713ba67..41a0bfd 100644 --- a/server/datahandler.js +++ b/server/datahandler.js @@ -130,7 +130,7 @@ function handleData(wss, receivedData, rdsWss) { dataToSend.agc = receivedLine.substring(1); initialData.agc = receivedLine.substring(1); break; - case receivedLine.startsWith('G'): // EQ / iMS (RF+/IF+) + case receivedLine.startsWith('G'): // EQ / iMS const mapping = filterMappings[receivedLine]; if (mapping) { initialData.eq = mapping.eq; @@ -149,13 +149,13 @@ function handleData(wss, receivedData, rdsWss) { case receivedLine.startsWith('Ss'): processSignal(receivedLine, true, false); break; - case receivedLine.startsWith('SS'): + case receivedLine.startsWith('SS'): // ss? oh no processSignal(receivedLine, true, true); break; case receivedLine.startsWith('SM'): processSignal(receivedLine, false, true); break; - case receivedLine.startsWith('R'): // RDS HEX + case receivedLine.startsWith('R'): rdsReceived(); modifiedData = receivedLine.slice(1); dataToSend.rds = true; @@ -202,9 +202,7 @@ function handleData(wss, receivedData, rdsWss) { legacyRdsPiBuffer = null; break; case receivedLine.startsWith("!"): - wss.clients.forEach((client) => { - client.send(receivedLine.trim()); - }); + wss.clients.forEach((client) => client.send(receivedLine.trim())); break; } } @@ -236,9 +234,7 @@ function handleData(wss, receivedData, rdsWss) { // Send the updated data to the client const dataToSendJSON = JSON.stringify(dataToSend); if (currentTime - lastUpdateTime >= updateInterval) { - wss.clients.forEach((client) => { - client.send(dataToSendJSON); - }); + wss.clients.forEach((client) => client.send(dataToSendJSON)); lastUpdateTime = Date.now(); serialportUpdateTime = process.hrtime(); } @@ -307,6 +303,4 @@ function processSignal(receivedData, st, stForced) { } } -module.exports = { - handleData, showOnlineUsers, dataToSend, initialData, resetToDefault, state -}; +module.exports = { handleData, showOnlineUsers, dataToSend, initialData, resetToDefault, state }; diff --git a/server/index.js b/server/index.js index 9cacd01..fa0cbe9 100644 --- a/server/index.js +++ b/server/index.js @@ -28,12 +28,15 @@ const pjson = require('../package.json'); const client = new net.Socket(); const wss = new WebSocket.Server({ noServer: true }); const rdsWss = new WebSocket.Server({ noServer: true }); +const rawComm = new WebSocket.Server({ noServer: true }); const pluginsWss = new WebSocket.Server({ noServer: true, perMessageDeflate: true }); storage.websocket_delegation.set("/text", wss); storage.websocket_delegation.set("/rds", rdsWss); storage.websocket_delegation.set("/rdsspy", rdsWss); +storage.websocket_delegation.set("/rawcomm", rawComm); storage.websocket_delegation.set("/data_plugins", pluginsWss); +require('./stream/ws.js'); // Get all plugins from config and find corresponding server files const plugins = findServerFiles(serverConfig.plugins); @@ -52,8 +55,6 @@ console.log('\x1b[32m\x1b[2mby Noobish @ \x1b[4mFMDX.org + KubaPro010\x1b[0m'); console.log("v" + pjson.version) console.log('\x1b[90m' + '─'.repeat(terminalWidth - 1) + '\x1b[0m'); -require('./stream/ws.js'); -require('./stream/index'); require('./plugins'); let currentUsers = 0; @@ -71,6 +72,7 @@ app.use(bodyParser.json()); createChatServer(storage); tunnel.download(); +require('./stream/index'); connectToXdrd(); connectToSerial(); @@ -146,6 +148,9 @@ function connectToSerial() { serialport.on('data', (data) => { helpers.resolveDataBuffer(data, wss, rdsWss); + rawComm.clients.forEach((client) => { + if (client.readyState === WebSocket.OPEN) client.send(data); + }); }); serialport.on('error', (error) => { @@ -191,6 +196,9 @@ client.on('data', (data) => { const { xdrd } = serverConfig; helpers.resolveDataBuffer(data, wss, rdsWss); + rawComm.clients.forEach((client) => { + if (client.readyState === WebSocket.OPEN) client.send(data); + }); if (authFlags.authMsg == true && authFlags.messageCount > 1) return; authFlags.messageCount++; @@ -268,10 +276,6 @@ client.on('error', (err) => { } }); -app.set('view engine', 'ejs'); -app.set('views', path.join(__dirname, '../views')); -app.use('/', endpoints); - const tunerLockTracker = new WeakMap(); const ipConnectionCounts = new Map(); // Per-IP limit variables const ipLogTimestamps = new Map(); @@ -290,7 +294,20 @@ setInterval(() => { ipLogTimestamps.delete(ip); } } -}, 60 * 60 * 1000); // Run every hour +}, 30 * 60 * 1000); // Run every half hour + +rawComm.on('connection', (ws, request) => { + const output = serverConfig.xdrd.wirelessConnection ? client : serialport; + const { isAdminAuthenticated } = request.session || {}; + if(!isAdminAuthenticated) { + ws.close(1008, "No admin"); + return; + } + + ws.on('message', (message) => { + output.write(`${message.toString()}\n`); + }); +}); wss.on('connection', (ws, request) => { const output = serverConfig.xdrd.wirelessConnection ? client : serialport; @@ -300,7 +317,7 @@ wss.on('connection', (ws, request) => { // Per-IP limit connection open if (clientIp) { const isLocalIp = ( - clientIp === '127.0.0.1' || clientIp === '::1' || clientIp === '::ffff:127.0.0.1' || + clientIp === '127.0.0.1' || clientIp === '::1' || clientIp.startsWith('192.168.') || clientIp.startsWith('10.') || clientIp.startsWith('172.16.')); if (!isLocalIp) { if (!ipConnectionCounts.has(clientIp)) ipConnectionCounts.set(clientIp, 0); @@ -402,7 +419,7 @@ wss.on('connection', (ws, request) => { } } - if (clientIp !== '::ffff:127.0.0.1' || + if (clientIp !== ':127.0.0.1' || (request.socket && request.socket.remoteAddress && request.socket.remoteAddress !== '::ffff:127.0.0.1') || (request.headers && request.headers['origin'] && request.headers['origin'].trim() !== '')) { currentUsers--; @@ -521,24 +538,23 @@ httpServer.on('upgrade', (request, socket, head) => { } else socket.destroy(); }); +app.set('view engine', 'ejs'); +app.set('views', path.join(__dirname, '../views')); +app.use('/', endpoints); app.use(express.static(path.join(__dirname, '../web'))); // Serve the entire web folder to the user pluginsApi.registerServerContext({ wss, pluginsWss, httpServer, serverConfig }); -const ipv4Address = serverConfig.webserver.webserverIp === '0.0.0.0' ? 'localhost' : serverConfig.webserver.webserverIp; -const port = serverConfig.webserver.webserverPort; - const logServerStart = (address) => { - logInfo(`Web server has started on address \x1b[34mhttp://${address}:${port}\x1b[0m.`); + logInfo(`Web server has started on address \x1b[34mhttp://${address}:${serverConfig.webserver.webserverPort}\x1b[0m.`); }; const startServer = (address) => { - httpServer.listen(port, address, () => { - if (!configExists()) logInfo(`Open your browser and proceed to \x1b[34mhttp://${address}:${port}\x1b[0m to continue with setup.`); + httpServer.listen(serverConfig.webserver.webserverPort, address, () => { + if (!configExists()) logInfo(`Open your browser and proceed to \x1b[34mhttp://${address}:${serverConfig.webserver.webserverPort}\x1b[0m to continue with setup.`); else logServerStart(address); }); }; - -startServer(ipv4Address); +startServer(serverConfig.webserver.webserverIp === '0.0.0.0' ? 'localhost' : serverConfig.webserver.webserverIp); tunnel.connect(); fmdxList.update(); \ No newline at end of file diff --git a/server/plugins.js b/server/plugins.js index c42e064..dda88f8 100644 --- a/server/plugins.js +++ b/server/plugins.js @@ -2,13 +2,11 @@ const fs = require('fs'); const path = require('path'); const consoleCmd = require('./console'); -// Function to read all .js files in a directory function readJSFiles(dir) { const files = fs.readdirSync(dir); return files.filter(file => file.endsWith('.js')); } -// Function to parse plugin config from a file function parsePluginConfig(filePath) { const pluginConfig = {}; @@ -75,10 +73,10 @@ if (!fs.existsSync(webJsPluginsDir)) fs.mkdirSync(webJsPluginsDir, { recursive: // Main function to create symlinks/junctions for plugins function createLinks() { - const pluginsDir = path.join(__dirname, '../plugins'); - const destinationPluginsDir = path.join(__dirname, '../web/js/plugins'); - if (process.platform === 'win32') { + const pluginsDir = path.join(__dirname, '../plugins'); + const destinationPluginsDir = path.join(__dirname, '../web/js/plugins'); + // On Windows, create a junction try { if (fs.existsSync(destinationPluginsDir)) fs.rmSync(destinationPluginsDir, { recursive: true }); @@ -89,8 +87,6 @@ function createLinks() { } } -// Usage example -const allPluginConfigs = collectPluginConfigs(); +// the usage example comment that was here got me so laughing, that i don't know about all of this createLinks(); - -module.exports = allPluginConfigs; +module.exports = collectPluginConfigs(); diff --git a/server/server_config.js b/server/server_config.js index 064afe9..189b784 100644 --- a/server/server_config.js +++ b/server/server_config.js @@ -187,6 +187,4 @@ if (configExists()) { } -module.exports = { - configName, serverConfig, configUpdate, configSave, configExists, configPath -}; +module.exports = { configName, serverConfig, configUpdate, configSave, configExists, configPath }; diff --git a/server/stream/index.js b/server/stream/index.js index 2e7f73d..dc728b6 100644 --- a/server/stream/index.js +++ b/server/stream/index.js @@ -43,7 +43,7 @@ checkFFmpeg().then((ffmpegPath) => { return [ "-fflags", "+nobuffer+flush_packets", "-flags", "low_delay", - "-rtbufsize", "4096", + "-rtbufsize", "2048", "-probesize", "128", ...inputArgs, diff --git a/server/tunnel.js b/server/tunnel.js index 5550ebc..654315c 100644 --- a/server/tunnel.js +++ b/server/tunnel.js @@ -100,4 +100,4 @@ httpPassword = "<%= cfg.httpPassword %>" <% } %> `; -module.exports = { connect, download}; \ No newline at end of file +module.exports = { connect, download }; \ No newline at end of file diff --git a/views/403.ejs b/views/403.ejs index b727776..29aeecb 100644 --- a/views/403.ejs +++ b/views/403.ejs @@ -15,7 +15,7 @@
-

[403]

+

Forbidden


diff --git a/web/js/3las_helper.js b/web/js/3las_helper.js index a8e3404..52c0302 100644 --- a/web/js/3las_helper.js +++ b/web/js/3las_helper.js @@ -2,6 +2,9 @@ Helpers is part of 3LAS (Low Latency Live Audio Streaming) https://github.com/JoJoBond/3LAS */ + +// Terrible + var isAndroid; var isIOS; var isIPadOS; diff --git a/web/js/audio.js b/web/js/audio.js index 0762d56..54cdc3d 100644 --- a/web/js/audio.js +++ b/web/js/audio.js @@ -17,7 +17,7 @@ class WebSocketAudioPlayer { const liveEdge = buffered.end(buffered.length - 1); const lag = liveEdge - this.audio.currentTime; - if (lag > .5) this.audio.currentTime = liveEdge - 0.1; // snap to near live edge + if (lag > .3) this.audio.currentTime = liveEdge - 0.1; // snap to near live edge } start() { @@ -111,7 +111,7 @@ function OnPlayButtonClick(_ev) { } $playbutton.addClass('bg-gray').prop('disabled', true); - setTimeout(() => $playbutton.removeClass('bg-gray').prop('disabled', false), 2500); + setTimeout(() => $playbutton.removeClass('bg-gray').prop('disabled', false), 2000); if (Stream) Stream.setVolume($("#volumeSlider").val()); } diff --git a/web/js/confighandler.js b/web/js/confighandler.js index 1622abc..0e13ed4 100644 --- a/web/js/confighandler.js +++ b/web/js/confighandler.js @@ -18,6 +18,9 @@ function submitConfig() { data: JSON.stringify(configData), success: function (message) { sendToast('success', 'Data saved!', message, true, true); + setTimeout(function () { + location.reload(true); + }, 1500); }, error: function (error) { console.error(error); diff --git a/web/js/main.js b/web/js/main.js index 2ea3784..cb903bf 100644 --- a/web/js/main.js +++ b/web/js/main.js @@ -38,11 +38,8 @@ $(document).ready(function () { var mouseX = e.pageX; var panelLeft = parseInt($panel.css('left')); - if (mouseX <= 10 || (panelLeft === 4 && mouseX <= 100)) { - $panel.css('left', '4px'); - } else { - $panel.css('left', -panelWidth); - } + if (mouseX <= 10 || (panelLeft === 4 && mouseX <= 100)) $panel.css('left', '4px'); + else $panel.css('left', -panelWidth); }); fillPresets(); @@ -50,13 +47,9 @@ $(document).ready(function () { signalToggle.on("change", function () { const signalText = localStorage.getItem('signalUnit'); - if (signalText == 'dbuv') { - signalText.text('dBµV'); - } else if (signalText == 'dbf') { - signalText.text('dBf'); - } else { - signalText.text('dBm'); - } + if (signalText == 'dbuv') signalText.text('dBµV'); + else if (signalText == 'dbf') signalText.text('dBf'); + else signalText.text('dBm'); }); // Check if device is an iPhone to prevent zoom on button press @@ -76,11 +69,8 @@ $(document).ready(function () { let content = $viewportMeta.attr('content'); let re = /maximum\-scale=[0-9\.]+/g; - if (re.test(content)) { - content = content.replace(re, 'maximum-scale=1.0'); - } else { - content += ', maximum-scale=1.0'; - } + if (re.test(content)) content = content.replace(re, 'maximum-scale=1.0'); + else content += ', maximum-scale=1.0'; $viewportMeta.attr('content', content); } @@ -99,7 +89,6 @@ $(document).ready(function () { }); textInput.on('keyup', function (event) { - if (event.key !== 'Backspace' && localStorage.getItem('extendedFreqRange') != "true") { let inputValue = textInput.val(); inputValue = inputValue.replace(/[^0-9.]/g, ''); @@ -119,18 +108,15 @@ $(document).ready(function () { } } } + if (event.key === 'Enter') { - if (socket.readyState === WebSocket.OPEN) { - tuneTo(textInput.val()); - } + if (socket.readyState === WebSocket.OPEN) tuneTo(textInput.val()); textInput.val(''); } }); document.onkeydown = function(event) { - if (!event.repeat) { - checkKey(event); - } + if (!event.repeat) checkKey(event); }; @@ -151,16 +137,11 @@ $(document).ready(function () { var delta = e.originalEvent.deltaY; var adjustment = 0; - if (e.shiftKey) { - adjustment = e.altKey ? 1 : 0.01; - } else if (e.ctrlKey) { - adjustment = 1; - } else { - if (delta > 0) { - tuneDown(); - } else { - tuneUp(); - } + if (e.shiftKey) adjustment = e.altKey ? 1 : 0.01; + else if (e.ctrlKey) adjustment = 1; + else { + if (delta > 0) tuneDown(); + else tuneUp(); return false; } @@ -245,9 +226,7 @@ $(document).ready(function () { if(parsedData.txInfo.dist > 700) sendLog('./log_fmlist?type=tropo'); $('.log-fmlist .mini-popup-content').removeClass('show'); }); - } else { - sendLog('./log_fmlist'); - } + } else sendLog('./log_fmlist'); function sendLog(endpoint) { $.ajax({ @@ -261,13 +240,13 @@ $(document).ready(function () { switch (xhr.status) { case 429: - errorMessage = xhr.responseText; - break; + errorMessage = xhr.responseText; + break; case 500: - errorMessage = 'Server error: ' + (xhr.responseText || 'Internal Server Error'); - break; + errorMessage = 'Server error: ' + (xhr.responseText || 'Internal Server Error'); + break; default: - errorMessage = xhr.statusText || 'An error occurred'; + errorMessage = xhr.statusText || 'An error occurred'; } sendToast('error', 'Log failed', errorMessage, false, true); @@ -368,9 +347,7 @@ function sendPingRequest() { if (connectionLost) sendToast('warning', 'Connection lost', 'Attempting to reconnect...', false, false); console.log("Reconnecting due to no data received..."); } - } else { - messageCounter = 0; - } + } else messageCounter = 0; // Automatic reconnection on WebSocket close with cooldown const now = Date.now(); @@ -414,9 +391,12 @@ function handleWebSocketMessage(event) { console.log('Kick initiated.') setTimeout(() => { window.location.href = '/403'; - }, 350); + }, 100); return; - } else if (event.data.startsWith("!")) sendToast('info', 'Info from server', event.data.slice(1), false, false) + } else if (event.data.startsWith("!")) { + sendToast('info', 'Info from server', event.data.slice(1), false, false) + return; + } parsedData = JSON.parse(event.data); @@ -427,6 +407,7 @@ function handleWebSocketMessage(event) { const averageSignal = sum / signalData.length; data.push(averageSignal); } + // Attach the message handler socket.onmessage = handleWebSocketMessage; @@ -627,7 +608,7 @@ socket.onmessage = (event) => { console.log('Kick initiated.'); setTimeout(() => { window.location.href = '/403'; - }, 500); + }, 100); return; } @@ -642,6 +623,7 @@ socket.onmessage = (event) => { }; function compareNumbers(a, b) { + // Really? return a - b; } @@ -660,11 +642,8 @@ function processString(string, errors) { for (let i = 0; i < string.length; i++) { alpha = parseInt(errors[i]) * (alpha_range / (max_error + 1)); - if (alpha) { - output += "" + escapeHTML(string[i]) + ""; - } else { - output += escapeHTML(string[i]); - } + if (alpha) output += "" + escapeHTML(string[i]) + ""; + else output += escapeHTML(string[i]); } return output; @@ -734,23 +713,23 @@ function checkKey(e) { let socketMessage = "Z" + $nextOption.data("value"); socket.send(socketMessage); - break; + break; case 112: // F1 e.preventDefault(); tuneTo(Number(localStorage.getItem('preset1'))); - break; + break; case 113: // F2 e.preventDefault(); tuneTo(Number(localStorage.getItem('preset2'))); - break; + break; case 114: // F3 e.preventDefault(); tuneTo(Number(localStorage.getItem('preset3'))); - break; + break; case 115: // F4 e.preventDefault(); tuneTo(Number(localStorage.getItem('preset4'))); - break; + break; default: // Handle default case if needed break; @@ -840,7 +819,6 @@ function findOnMaps() { window.open(url, "_blank"); } - function updateSignalUnits(parsedData, averageSignal) { const signalUnit = localStorage.getItem('signalUnit'); let currentSignal; @@ -852,21 +830,19 @@ function updateSignalUnits(parsedData, averageSignal) { switch (signalUnit) { case 'dbuv': - signalValue = currentSignal - 11.25; - highestSignal = highestSignal - 11.25; - signalText.text('dBµV'); + signalValue = currentSignal - 11.25; + highestSignal = highestSignal - 11.25; + signalText.text('dBµV'); break; - case 'dbm': - signalValue = currentSignal - 120; - highestSignal = highestSignal - 120; - signalText.text('dBm'); - break; - + signalValue = currentSignal - 120; + highestSignal = highestSignal - 120; + signalText.text('dBm'); + break; default: - signalValue = currentSignal; - signalText.text('dBf'); - break; + signalValue = currentSignal; + signalText.text('dBf'); + break; } const formatted = (Math.round(signalValue * 10) / 10).toFixed(1); @@ -942,21 +918,15 @@ function buildAltTxList(txList) { } function updateTextIfChanged($element, newText) { - if ($element.text() !== newText) { - $element.text(newText); - } + if ($element.text() !== newText) $element.text(newText); } function updateHtmlIfChanged($element, newHtml) { - if ($element.html() !== newHtml) { - $element.html(newHtml); - } + if ($element.html() !== newHtml) $element.html(newHtml); } function updateDatasetValIfChanged($element, dataLabel, newVal) { - if ($element.attr(dataLabel) !== newVal) { - $element.attr(dataLabel, newVal); - } + if ($element.attr(dataLabel) !== newVal) $element.attr(dataLabel, newVal); } // Main function to update data elements, optimized @@ -970,18 +940,12 @@ const updateDataElements = throttle(function(parsedData) { } updateHtmlIfChanged($dataPs, parsedData.ps === '?' ? "?" : processString(parsedData.ps, parsedData.ps_errors)); - if(parsedData.st) { - $dataSt.parent().removeClass('opacity-half'); - } else { - $dataSt.parent().addClass('opacity-half'); - } + if(parsedData.st) $dataSt.parent().removeClass('opacity-half'); + else $dataSt.parent().addClass('opacity-half'); if(parsedData.stForced) { - if (!parsedData.st) { - stereoColor = 'gray'; - } else { - stereoColor = 'var(--color-4)'; - } + if (!parsedData.st) stereoColor = 'gray'; + else stereoColor = 'var(--color-4)'; $('.data-st.circle1').css('left', '4px'); $('.data-st.circle2').css('display', 'none'); } else { @@ -994,11 +958,8 @@ const updateDataElements = throttle(function(parsedData) { updateTextIfChanged($dataPty, rdsMode == 'true' ? usa_programmes[parsedData.pty] : europe_programmes[parsedData.pty]); - if (parsedData.rds === true) { - $flagDesktopCointainer.css('background-color', 'var(--color-2-transparent)'); - } else { - $flagDesktopCointainer.css('background-color', 'var(--color-1-transparent)'); - } + if (parsedData.rds === true) $flagDesktopCointainer.css('background-color', 'var(--color-2-transparent)'); + else $flagDesktopCointainer.css('background-color', 'var(--color-1-transparent)'); $('.data-flag').html(``); $('.data-flag-big').html(``); @@ -1056,9 +1017,7 @@ function updatePanels(parsedData) { updateCounter = (updateCounter % 10000) + 1; // Count to 10000 then reset back to 1 signalData.push(parsedData.sig); - if (signalData.length > 8) { - signalData.shift(); // Remove the oldest element - } + if (signalData.length > 8) signalData.shift(); // Remove the oldest element const sum = signalData.reduce((acc, strNum) => acc + parseFloat(strNum), 0); const averageSignal = sum / signalData.length; @@ -1107,9 +1066,7 @@ function createListItem(element) { function updateButtonState(buttonId, value) { var button = $("#" + buttonId); - if (button.length === 0) { - button = $("." + buttonId); - } + if (button.length === 0) button = $("." + buttonId); if (button.length > 0) { if (value == 0) { @@ -1119,9 +1076,7 @@ function updateButtonState(buttonId, value) { button.hasClass("btn-disabled") ? button.removeClass("btn-disabled") : null; button.attr('aria-description', 'On'); } - } else { - console.log("Button not found!"); - } + } else console.log("Button not found!"); } @@ -1182,9 +1137,7 @@ function initTooltips(target = null) { tooltips.off('mouseenter mouseleave'); tooltips.hover(function () { - if ($(this).closest('.popup-content').length) { - return; - } + if ($(this).closest('.popup-content').length) return; var tooltipText = $(this).data('tooltip'); var placement = $(this).data('tooltip-placement') || 'top'; // Default to 'top' @@ -1212,22 +1165,22 @@ function initTooltips(target = null) { var posX, posY; switch (placement) { case 'bottom': - posX = targetOffset.left + targetWidth / 2 - tooltipWidth / 2; - posY = targetOffset.top + targetHeight + 10; - break; + posX = targetOffset.left + targetWidth / 2 - tooltipWidth / 2; + posY = targetOffset.top + targetHeight + 10; + break; case 'left': - posX = targetOffset.left - tooltipWidth - 10; - posY = targetOffset.top + targetHeight / 2 - tooltipHeight / 2; - break; + posX = targetOffset.left - tooltipWidth - 10; + posY = targetOffset.top + targetHeight / 2 - tooltipHeight / 2; + break; case 'right': - posX = targetOffset.left + targetWidth + 10; - posY = targetOffset.top + targetHeight / 2 - tooltipHeight / 2; - break; + posX = targetOffset.left + targetWidth + 10; + posY = targetOffset.top + targetHeight / 2 - tooltipHeight / 2; + break; case 'top': default: - posX = targetOffset.left + targetWidth / 2 - tooltipWidth / 2; - posY = targetOffset.top - tooltipHeight - 10; - break; + posX = targetOffset.left + targetWidth / 2 - tooltipWidth / 2; + posY = targetOffset.top - tooltipHeight - 10; + break; } // Apply positioning @@ -1269,12 +1222,8 @@ function initTooltips(target = null) { $(`#preset${i}`).click(function() { tuneTo(Number(presetText)); }); - } else { - $(`#preset${i}`).hide(); - } + } else $(`#preset${i}`).hide(); } - if (!hasAnyPreset) { - $('#preset1').parent().hide(); - } + if (!hasAnyPreset) $('#preset1').parent().hide(); } diff --git a/web/js/settings.js b/web/js/settings.js index ea7e64f..a7e1d3d 100644 --- a/web/js/settings.js +++ b/web/js/settings.js @@ -42,9 +42,7 @@ $(document).ready(() => { }, 1750); }, error: function (xhr, status, error) { - if (xhr.status === 403) { - sendToast('error', 'Login failed!', xhr.responseJSON.message, false, true); - } + if (xhr.status === 403) sendToast('error', 'Login failed!', xhr.responseJSON.message, false, true); } }); }); @@ -59,7 +57,7 @@ $(document).ready(() => { sendToast('success', 'Logout success!', data.message, false, true); setTimeout(function () { location.reload(true); - }, 1000); + }, 500); }, error: function (xhr, status, error) { if (xhr.status === 403) { @@ -102,7 +100,6 @@ function setTheme(themeName) { // Extracting the RGBA components from themeColors[2] for --color-text-2 const rgbaComponentsText = themeColors[2].match(/(\d+(\.\d+)?)/g); const opacityText = parseFloat(rgbaComponentsText[3]); - const newOpacityText = opacityText * 0.75; const textColor2 = `rgba(${rgbaComponentsText[0]}, ${rgbaComponentsText[1]}, ${rgbaComponentsText[2]})`; // Extracting the RGBA components from themeColors[0] for background color @@ -123,9 +120,7 @@ function setBg() { const disableBackgroundParameter = getQueryParameter('disableBackground'); if(localStorage.getItem('bgImage').length > 5 && localStorage.getItem('theme') != 'theme9' && disableBackgroundParameter != 'true') { $('body').css('background', 'url(' + localStorage.getItem('bgImage') + ') top center / cover fixed no-repeat var(--color-main)'); - } else { - $('body').css('background', 'var(--color-main)'); - } + } else $('body').css('background', 'var(--color-main)'); } function getInitialSettings() { @@ -135,14 +130,10 @@ function getInitialSettings() { success: function (data) { ['qthLatitude', 'qthLongitude', 'defaultTheme', 'bgImage', 'rdsMode', 'rdsTimeout'].forEach(key => { - if (data[key] !== undefined) { - localStorage.setItem(key, data[key]); - } + if (data[key] !== undefined) localStorage.setItem(key, data[key]); }); - data.presets.forEach((preset, index) => { - localStorage.setItem(`preset${index + 1}`, preset); - }); + data.presets.forEach((preset, index) => localStorage.setItem(`preset${index + 1}`, preset)); loadInitialSettings(); }, diff --git a/web/js/setup.js b/web/js/setup.js index 74601f3..cb96cf4 100644 --- a/web/js/setup.js +++ b/web/js/setup.js @@ -15,11 +15,6 @@ $(document).ready(function() { setInterval(checkTunnelServers, 10000); }); -/** - * Function to create & handle maps. - * Also contains map handling such as reloading / pin click registering. - */ - function mapCreate() { if (!(typeof map == "object")) { map = L.map('map', { diff --git a/web/js/ver.js b/web/js/ver.js index cadaa3b..c1eb96c 100644 --- a/web/js/ver.js +++ b/web/js/ver.js @@ -1,2 +1,2 @@ -const versionDate = new Date('Apr 3, 2026 9:30:00'); +const versionDate = new Date('Apr 3, 2026 22:30:00'); const currentVersion = `v1.4.0a [${versionDate.getDate()}/${versionDate.getMonth() + 1}/${versionDate.getFullYear()}]`; \ No newline at end of file diff --git a/web/js/wizard.js b/web/js/wizard.js index b32180d..28ec6fd 100644 --- a/web/js/wizard.js +++ b/web/js/wizard.js @@ -16,7 +16,7 @@ function updateWizardContent() { $('.btn-prev').toggle(visibleStepIndex !== 0); $('.btn-next').text(visibleStepIndex === 4 ? 'Save' : 'Next'); - visibleStepIndex === 3 && mapReload(); // What is this? Javascript? Toy? + visibleStepIndex === 3 && mapReload(); // What is this? Javascript? } function navigateStep(isNext) {