diff --git a/.gitignore b/.gitignore index 9f78711..1b3b2af 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ /*.json -/ffmpeg.exe \ No newline at end of file +/ffmpeg.exe +/serverlog.txt \ No newline at end of file diff --git a/package.json b/package.json index 662a11e..18065e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fm-dx-webserver", - "version": "1.1.8", + "version": "1.1.9", "description": "FM DX Webserver", "main": "index.js", "scripts": { diff --git a/server/console.js b/server/console.js index e25bc5b..578ba21 100644 --- a/server/console.js +++ b/server/console.js @@ -1,6 +1,11 @@ +const fs = require('fs'); + const verboseMode = process.argv.includes('--debug'); const verboseModeFfmpeg = process.argv.includes('--ffmpegdebug'); +const ANSI_ESCAPE_CODE_PATTERN = /\x1b\[[0-9;]*m/g; +const MAX_LOG_LINES = 100000; + const getCurrentTime = () => { const currentTime = new Date(); const hours = currentTime.getHours().toString().padStart(2, '0'); @@ -8,7 +13,12 @@ const getCurrentTime = () => { return `\x1b[90m[${hours}:${minutes}]\x1b[0m`; }; +const removeANSIEscapeCodes = (str) => { + return str.replace(ANSI_ESCAPE_CODE_PATTERN, ''); +}; + const MESSAGE_PREFIX = { + CHAT: "\x1b[36m[CHAT]\x1b[0m", DEBUG: "\x1b[36m[DEBUG]\x1b[0m", ERROR: "\x1b[31m[ERROR]\x1b[0m", FFMPEG: "\x1b[36m[FFMPEG]\x1b[0m", @@ -21,14 +31,20 @@ const logs = []; const maxLogLines = 250; const logDebug = (...messages) => { + const logMessage = `${getCurrentTime()} ${MESSAGE_PREFIX.DEBUG} ${messages.join(' ')}`; if (verboseMode) { - const logMessage = `${getCurrentTime()} ${MESSAGE_PREFIX.DEBUG} ${messages.join(' ')}`; logs.push(logMessage); if (logs.length > maxLogLines) { logs.shift(); } console.log(logMessage); } + appendLogToFile(logMessage); +}; + +const logChat = (...messages) => { + const logMessage = `${getCurrentTime()} ${MESSAGE_PREFIX.CHAT} ${messages[0].nickname} (${messages[0].ip}) sent a chat message: ${messages[0].message}`; + appendLogToFile(logMessage); }; const logError = (...messages) => { @@ -38,6 +54,7 @@ const logError = (...messages) => { logs.shift(); } console.log(logMessage); + appendLogToFile(logMessage); }; const logFfmpeg = (...messages) => { @@ -48,6 +65,7 @@ const logFfmpeg = (...messages) => { logs.shift(); } console.log(logMessage); + appendLogToFile(logMessage); } }; @@ -58,6 +76,7 @@ const logInfo = (...messages) => { logs.shift(); } console.log(logMessage); + appendLogToFile(logMessage); }; const logWarn = (...messages) => { @@ -67,8 +86,36 @@ const logWarn = (...messages) => { logs.shift(); } console.log(logMessage); + appendLogToFile(logMessage); }; +function appendLogToFile(logMessage) { + const cleanLogMessage = removeANSIEscapeCodes(logMessage); + + fs.appendFile('serverlog.txt', cleanLogMessage + '\n', (err) => { + if (err) { + console.error('Error writing to server log:', err); + } else { + fs.readFile('serverlog.txt', 'utf8', (err, data) => { + if (err) { + console.error('Error reading server log:', err); + } else { + const lineCount = data.split('\n').length; + if (lineCount > MAX_LOG_LINES) { + const excessLines = lineCount - MAX_LOG_LINES; + const truncatedContent = data.split('\n').slice(excessLines).join('\n'); + fs.writeFile('serverlog.txt', truncatedContent, (err) => { + if (err) { + console.error('Error truncating server log:', err); + } + }); + } + } + }); + } + }); +} + module.exports = { - logError, logDebug, logFfmpeg, logInfo, logWarn, logs + logError, logDebug, logFfmpeg, logInfo, logWarn, logs, logChat }; diff --git a/server/datahandler.js b/server/datahandler.js index 79656d0..b3c1d36 100644 --- a/server/datahandler.js +++ b/server/datahandler.js @@ -272,6 +272,8 @@ function handleData(ws, receivedData) { modifiedData = receivedLine.substring(1).split(",")[0]; if((modifiedData / 1000).toFixed(3) == dataToSend.freq) { + resetToDefault(dataToSend); + rdsparser.clear(rds); return; // Prevent tune spamming using scrollwheel } @@ -386,13 +388,18 @@ function processSignal(receivedData, st, stForced) { initialData.st_forced = stForced; if (!isNaN(parsedValue)) { - dataToSend.signal = parsedValue.toFixed(2); - initialData.signal = parsedValue.toFixed(2); + // Convert parsedValue to a number + var signal = parseFloat(parsedValue.toFixed(2)); + dataToSend.signal = signal; + initialData.signal = signal; - if(dataToSend.signal > dataToSend.highestSignal) { - dataToSend.highestSignal = dataToSend.signal; + // Convert highestSignal to a number for comparison + var highestSignal = parseFloat(dataToSend.highestSignal); + if (signal > highestSignal) { + dataToSend.highestSignal = signal.toString(); // Convert back to string for consistency } - } +} + } module.exports = { diff --git a/server/endpoints.js b/server/endpoints.js index 0cb24e0..15ccae5 100644 --- a/server/endpoints.js +++ b/server/endpoints.js @@ -61,6 +61,10 @@ router.get('/', (req, res) => { } }); +router.get('/403', (req, res) => { + res.render('403'); +}) + router.get('/wizard', (req, res) => { let serialPorts; diff --git a/server/index.js b/server/index.js index 6b38518..f9c11a5 100644 --- a/server/index.js +++ b/server/index.js @@ -21,9 +21,9 @@ const { SerialPort } = require('serialport') const helpers = require('./helpers'); const dataHandler = require('./datahandler'); const fmdxList = require('./fmdx_list'); -const { logDebug, logError, logInfo, logWarn } = require('./console'); +const { logDebug, logError, logInfo, logWarn, logChat } = require('./console'); const storage = require('./storage'); -const { configName, serverConfig, configUpdate, configSave } = require('./server_config'); +const { serverConfig } = require('./server_config'); const pjson = require('../package.json'); console.log(`\x1b[32m @@ -70,19 +70,10 @@ function connectToSerial() { serialport.on('open', () => { logInfo('Using COM device: ' + serverConfig.xdrd.comPort); serialport.write('x\n'); - serialport.write('W0\n'); - serialport.write('M0\n'); - serverConfig.audio.startupVolume ? serialport.write('Y' + (serverConfig.audio.startupVolume * 100).toFixed(0) + '\n') : serialport.write('Y100\n'); - serialport.write('D0\n'); - serialport.write('A0\n'); - serialport.write('F-1\n'); - serialport.write('Z0\n'); - serialport.write('G11\n'); - serialport.write('V0\n'); serialport.write('Q0\n'); - serialport.write('C0\n'); - serialport.write('I0,0\n'); - + serialport.write('M0\n'); + serialport.write('Z0\n'); + if(serverConfig.defaultFreq && serverConfig.enableDefaultFreq === true) { serialport.write('T' + Math.round(serverConfig.defaultFreq * 1000) +'\n'); dataHandler.initialData.freq = Number(serverConfig.defaultFreq).toFixed(3); @@ -90,6 +81,13 @@ function connectToSerial() { } else { serialport.write('T87500\n'); } + + serialport.write('A0\n'); + serialport.write('F-1\n'); + serialport.write('W0\n'); + serialport.write('D0\n'); + serialport.write('G11\n'); + serverConfig.audio.startupVolume ? serialport.write('Y' + (serverConfig.audio.startupVolume * 100).toFixed(0) + '\n') : serialport.write('Y100\n'); serialport.on('data', (data) => { helpers.resolveDataBuffer(data, wss); @@ -158,11 +156,11 @@ function connectToXdrd() { dataHandler.dataToSend.ant = modifiedLine; } - if (authFlags.authMsg && authFlags.firstClient) { + if (authFlags.authMsg === true && authFlags.firstClient === true) { client.write('x\n'); client.write(serverConfig.defaultFreq && serverConfig.enableDefaultFreq === true ? 'T' + Math.round(serverConfig.defaultFreq * 1000) + '\n' : 'T87500\n'); - dataHandler.initialData.freq = serverConfig.defaultFreq && serverConfig.enableDefaultFreq === true ? (serverConfig.defaultFreq).toFixed(3) : (87.5).toFixed(3); - dataHandler.dataToSend.freq = serverConfig.defaultFreq && serverConfig.enableDefaultFreq === true ? (serverConfig.defaultFreq).toFixed(3) : (87.5).toFixed(3); + dataHandler.initialData.freq = serverConfig.defaultFreq && serverConfig.enableDefaultFreq === true ? Number(serverConfig.defaultFreq).toFixed(3) : (87.5).toFixed(3); + dataHandler.dataToSend.freq = serverConfig.defaultFreq && serverConfig.enableDefaultFreq === true ? Number(serverConfig.defaultFreq).toFixed(3) : (87.5).toFixed(3); client.write('A0\n'); client.write(serverConfig.audio.startupVolume ? 'Y' + (serverConfig.audio.startupVolume * 100).toFixed(0) + '\n' : 'Y100\n'); client.off('data', authDataHandler); @@ -406,6 +404,7 @@ chatWss.on('connection', (ws, request) => { if (storage.chatHistory.length > 50) { storage.chatHistory.shift(); } + logChat(messageData); const modifiedMessage = JSON.stringify(messageData); diff --git a/web/403.ejs b/web/403.ejs index af2c259..8dcfaad 100644 --- a/web/403.ejs +++ b/web/403.ejs @@ -17,7 +17,9 @@

-

You are not authorized to use this tuner. Please try again later or contact the owner.

+

You are not authorized to use this tuner.
+ There's a possibility you were kicked or banned by the administrator.
+ Please try again later or contact the owner.

diff --git a/web/css/breadcrumbs.css b/web/css/breadcrumbs.css index 4033a19..999aa23 100644 --- a/web/css/breadcrumbs.css +++ b/web/css/breadcrumbs.css @@ -92,6 +92,11 @@ label { display: none; } +#data-station-container h2 { + display: block !important; + padding: 0; +} + #data-station-name { font-size: 20px; } @@ -309,11 +314,14 @@ pre { } .highest-signal-container { margin-top: -20px !important; - margin-bottom: 15px !important; + margin-bottom: -15px !important; + } + #pi-code-container { + margin-bottom: 0 !important; } #data-pi { font-size: 24px; - margin-top: 20px; + margin-top: 5px; color: var(--color-text-2); } h2.show-phone { @@ -324,16 +332,18 @@ pre { font-size: 42px; } #data-frequency { - font-size: 72px; + font-size: 64px; } #data-rt0, #data-rt1 { font-size: 10px; text-align: left; width: 100%; - word-break: break-all; + white-space: nowrap; + overflow-x:auto; + padding: 5px 0; } #rt-container { - height: 32px !important; + height: max-content !important; } ul { font-size: 16px; @@ -376,10 +386,12 @@ pre { #af-list ul { height: auto !important; } - #rt-container { order: 2; } + .modal-panel-footer { + width: auto !important; + } } @media only screen and (min-width: 769px) and (max-height: 860px) { @@ -412,6 +424,14 @@ pre { font-size: 18px; } + h2.signal-heading { + margin-bottom: 0; + } + + .highest-signal-container { + margin-bottom: -10px !important; + } + h2.mb-0 { margin-bottom: 0; margin-top: 2px !important; diff --git a/web/index.ejs b/web/index.ejs index cb2ad13..8d7a4e9 100644 --- a/web/index.ejs +++ b/web/index.ejs @@ -77,7 +77,7 @@
- + ST @@ -98,7 +98,7 @@
-

SIGNAL

+

SIGNAL

@@ -120,7 +120,7 @@
<% if (antennas.enabled == true) { %> -