You've already forked fm-dx-webserver
mirror of
https://github.com/KubaPro010/fm-dx-webserver.git
synced 2026-02-26 22:13:53 +01:00
bugfix pack
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "fm-dx-webserver",
|
||||
"version": "1.2.6",
|
||||
"version": "1.2.7",
|
||||
"description": "FM DX Webserver",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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) {
|
||||
|
||||
BIN
web/favicon.png
BIN
web/favicon.png
Binary file not shown.
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 6.4 KiB |
@@ -12,7 +12,7 @@
|
||||
|
||||
<meta property="og:title" content="FM-DX WebServer [<%= tunerName %>]">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:image" content="favicon.png">
|
||||
<meta property="og:image" content="https://fmdx.org/img/webserver_icon.png">
|
||||
<meta property="og:description" content="Server description: <%= tunerDescMeta %>.">
|
||||
|
||||
<script src="js/init.js"></script>
|
||||
|
||||
184
web/js/chat.js
184
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 ? '<span style="color: #bada55">[ADMIN]</span>' : '';
|
||||
|
||||
if (messageData.type === 'clientIp') {
|
||||
chatIdentityNickname.html(isAdmin + " " + (savedNickname?.length > 0 ? savedNickname : 'Anonymous User'));
|
||||
chatIdentityNickname.attr('title', messageData.ip);
|
||||
} else {
|
||||
const chatMessage = `
|
||||
<span class="color-2">[${messageData.time}]</span>
|
||||
${isAdmin} <strong class="color-5" title="IP Address: ${messageData.ip}">${messageData.nickname}</strong>:
|
||||
<span style="color: var(--color-text-2);">${$('<div/>').text(messageData.message).html()}</span><br>
|
||||
`;
|
||||
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;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 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 ? '<span style="color: #bada55">[ADMIN]</span>' : '';
|
||||
|
||||
if (messageData.type === 'clientIp') {
|
||||
chatIdentityNickname.html(isAdmin + " " + savedNickname);
|
||||
chatIdentityNickname.attr('title', messageData.ip);
|
||||
} else {
|
||||
const chatMessage = `
|
||||
<span class="color-2">[${messageData.time}]</span>
|
||||
${isAdmin} <strong class="color-5" title="IP Address: ${messageData.ip}">${messageData.nickname}</strong>:
|
||||
<span style="color: var(--color-text-2);">${$('<div/>').text(messageData.message).html()}</span><br>
|
||||
`;
|
||||
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('');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user