fix: Remove non-functional Node Discovery feature

Removed Node Discovery feature that was experiencing persistent timeout
issues. Feature attempted to scan mesh network for nearby repeaters but
consistently failed due to bridge timing constraints.

Changes:
- Remove node_discover() function from cli.py
- Remove 'node_discover' from SPECIAL_COMMANDS in api.py
- Remove Discover Nodes button and modal from base.html
- Remove discoverNodes() and displayNodeDiscoveryResults() from app.js
- Remove Discover Nodes documentation from README.md

IMPORTANT: Advert message cleanup ("Advert sent") is preserved and
working correctly.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
MarekWo
2026-01-03 10:46:05 +01:00
parent df26b44df0
commit 66f16609e5
5 changed files with 16 additions and 292 deletions
-110
View File
@@ -303,17 +303,6 @@ function setupEventListeners() {
}
await executeSpecialCommand('floodadv');
});
// Node Discovery Modal: Load nodes when opened
const nodeDiscoveryModal = document.getElementById('nodeDiscoveryModal');
nodeDiscoveryModal.addEventListener('show.bs.modal', function() {
discoverNodes();
});
// Node Discovery: Refresh button
document.getElementById('refreshDiscoveryBtn').addEventListener('click', function() {
discoverNodes();
});
}
/**
@@ -1264,105 +1253,6 @@ async function copyChannelKey() {
}
/**
* Discover nearby mesh nodes (repeaters)
*/
async function discoverNodes() {
// Show loading state
document.getElementById('nodeDiscoveryStatus').style.display = 'block';
document.getElementById('nodeDiscoveryResults').style.display = 'none';
document.getElementById('nodeDiscoveryError').style.display = 'none';
document.getElementById('nodeDiscoveryEmpty').style.display = 'none';
// Disable refresh button during discovery
const refreshBtn = document.getElementById('refreshDiscoveryBtn');
refreshBtn.disabled = true;
try {
const response = await fetch('/api/device/command', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ command: 'node_discover' })
});
const data = await response.json();
if (data.success && data.nodes) {
displayNodeDiscoveryResults(data.nodes);
} else {
// Show error
document.getElementById('nodeDiscoveryStatus').style.display = 'none';
document.getElementById('nodeDiscoveryError').style.display = 'block';
document.getElementById('nodeDiscoveryErrorMessage').textContent = data.error || 'Failed to discover nodes';
}
} catch (error) {
console.error('Error discovering nodes:', error);
// Show error
document.getElementById('nodeDiscoveryStatus').style.display = 'none';
document.getElementById('nodeDiscoveryError').style.display = 'block';
document.getElementById('nodeDiscoveryErrorMessage').textContent = 'Network error: ' + error.message;
} finally {
refreshBtn.disabled = false;
}
}
/**
* Display node discovery results in table
*/
function displayNodeDiscoveryResults(nodes) {
const tableBody = document.getElementById('nodeDiscoveryTableBody');
// Hide loading state
document.getElementById('nodeDiscoveryStatus').style.display = 'none';
// Check if empty
if (nodes.length === 0) {
document.getElementById('nodeDiscoveryEmpty').style.display = 'block';
return;
}
// Show results table
document.getElementById('nodeDiscoveryResults').style.display = 'block';
// Clear previous results
tableBody.innerHTML = '';
// Sort nodes by SNR (descending - strongest signal first)
nodes.sort((a, b) => (b.SNR || 0) - (a.SNR || 0));
// Populate table
nodes.forEach(node => {
const row = document.createElement('tr');
// Determine signal quality class
let signalClass = '';
const snr = node.SNR || 0;
if (snr >= 10) {
signalClass = 'text-success fw-bold';
} else if (snr >= 5) {
signalClass = 'text-warning';
} else {
signalClass = 'text-danger';
}
row.innerHTML = `
<td>
<span class="font-monospace">${escapeHtml(node.pubkey?.substring(0, 12) || 'unknown')}</span>
${node.tag ? `<br><small class="text-muted">Tag: ${escapeHtml(node.tag)}</small>` : ''}
</td>
<td class="${signalClass}">${snr.toFixed(2)}</td>
<td>${node.RSSI !== undefined ? node.RSSI : 'N/A'}</td>
<td>${node.SNR_in !== undefined ? node.SNR_in.toFixed(2) : 'N/A'}</td>
<td>${node.path_len !== undefined ? node.path_len : 'N/A'}</td>
`;
tableBody.appendChild(row);
});
}
// =============================================================================
// Direct Messages (DM) Functions
// =============================================================================