diff --git a/package.json b/package.json index 03732ae..cf25cea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fm-dx-webserver", - "version": "1.2.6", + "version": "1.2.7", "description": "FM DX Webserver", "main": "index.js", "scripts": { diff --git a/server/datahandler.js b/server/datahandler.js index 11c6a69..b06cec3 100644 --- a/server/datahandler.js +++ b/server/datahandler.js @@ -292,6 +292,10 @@ function handleData(wss, receivedData, rdsWss) { initialData.freq = (parsedValue / 1000).toFixed(3); dataToSend.freq = (parsedValue / 1000).toFixed(3); dataToSend.pi = '?'; + + rdsWss.clients.forEach((client) => { + client.send("G:\r\nRESET-------\r\n\r\n"); + }); } break; case receivedLine.startsWith('Z'): // Antenna @@ -352,31 +356,31 @@ function handleData(wss, receivedData, rdsWss) { modifiedData += errorsNew.toString(16).padStart(2, '0'); } - rdsWss.clients.forEach((client) => { - let dataString = modifiedData.toString(); - let lastTwoChars = dataString.slice(-2); - let lastByteValue = parseInt(lastTwoChars, 16); + rdsWss.clients.forEach((client) => { + let dataString = modifiedData.toString(); + let lastTwoChars = dataString.slice(-2); + let lastByteValue = parseInt(lastTwoChars, 16); - let truncatedString = dataString.slice(0, -2); + let truncatedString = dataString.slice(0, -2); - if ((lastByteValue & 0x03) !== 0) { - truncatedString = truncatedString.slice(0, 4) + '----' + truncatedString.slice(8); - } + if ((lastByteValue & 0x03) !== 0) { + truncatedString = truncatedString.slice(0, 4) + '----' + truncatedString.slice(8); + } - if ((lastByteValue & 0x30) !== 0) { - truncatedString = truncatedString.slice(0, 8) + '----' + truncatedString.slice(12); - } + if ((lastByteValue & 0x30) !== 0) { + truncatedString = truncatedString.slice(0, 8) + '----' + truncatedString.slice(12); + } - if ((lastByteValue & 0x0C) !== 0) { - truncatedString = truncatedString.slice(0, 12) + '----'; - } + if ((lastByteValue & 0x0C) !== 0) { + truncatedString = truncatedString.slice(0, 12) + '----'; + } - let newDataString = "G:\r\n" + truncatedString + "\r\n\r\n"; + let newDataString = "G:\r\n" + truncatedString + "\r\n\r\n"; - let finalBuffer = Buffer.from(newDataString, 'utf-8'); + let finalBuffer = Buffer.from(newDataString, 'utf-8'); - client.send(finalBuffer); - }); + client.send(finalBuffer); + }); rdsparser.parse_string(rds, modifiedData); legacyRdsPiBuffer = null; diff --git a/server/tx_search.js b/server/tx_search.js index ed8651e..3a20dcc 100644 --- a/server/tx_search.js +++ b/server/tx_search.js @@ -30,7 +30,7 @@ function fetchTx(freq, piCode, rdsPs) { return processData(cachedData[freq], piCode, rdsPs); } - const url = "https://maps.fmdx.pl/api?freq=" + freq; + const url = "https://maps.fmdx.org/api?freq=" + freq; return fetch(url) .then(response => response.json()) diff --git a/web/css/buttons.css b/web/css/buttons.css index 92ffda6..cf9abfe 100644 --- a/web/css/buttons.css +++ b/web/css/buttons.css @@ -79,6 +79,7 @@ input[type="text"], textarea, input[type="password"] { color: var(--color-text); background-color: var(--color-1); font-family: 'Titillium Web', sans-serif; + caret-color: var(--color-4); } #tune-buttons input[type="text"] { @@ -92,6 +93,7 @@ input[type="text"], textarea, input[type="password"] { color: var(--color-text); background-color: var(--color-1-transparent); font-family: 'Titillium Web', sans-serif; + caret-color: var(--color-4); } #tune-buttons input[type="text"]:not(.no-bg):not(.no-filter) { diff --git a/web/favicon.png b/web/favicon.png index 966184a..5d3c093 100644 Binary files a/web/favicon.png and b/web/favicon.png differ diff --git a/web/index.ejs b/web/index.ejs index d8af171..142d7b9 100644 --- a/web/index.ejs +++ b/web/index.ejs @@ -12,7 +12,7 @@ - + diff --git a/web/js/chat.js b/web/js/chat.js index 50405cf..9236500 100644 --- a/web/js/chat.js +++ b/web/js/chat.js @@ -1,90 +1,100 @@ $(document).ready(function() { - const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; - const chatSocket = new WebSocket(`${protocol}//${window.location.host}${window.location.pathname}chat`); - let chatMessageCount = 0; - const chatMessages = $('#chat-chatbox'); - const chatMessagesCount = $('.chat-messages-count'); - const chatButton = $('.chatbutton'); - const chatSendInput = $('#chat-send-message'); - const chatIdentityNickname = $('#chat-identity-nickname'); - const chatNicknameInput = $('#chat-nickname'); - const chatNicknameSave = $('#chat-nickname-save'); + const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; + const chatSocket = new WebSocket(`${protocol}//${window.location.host}${window.location.pathname}chat`); + let chatMessageCount = 0; + const chatMessages = $('#chat-chatbox'); + const chatMessagesCount = $('.chat-messages-count'); + const chatButton = $('.chatbutton'); + const chatSendInput = $('#chat-send-message'); + const chatIdentityNickname = $('#chat-identity-nickname'); + const chatNicknameInput = $('#chat-nickname'); + const chatNicknameSave = $('#chat-nickname-save'); - chatSocket.onmessage = function(event) { - const messageData = JSON.parse(event.data); - const isAdmin = messageData.admin ? '[ADMIN]' : ''; - - if (messageData.type === 'clientIp') { - chatIdentityNickname.html(isAdmin + " " + (savedNickname?.length > 0 ? savedNickname : 'Anonymous User')); - chatIdentityNickname.attr('title', messageData.ip); - } else { - const chatMessage = ` - [${messageData.time}] - ${isAdmin} ${messageData.nickname}: - ${$('
').text(messageData.message).html()}
- `; - chatMessages.append(chatMessage); - - if (chatMessages.is(':visible')) { - setTimeout(function() { - chatMessages.scrollTop(chatMessages[0].scrollHeight); - }, 100); - } else { - if (!messageData.history) { - chatMessageCount++; - chatMessagesCount.text(chatMessageCount); - chatMessagesCount.attr("aria-label", "Chat (" + chatMessageCount + " unread)"); - chatButton.removeClass('bg-color-2').addClass('bg-color-4'); - } - } - } - }; - - $('.chat-send-message-btn').click(sendMessage); - chatNicknameSave.click(function() { - const currentNickname = chatNicknameInput.val(); - localStorage.setItem('nickname', currentNickname); - chatIdentityNickname.text(currentNickname.length > 0 ? currentNickname : 'Anonymous User'); - chatNicknameInput.blur(); - }); - - chatButton.click(function() { - chatMessageCount = 0; - chatMessagesCount.text(chatMessageCount); - chatButton.removeClass('bg-color-4').addClass('bg-color-2'); - chatSendInput.focus(); - - setTimeout(function() { - chatMessages.scrollTop(chatMessages[0].scrollHeight); - }, 100); - }); - - chatNicknameInput.keypress(function(event) { - if (event.which === 13) { - chatNicknameSave.trigger('click'); - } - }); - - chatSendInput.keypress(function(event) { - if (event.which === 13) { - sendMessage(); - } - }); - - // Load nickname from localStorage on page load - const savedNickname = localStorage.getItem('nickname'); - if (savedNickname) { - chatNicknameInput.val(savedNickname); - } - - function sendMessage() { - const nickname = savedNickname || 'Anonymous user'; - const message = chatSendInput.val().trim(); - - if (message) { - const messageData = { nickname, message }; - chatSocket.send(JSON.stringify(messageData)); - chatSendInput.val(''); + // Function to generate a random string + function generateRandomString(length) { + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + let result = ''; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return result; } - } -}); \ No newline at end of file + + // Load nickname from localStorage on page load + let savedNickname = localStorage.getItem('nickname') || `Anonymous User ${generateRandomString(5)}`; + chatNicknameInput.val(savedNickname); + chatIdentityNickname.text(savedNickname); + + chatSocket.onmessage = function(event) { + const messageData = JSON.parse(event.data); + const isAdmin = messageData.admin ? '[ADMIN]' : ''; + + if (messageData.type === 'clientIp') { + chatIdentityNickname.html(isAdmin + " " + savedNickname); + chatIdentityNickname.attr('title', messageData.ip); + } else { + const chatMessage = ` + [${messageData.time}] + ${isAdmin} ${messageData.nickname}: + ${$('
').text(messageData.message).html()}
+ `; + chatMessages.append(chatMessage); + + if (chatMessages.is(':visible')) { + setTimeout(function() { + chatMessages.scrollTop(chatMessages[0].scrollHeight); + }, 100); + } else { + if (!messageData.history) { + chatMessageCount++; + chatMessagesCount.text(chatMessageCount); + chatMessagesCount.attr("aria-label", "Chat (" + chatMessageCount + " unread)"); + chatButton.removeClass('bg-color-2').addClass('bg-color-4'); + } + } + } + }; + + $('.chat-send-message-btn').click(sendMessage); + chatNicknameSave.click(function() { + const currentNickname = chatNicknameInput.val().trim() || `Anonymous User ${generateRandomString(5)}`; + localStorage.setItem('nickname', currentNickname); + savedNickname = currentNickname; // Update the savedNickname variable + chatIdentityNickname.text(savedNickname); + chatNicknameInput.blur(); + }); + + chatButton.click(function() { + chatMessageCount = 0; + chatMessagesCount.text(chatMessageCount); + chatButton.removeClass('bg-color-4').addClass('bg-color-2'); + chatSendInput.focus(); + + setTimeout(function() { + chatMessages.scrollTop(chatMessages[0].scrollHeight); + }, 100); + }); + + chatNicknameInput.keypress(function(event) { + if (event.which === 13) { + chatNicknameSave.trigger('click'); + } + }); + + chatSendInput.keypress(function(event) { + if (event.which === 13) { + sendMessage(); + } + }); + + function sendMessage() { + const nickname = savedNickname || `Anonymous User ${generateRandomString(5)}`; + const message = chatSendInput.val().trim(); + + if (message) { + const messageData = { nickname, message }; + chatSocket.send(JSON.stringify(messageData)); + chatSendInput.val(''); + } + } +}); diff --git a/web/js/init.js b/web/js/init.js index 89c2615..acf9648 100644 --- a/web/js/init.js +++ b/web/js/init.js @@ -1,11 +1,12 @@ -var currentDate = new Date('Aug 1, 2024 20:00:00'); +var currentDate = new Date('Aug 28, 2024 22:00:00'); var day = currentDate.getDate(); var month = currentDate.getMonth() + 1; // Months are zero-indexed, so add 1 var year = currentDate.getFullYear(); var formattedDate = day + '/' + month + '/' + year; -var currentVersion = 'v1.2.6a [' + formattedDate + ']'; +var currentVersion = 'v1.2.7 [' + formattedDate + ']'; getInitialSettings(); +removeUrlParameters(); // Call this function to remove URL parameters function getInitialSettings() { $.ajax({ @@ -26,4 +27,12 @@ function getInitialSettings() { console.error('Error:', error); } }); -} \ No newline at end of file +} + +function removeUrlParameters() { + // Get the current URL without the query parameters + var urlWithoutParams = window.location.protocol + "//" + window.location.host + window.location.pathname; + + // Replace the current URL with the new one, without reloading the page + window.history.replaceState({ path: urlWithoutParams }, '', urlWithoutParams); +} diff --git a/web/js/main.js b/web/js/main.js index 88fd336..2ef47e6 100644 --- a/web/js/main.js +++ b/web/js/main.js @@ -605,7 +605,7 @@ function findOnMaps() { var latitude = localStorage.getItem('qthLongitude'); var longitude = localStorage.getItem('qthLatitude'); - var url = `https://maps.fmdx.pl/#qth=${longitude},${latitude}&freq=${frequency}&findPi=${pi}`; + var url = `https://maps.fmdx.org/#qth=${longitude},${latitude}&freq=${frequency}&findPi=${pi}`; window.open(url, "_blank"); } diff --git a/web/js/settings.js b/web/js/settings.js index ff72451..d156332 100644 --- a/web/js/settings.js +++ b/web/js/settings.js @@ -56,11 +56,10 @@ $(document).ready(() => { const signalSelector = $('#signal-selector'); const signalParameter = getQueryParameter('signalUnits'); - if(signalParameter) { - signalSelector.find('input').val($(signalParameter).text()); - } - - if (localStorage.getItem('signalUnit')) { + if(signalParameter && !localStorage.getItem('signalUnit')) { + signalSelector.find('input').val(signalSelector.find('.option[data-value="' + signalParameter + '"]').text()); + localStorage.setItem('signalUnit', signalParameter); + } else { signalSelector.find('input').val(signalSelector.find('.option[data-value="' + savedUnit + '"]').text()); }