From 4520447156defc8680625ecf6e3a4f564dc96adb Mon Sep 17 00:00:00 2001 From: Assistant <12+assistant@git@zakscode.com> Date: Wed, 16 Sep 2026 23:27:47 -0400 Subject: [PATCH] Fix military aircraft classification regex to reduce false positives (issue-1) --- server/src/adsb.mjs | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/server/src/adsb.mjs b/server/src/adsb.mjs index eb96b8f..c65a143 100644 --- a/server/src/adsb.mjs +++ b/server/src/adsb.mjs @@ -111,21 +111,21 @@ export async function initAircraftDb() { db = new Database(DB_PATH); db.exec(` CREATE TABLE IF NOT EXISTS aircraft ( - icao TEXT PRIMARY KEY, - built TEXT, - categoryDescription TEXT, - country TEXT, - engines TEXT, - class TEXT, - manufacturer TEXT, - model TEXT, - modes TEXT, - operator TEXT, - operatorCallsign TEXT, - owner TEXT, - registration TEXT, - serialNumber TEXT, - aircraft TEXT + icao TEXT PRIMARY KEY, + built TEXT, + categoryDescription TEXT, + country TEXT, + engines TEXT, + class TEXT, + manufacturer TEXT, + model TEXT, + modes TEXT, + operator TEXT, + operatorCallsign TEXT, + owner TEXT, + registration TEXT, + serialNumber TEXT, + aircraft TEXT ); CREATE TABLE IF NOT EXISTS military_ranges (start TEXT NOT NULL, end TEXT NOT NULL); @@ -220,7 +220,7 @@ async function syncMilitaryIcao() { try { const page = await fetch(ADSB_URL + ':8080').then(resp => resp.text()); const db = /databaseFolder = "(db-.+?)"/.exec(page); - const res = await fetch(ADSB_URL + `:8080/${db[1]}/ranges.js`); + const res = await fetch(ADSB_URL + `${db[1]}/ranges.js`); if (!res.ok) throw new Error(`HTTP ${res.status}`); const { military } = await res.json(); db.exec('DELETE FROM military_ranges'); @@ -243,7 +243,10 @@ export function classifyAircraft(row) { const matchesAny = (fields, list) => fields.some(f => { const value = normalizeName(f); - return value && list.some(k => value.includes(normalizeName(k))); + return value && list.some(k => { + const kw = normalizeName(k); + return kw && new RegExp('\\b' + kw.replace(/[.*+?^${}()|[\\]\\]/g, '\\$&') + '\\b', 'i').test(value); + }); }); const operators = [row.operator, row.operatorCallsign, row.owner]; @@ -503,4 +506,4 @@ setInterval(() => { const last = trail.at(-1); if (!last || last.ts < cutoff) history.delete(key); } -}, 1000 * 60 * 5); +}, 1000 * 60 * 5); \ No newline at end of file