mirror of
https://github.com/smittix/intercept.git
synced 2026-06-08 06:01:56 -07:00
Add pager message filtering (closes #40)
Add ability to filter out unwanted pager messages from display: - Hide "Tone Only" messages by default (toggle in UI) - Custom keyword filter (comma-separated list) - Filtered messages are still logged and counted, just hidden from view - Filter settings persist in localStorage 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
+91
-9
@@ -403,6 +403,23 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h3>Message Filters</h3>
|
||||
<div class="checkbox-group" style="margin-bottom: 10px;">
|
||||
<label>
|
||||
<input type="checkbox" id="filterToneOnly" checked onchange="savePagerFilters()">
|
||||
Hide "Tone Only" messages
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Hide messages containing (comma-separated)</label>
|
||||
<input type="text" id="filterKeywords" placeholder="e.g. test, spam, alert" onchange="savePagerFilters()">
|
||||
</div>
|
||||
<div class="info-text" style="font-size: 10px; color: #666; margin-top: 5px;">
|
||||
Messages matching these keywords will be hidden from display but still logged.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="run-btn" id="startBtn" onclick="startDecoding()">
|
||||
Start Decoding
|
||||
</button>
|
||||
@@ -1711,8 +1728,15 @@
|
||||
let pocsagCount = 0;
|
||||
let flexCount = 0;
|
||||
let sensorCount = 0;
|
||||
let filteredCount = 0; // Count of filtered messages
|
||||
let deviceList = {{ devices | tojson | safe }};
|
||||
|
||||
// Pager message filter settings
|
||||
let pagerFilters = {
|
||||
hideToneOnly: true,
|
||||
keywords: []
|
||||
};
|
||||
|
||||
// Aircraft (ADS-B) state
|
||||
let adsbAircraft = {};
|
||||
let adsbMsgCount = 0;
|
||||
@@ -1732,6 +1756,50 @@
|
||||
setInterval(updateHeaderClock, 1000);
|
||||
updateHeaderClock(); // Initial call
|
||||
|
||||
// Pager message filter functions
|
||||
function loadPagerFilters() {
|
||||
const saved = localStorage.getItem('pagerFilters');
|
||||
if (saved) {
|
||||
try {
|
||||
pagerFilters = JSON.parse(saved);
|
||||
} catch (e) {
|
||||
console.warn('Failed to load pager filters:', e);
|
||||
}
|
||||
}
|
||||
// Update UI
|
||||
document.getElementById('filterToneOnly').checked = pagerFilters.hideToneOnly;
|
||||
document.getElementById('filterKeywords').value = pagerFilters.keywords.join(', ');
|
||||
}
|
||||
|
||||
function savePagerFilters() {
|
||||
pagerFilters.hideToneOnly = document.getElementById('filterToneOnly').checked;
|
||||
const keywordsInput = document.getElementById('filterKeywords').value;
|
||||
pagerFilters.keywords = keywordsInput
|
||||
.split(',')
|
||||
.map(k => k.trim().toLowerCase())
|
||||
.filter(k => k.length > 0);
|
||||
localStorage.setItem('pagerFilters', JSON.stringify(pagerFilters));
|
||||
}
|
||||
|
||||
function shouldFilterMessage(msg) {
|
||||
// Check for Tone Only filter
|
||||
if (pagerFilters.hideToneOnly) {
|
||||
if (msg.message === '[Tone Only]' || msg.msg_type === 'Tone') {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// Check keyword filters
|
||||
if (pagerFilters.keywords.length > 0) {
|
||||
const msgLower = (msg.message || '').toLowerCase();
|
||||
for (const keyword of pagerFilters.keywords) {
|
||||
if (msgLower.includes(keyword)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Sync header stats with output panel stats
|
||||
function syncHeaderStats() {
|
||||
// Pager stats
|
||||
@@ -2136,6 +2204,9 @@
|
||||
|
||||
// Auto-connect to gpsd if available
|
||||
autoConnectGps();
|
||||
|
||||
// Load pager message filters
|
||||
loadPagerFilters();
|
||||
});
|
||||
|
||||
// Toggle section collapse
|
||||
@@ -3092,18 +3163,13 @@
|
||||
placeholder.remove();
|
||||
}
|
||||
|
||||
// Store message for export
|
||||
// Store message for export (always, even if filtered)
|
||||
allMessages.push(msg);
|
||||
|
||||
// Play audio alert
|
||||
playAlert();
|
||||
|
||||
// Update signal meter
|
||||
pulseSignal();
|
||||
|
||||
// Add to waterfall
|
||||
addWaterfallPoint(Date.now(), 0.8);
|
||||
// Check if message should be filtered from display
|
||||
const isFiltered = shouldFilterMessage(msg);
|
||||
|
||||
// Update counts (always, even if filtered)
|
||||
msgCount++;
|
||||
document.getElementById('msgCount').textContent = msgCount;
|
||||
|
||||
@@ -3118,6 +3184,21 @@
|
||||
document.getElementById('flexCount').textContent = flexCount;
|
||||
}
|
||||
|
||||
// If filtered, skip display but update filtered count
|
||||
if (isFiltered) {
|
||||
filteredCount++;
|
||||
return;
|
||||
}
|
||||
|
||||
// Play audio alert (only for non-filtered messages)
|
||||
playAlert();
|
||||
|
||||
// Update signal meter
|
||||
pulseSignal();
|
||||
|
||||
// Add to waterfall
|
||||
addWaterfallPoint(Date.now(), 0.8);
|
||||
|
||||
const isNumeric = /^[0-9\s\-\*\#U]+$/.test(msg.message);
|
||||
const relativeTime = getRelativeTime(msg.timestamp);
|
||||
|
||||
@@ -3216,6 +3297,7 @@
|
||||
pocsagCount = 0;
|
||||
flexCount = 0;
|
||||
sensorCount = 0;
|
||||
filteredCount = 0;
|
||||
allMessages = [];
|
||||
uniqueDevices.clear();
|
||||
document.getElementById('msgCount').textContent = '0';
|
||||
|
||||
Reference in New Issue
Block a user