// GridTracker Copyright © 2024 GridTracker.org // All rights reserved. // See LICENSE for more information. GT.lotwCallsigns = Object(); GT.lotwFile = ""; GT.lotwWhenDate = 0; GT.lotwLoadTimer = null; GT.eqslCallsigns = Object(); GT.eqslFile = ""; GT.eqslWhenDate = 0; GT.eqslLoadTimer = null; GT.ulsCallsignsCount = 0; GT.ulsWhenDate = 0; GT.ulsLoadTimer = null; GT.cacCallsigns = Object(); GT.cacFile = ""; GT.cacWhenDate = 0; GT.cacLoadTimer = null; GT.ausCallsigns = Object(); GT.ausFile = ""; GT.ausWhenDate = 0; GT.ausLoadTimer = null; GT.oqrsCallsigns = Object(); GT.oqrsFile = ""; GT.oqrsWhenDate = 0; GT.oqrsLoadTimer = null; function dumpFile(file) { try { if (fs.existsSync(file)) fs.unlinkSync(file); } catch (e) {} } function dumpDir(dir) { try { if (fs.existsSync(dir)) fs.rmdirSync(dir); } catch (e) {} } function callsignServicesInit() { // Dump old data files we no longer reference dumpFile(GT.jsonDir + "uls-callsigns.json"); dumpFile(GT.jsonDir + "us-callsigns.json"); dumpFile(GT.jsonDir + "lotw-callsigns.json"); dumpFile(GT.jsonDir + "lotw-ts-callsigns.json"); dumpFile(GT.jsonDir + "eqsl-callsigns.json"); dumpFile(GT.jsonDir + "cloqrs-callsigns.json"); dumpFile(GT.jsonDir + "internal_qso.json"); dumpFile(GT.jsonDir + "spots.json"); dumpDir(GT.jsonDir); GT.lotwFile = GT.NWappData + "lotw-ts-callsigns.json"; GT.eqslFile = GT.NWappData + "eqsl-callsigns.json"; GT.oqrsFile = GT.NWappData + "cloqrs-callsigns.json"; GT.cacFile = GT.NWappData + "canada-callsigns.txt"; GT.ausFile = GT.NWappData + "aus-callsigns.txt"; if (GT.callsignLookups.lotwUseEnable) { lotwLoadCallsigns(); } if (GT.callsignLookups.eqslUseEnable) { eqslLoadCallsigns(); } if (GT.callsignLookups.ulsUseEnable) { ulsLoadCallsigns(); } if (GT.callsignLookups.cacUseEnable) { cacLoadCallsigns(); } if (GT.callsignLookups.ausUseEnable) { ausLoadCallsigns(); } if (GT.callsignLookups.oqrsUseEnable) { oqrsLoadCallsigns(); } lotwSettingsDisplay(); eqslSettingsDisplay(); ulsSettingsDisplay(); cacSettingsDisplay(); ausSettingsDisplay(); oqrsSettingsDisplay(); } function saveCallsignSettings() { localStorage.callsignLookups = JSON.stringify(GT.callsignLookups); } function lotwLoadCallsigns() { var now = timeNowSec(); if (now - GT.callsignLookups.lotwLastUpdate > 86400 * 7) { GT.callsignLookups.lotwLastUpdate = 0; } else { var lotwWhenTimer = 86400 * 7 - (now - GT.callsignLookups.lotwLastUpdate); GT.lotwWhenDate = now + lotwWhenTimer; GT.lotwLoadTimer = nodeTimers.setTimeout(lotwDownload, lotwWhenTimer * 1000); } try { if (!fs.existsSync(GT.lotwFile)) { GT.callsignLookups.lotwLastUpdate = 0; } else { var data = fs.readFileSync(GT.lotwFile); GT.lotwCallsigns = JSON.parse(data); if (Object.keys(GT.lotwCallsigns).length < 100) { lotwDownload(); } } if (GT.callsignLookups.lotwLastUpdate == 0) { lotwDownload(); } } catch (e) { console.log(e); GT.callsignLookups.lotwLastUpdate = 0; lotwDownload(); } } function lotwSettingsDisplay() { lotwUseEnable.checked = GT.callsignLookups.lotwUseEnable; if (GT.callsignLookups.lotwLastUpdate == 0) { lotwUpdatedTd.innerHTML = "Never"; } else { lotwUpdatedTd.innerHTML = userTimeString( GT.callsignLookups.lotwLastUpdate * 1000 ); } if (!GT.callsignLookups.lotwUseEnable) { if (GT.lotwLoadTimer != null) nodeTimers.clearTimeout(GT.lotwLoadTimer); GT.lotwLoadTimer = null; GT.lotwCallsigns = Object(); } lotwCountTd.innerHTML = Object.keys(GT.lotwCallsigns).length; } function lotwValuesChanged() { GT.callsignLookups.lotwUseEnable = lotwUseEnable.checked; saveCallsignSettings(); if (GT.callsignLookups.lotwUseEnable == true) { lotwLoadCallsigns(); } lotwSettingsDisplay(); setAlertVisual(); goProcessRoster(); if (GT.rosterInitialized) GT.callRosterWindowHandle.window.resize(); } function lotwDownload(fromSettings) { lotwUpdatedTd.innerHTML = "Downloading..."; getBuffer( "https://lotw.arrl.org/lotw-user-activity.csv", processLotwCallsigns, null, "https", 443 ); } function processLotwCallsigns(result, flag) { // var result = String(buffer); var lines = Array(); lines = result.split("\n"); var lotwCallsigns = Object(); for (x in lines) { var breakout = lines[x].split(","); if (breakout.length == 3) { var dateTime = new Date( Date.UTC( breakout[1].substr(0, 4), parseInt(breakout[1].substr(5, 2)) - 1, breakout[1].substr(8, 2), 0, 0, 0 ) ); lotwCallsigns[breakout[0]] = parseInt(dateTime.getTime() / 1000) / 86400; } } GT.callsignLookups.lotwLastUpdate = timeNowSec(); var now = timeNowSec(); if (GT.lotwLoadTimer != null) nodeTimers.clearTimeout(GT.lotwLoadTimer); var lotwWhenTimer = 86400 * 7 - (now - GT.callsignLookups.lotwLastUpdate); GT.lotwWhenDate = now + lotwWhenTimer; GT.lotwLoadTimer = nodeTimers.setTimeout(lotwDownload, lotwWhenTimer * 1000); if (Object.keys(lotwCallsigns).length > 100) { GT.lotwCallsigns = lotwCallsigns; fs.writeFileSync(GT.lotwFile, JSON.stringify(GT.lotwCallsigns)); } lotwSettingsDisplay(); } function cacLoadCallsigns() { var now = timeNowSec(); if (now - GT.callsignLookups.cacLastUpdate > 86400 * 7) { GT.callsignLookups.cacLastUpdate = 0; } else { var cacWhenTimer = 86400 * 7 - (now - GT.callsignLookups.cacLastUpdate); GT.cacWhenDate = now + cacWhenTimer; GT.cacLoadTimer = nodeTimers.setTimeout(cacDownload, cacWhenTimer * 1000); } try { if (!fs.existsSync(GT.cacFile)) { GT.callsignLookups.cacLastUpdate = 0; } else { parseCacCallsigns(fs.readFileSync(GT.cacFile, "UTF-8")); } if (GT.callsignLookups.cacLastUpdate == 0) { cacDownload(); } } catch (e) { GT.callsignLookups.cacLastUpdate = 0; cacDownload(); } } function parseCacCallsigns(data) { let callsignRows = data.split("\n"); for (let x = 0; x < callsignRows.length; x++) { if (callsignRows[x].length > 1) { GT.cacCallsigns[callsignRows[x].substr(8)] = callsignRows[x].substr(6, 2); } } fs.writeFileSync(GT.cacFile, data, "UTF-8"); updateQSO(); } function processCacCallsigns(buffer, flag) { let data = (typeof buffer == "object") ? String(buffer) : buffer; parseCacCallsigns(data); GT.callsignLookups.cacLastUpdate = timeNowSec(); var now = timeNowSec(); if (GT.cacLoadTimer != null) nodeTimers.clearTimeout(GT.cacLoadTimer); var cacWhenTimer = 86400 * 7 - (now - GT.callsignLookups.cacLastUpdate); GT.cacWhenDate = now + cacWhenTimer; GT.cacLoadTimer = nodeTimers.setTimeout(cacDownload, cacWhenTimer * 1000); cacSettingsDisplay(); } function cacDownload(fromSettings) { cacUpdatedTd.innerHTML = "Downloading..."; getBuffer( "https://storage.googleapis.com/gt_app/canada.txt", processCacCallsigns, null, "http", 80 ); } function cacSettingsDisplay() { cacUseEnable.checked = GT.callsignLookups.cacUseEnable; if (GT.callsignLookups.cacLastUpdate == 0) { cacUpdatedTd.innerHTML = "Never"; } else { cacUpdatedTd.innerHTML = userTimeString(GT.callsignLookups.cacLastUpdate * 1000); } if (!GT.callsignLookups.cacUseEnable) { if (GT.cacLoadTimer != null) nodeTimers.clearTimeout(GT.cacLoadTimer); GT.cacLoadTimer = null; GT.cacCallsigns = Object(); } cacCountTd.innerHTML = Object.keys(GT.cacCallsigns).length; } function cacValuesChanged() { GT.callsignLookups.cacUseEnable = cacUseEnable.checked; saveCallsignSettings(); if (GT.callsignLookups.cacUseEnable == true) { cacLoadCallsigns(); } cacSettingsDisplay(); } function ausLoadCallsigns() { var now = timeNowSec(); if (now - GT.callsignLookups.ausLastUpdate > 86400 * 7) { GT.callsignLookups.ausLastUpdate = 0; } else { var ausWhenTimer = 86400 * 7 - (now - GT.callsignLookups.ausLastUpdate); GT.ausWhenDate = now + ausWhenTimer; GT.ausLoadTimer = nodeTimers.setTimeout(ausDownload, ausWhenTimer * 1000); } try { if (!fs.existsSync(GT.ausFile)) { GT.callsignLookups.ausLastUpdate = 0; } else { parseAusCallsigns(fs.readFileSync(GT.ausFile, "UTF-8")); } if (GT.callsignLookups.ausLastUpdate == 0) { ausDownload(); } } catch (e) { GT.callsignLookups.ausLastUpdate = 0; ausDownload(); } } function parseAusCallsigns(data) { let callsignRows = data.split("\n"); for (let x = 0; x < callsignRows.length; x++) { let parts = callsignRows[x].split(","); if (parts.length == 2) { GT.ausCallsigns[parts[1].trim()] = parts[0].trim(); } } fs.writeFileSync(GT.ausFile, data, "UTF-8"); updateQSO(); } function processAusCallsigns(buffer, flag) { let data = (typeof buffer == "object") ? String(buffer) : buffer; parseAusCallsigns(data); GT.callsignLookups.ausLastUpdate = timeNowSec(); var now = timeNowSec(); if (GT.ausLoadTimer != null) nodeTimers.clearTimeout(GT.ausLoadTimer); var ausWhenTimer = 86400 * 7 - (now - GT.callsignLookups.ausLastUpdate); GT.ausWhenDate = now + ausWhenTimer; GT.ausLoadTimer = nodeTimers.setTimeout(ausDownload, ausWhenTimer * 1000); ausSettingsDisplay(); } function ausDownload(fromSettings) { ausUpdatedTd.innerHTML = "Downloading..."; getBuffer( "https://storage.googleapis.com/gt_app/aus.txt", processAusCallsigns, null, "http", 80 ); } function ausSettingsDisplay() { ausUseEnable.checked = GT.callsignLookups.ausUseEnable; if (GT.callsignLookups.ausLastUpdate == 0) { ausUpdatedTd.innerHTML = "Never"; } else { ausUpdatedTd.innerHTML = userTimeString(GT.callsignLookups.ausLastUpdate * 1000); } if (!GT.callsignLookups.ausUseEnable) { if (GT.ausLoadTimer != null) nodeTimers.clearTimeout(GT.ausLoadTimer); GT.ausLoadTimer = null; GT.ausCallsigns = Object(); } ausCountTd.innerHTML = Object.keys(GT.ausCallsigns).length; } function ausValuesChanged() { GT.callsignLookups.ausUseEnable = ausUseEnable.checked; saveCallsignSettings(); if (GT.callsignLookups.ausUseEnable == true) { ausLoadCallsigns(); } ausSettingsDisplay(); } function oqrsLoadCallsigns() { var now = timeNowSec(); if (now - GT.callsignLookups.oqrsLastUpdate > 86400 * 7) { GT.callsignLookups.oqrsLastUpdate = 0; } else { var oqrsWhenTimer = 86400 * 7 - (now - GT.callsignLookups.oqrsLastUpdate); GT.oqrsWhenDate = now + oqrsWhenTimer; GT.oqrsLoadTimer = nodeTimers.setTimeout(oqrsDownload, oqrsWhenTimer * 1000); } try { if (!fs.existsSync(GT.oqrsFile)) { GT.callsignLookups.oqrsLastUpdate = 0; } else { var data = fs.readFileSync(GT.oqrsFile); GT.oqrsCallsigns = JSON.parse(data); } if (GT.callsignLookups.oqrsLastUpdate == 0) { oqrsDownload(); } } catch (e) { GT.callsignLookups.oqrsLastUpdate = 0; oqrsDownload(); } } function oqrsSettingsDisplay() { oqrsUseEnable.checked = GT.callsignLookups.oqrsUseEnable; if (GT.callsignLookups.oqrsLastUpdate == 0) { oqrsUpdatedTd.innerHTML = "Never"; } else { oqrsUpdatedTd.innerHTML = userTimeString( GT.callsignLookups.oqrsLastUpdate * 1000 ); } if (!GT.callsignLookups.oqrsUseEnable) { if (GT.oqrsLoadTimer != null) nodeTimers.clearTimeout(GT.oqrsLoadTimer); GT.oqrsLoadTimer = null; GT.oqrsCallsigns = Object(); } oqrsCountTd.innerHTML = Object.keys(GT.oqrsCallsigns).length; } function oqrsValuesChanged() { GT.callsignLookups.oqrsUseEnable = oqrsUseEnable.checked; saveCallsignSettings(); if (GT.callsignLookups.oqrsUseEnable == true) { oqrsLoadCallsigns(); } oqrsSettingsDisplay(); setAlertVisual(); goProcessRoster(); if (GT.rosterInitialized) GT.callRosterWindowHandle.window.resize(); } function oqrsDownload(fromSettings) { oqrsUpdatedTd.innerHTML = "Downloading..."; getBuffer( "https://storage.googleapis.com/gt_app/callsigns/clublog.json", processoqrsCallsigns, null, "http", 80 ); } function processoqrsCallsigns(buffer, flag) { GT.oqrsCallsigns = JSON.parse(buffer); GT.callsignLookups.oqrsLastUpdate = timeNowSec(); var now = timeNowSec(); if (GT.oqrsLoadTimer != null) nodeTimers.clearTimeout(GT.oqrsLoadTimer); var oqrsWhenTimer = 86400 * 7 - (now - GT.callsignLookups.oqrsLastUpdate); GT.oqrsWhenDate = now + oqrsWhenTimer; GT.oqrsLoadTimer = nodeTimers.setTimeout(oqrsDownload, oqrsWhenTimer * 1000); fs.writeFileSync(GT.oqrsFile, JSON.stringify(GT.oqrsCallsigns)); oqrsSettingsDisplay(); } function eqslLoadCallsigns() { var now = timeNowSec(); if (now - GT.callsignLookups.eqslLastUpdate > 86400 * 7) { GT.callsignLookups.eqslLastUpdate = 0; } else { var eqslWhenTimer = 86400 * 7 - (now - GT.callsignLookups.eqslLastUpdate); GT.eqslWhenDate = now + eqslWhenTimer; GT.eqslLoadTimer = nodeTimers.setTimeout(eqslDownload, eqslWhenTimer * 1000); } try { if (!fs.existsSync(GT.eqslFile)) { GT.callsignLookups.eqslLastUpdate = 0; } else { var data = fs.readFileSync(GT.eqslFile); GT.eqslCallsigns = JSON.parse(data); } if (GT.callsignLookups.eqslLastUpdate == 0) { eqslDownload(); } } catch (e) { console.log(e); GT.callsignLookups.eqslLastUpdate = 0; eqslDownload(); } } function eqslSettingsDisplay() { eqslUseEnable.checked = GT.callsignLookups.eqslUseEnable; if (GT.callsignLookups.eqslLastUpdate == 0) { eqslUpdatedTd.innerHTML = "Never"; } else { eqslUpdatedTd.innerHTML = userTimeString( GT.callsignLookups.eqslLastUpdate * 1000 ); } if (!GT.callsignLookups.eqslUseEnable) { if (GT.eqslLoadTimer != null) nodeTimers.clearTimeout(GT.eqslLoadTimer); GT.eqslLoadTimer = null; GT.eqslCallsigns = Object(); } eqslCountTd.innerHTML = Object.keys(GT.eqslCallsigns).length; } function eqslValuesChanged() { GT.callsignLookups.eqslUseEnable = eqslUseEnable.checked; saveCallsignSettings(); if (GT.callsignLookups.eqslUseEnable == true) { eqslLoadCallsigns(); } eqslSettingsDisplay(); setAlertVisual(); goProcessRoster(); if (GT.rosterInitialized) GT.callRosterWindowHandle.window.resize(); } function eqslDownload(fromSettings) { eqslUpdatedTd.innerHTML = "Downloading..."; getBuffer( "https://www.eqsl.cc/qslcard/DownloadedFiles/AGMemberList.txt", processeqslCallsigns, null, "https", 443 ); } function processeqslCallsigns(buffer, flag) { var result = String(buffer); var lines = Array(); lines = result.split("\n"); GT.eqslCallsigns = Object(); for (x in lines) { GT.eqslCallsigns[lines[x].trim()] = true; } GT.callsignLookups.eqslLastUpdate = timeNowSec(); var now = timeNowSec(); if (GT.eqslLoadTimer != null) nodeTimers.clearTimeout(GT.eqslLoadTimer); var eqslWhenTimer = 86400 * 7 - (now - GT.callsignLookups.eqslLastUpdate); GT.eqslWhenDate = now + eqslWhenTimer; GT.eqslLoadTimer = nodeTimers.setTimeout(eqslDownload, eqslWhenTimer * 1000); if (Object.keys(GT.eqslCallsigns).length > 10000) { fs.writeFileSync(GT.eqslFile, JSON.stringify(GT.eqslCallsigns)); } eqslSettingsDisplay(); } function ulsLoadCallsigns() { if (GT.ulsLoadTimer != null) { nodeTimers.clearTimeout(GT.ulsLoadTimer); GT.ulsLoadTimer = null; } var now = timeNowSec(); if (now - GT.callsignLookups.ulsLastUpdate > 86400 * 7) ulsDownload(); else { var ulsWhenTimer = 86400 * 7 - (now - GT.callsignLookups.ulsLastUpdate); GT.ulsWhenDate = now + ulsWhenTimer; GT.ulsLoadTimer = nodeTimers.setTimeout(ulsDownload, ulsWhenTimer * 1000); updateCallsignCount(); } } function updateQSO() { if (GT.ulsCallsignsCount > 0 && GT.callsignLookups.ulsUseEnable) { for (let hash in GT.QSOhash) { let details = GT.QSOhash[hash]; if (isKnownCallsignUSplus(details.dxcc)) { let lookupCall = false; if ((details.cnty == null || details.state == null)) { // Do County Lookup lookupCall = true; } else if (details.cnty != null) { if (!(details.cnty in GT.cntyToCounty)) { if (details.cnty.indexOf(",") == -1) { if (!(details.state + "," + details.cnty in GT.cntyToCounty)) { lookupCall = true; } } else { lookupCall = true; } } } if (lookupCall) { lookupKnownCallsign(details, true); } } } } if (GT.callsignLookups.cacUseEnable || GT.callsignLookups.ausUseEnable) { for (let hash in GT.QSOhash) { let details = GT.QSOhash[hash]; if (details.dxcc == 1 && details.state == null) { if (details.DEcall in GT.cacCallsigns) { details.state = "CA-" + GT.cacCallsigns[details.DEcall]; } } else if (details.dxcc == 150 && details.state == null) { if (details.DEcall in GT.ausCallsigns) { details.state = "AU-" + GT.ausCallsigns[details.DEcall]; } } } refreshQSOs(); } } function updateCallsignCount() { GT.ulsDatabase.transaction(function (tx) { tx.executeSql("SELECT count(*) as cnt FROM calls", [], function (tx, results) { var len = results.rows.length, i; if (len == 1) { GT.ulsCallsignsCount = results.rows[0].cnt; ulsCountTd.innerHTML = GT.ulsCallsignsCount; updateQSO(); } }, null ); }); } function ulsSettingsDisplay() { ulsUseEnable.checked = GT.callsignLookups.ulsUseEnable; if (GT.callsignLookups.ulsLastUpdate == 0) { ulsUpdatedTd.innerHTML = "Never"; } else { ulsUpdatedTd.innerHTML = userTimeString(GT.callsignLookups.ulsLastUpdate * 1000); } if (!GT.callsignLookups.ulsUseEnable) { if (GT.ulsLoadTimer != null) nodeTimers.clearTimeout(GT.ulsLoadTimer); GT.ulsLoadTimer = null; GT.ulsCallsignsCount = 0; ulsCountTd.innerHTML = GT.ulsCallsignsCount; } } function ulsValuesChanged() { GT.callsignLookups.ulsUseEnable = ulsUseEnable.checked; if (GT.callsignLookups.ulsUseEnable == true) { ulsLoadCallsigns(); } else { resetULSDatabase(); ulsCountTd.innerHTML = 0; } saveCallsignSettings(); ulsSettingsDisplay(); goProcessRoster(); if (GT.rosterInitialized) GT.callRosterWindowHandle.window.resize(); } function ulsDownload() { ulsUpdatedTd.innerHTML = "Downloading..."; ulsCountTd.innerHTML = 0; getChunkedBuffer( "https://storage.googleapis.com/gt_app/callsigns/callsigns.txt", processulsCallsigns, null, "http", 80 ); } function getChunkedBuffer(file_url, callback, flag, mode, port, cookie, errorHandler) { var url = require("url"); var http = require(mode); var fileBuffer = null; var options = null; if (cookie != null) { options = { host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api port: port, followAllRedirects: true, path: url.parse(file_url).path, // eslint-disable-line node/no-deprecated-api headers: { Cookie: cookie } }; } else { options = { host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api port: port, followAllRedirects: true, path: url.parse(file_url).path // eslint-disable-line node/no-deprecated-api }; } http.get(options, function (res) { var fsize = res.headers["content-length"]; var fread = 0; var cookies = null; if (typeof res.headers["set-cookie"] != "undefined") { cookies = res.headers["set-cookie"]; } res .on("data", function (data) { var isEnd = false; fread += data.length; if (fread == fsize) isEnd = true; if (fileBuffer == null) { fileBuffer = callback(data, flag, cookies, true, isEnd); } else { fileBuffer = callback(fileBuffer + data, flag, cookies, false, isEnd); // eslint-disable-line node/no-callback-literal } }) .on("end", function () {}) .on("error", function (e) { ulsUpdatedTd.innerHTML = "Error downloading"; console.error("Got error: " + e.message); }); }); } GT.ulsDatabase = openDatabase( "ulsDB", "1.0", "US Callsigns", 50 * 1024 * 1024 ); GT.ulsDatabase.transaction(function (tx) { tx.executeSql("CREATE TABLE IF NOT EXISTS calls (callsign TEXT PRIMARY KEY, zip, state)"); }); function resetULSDatabase() { GT.callsignLookups.ulsLastUpdate = 0; GT.ulsCallsignsCount = 0; } function processulsCallsigns(data, flag, cookies, starting, finished) { var buffer = String(data); var returnBuffer = ""; if (buffer && buffer.length > 0) { var lines = null; if (buffer[buffer.length - 1] == "\n") { lines = buffer.split("\n"); } else { var lastIndex = buffer.lastIndexOf("\n"); returnBuffer = buffer.substring(lastIndex); lines = buffer.substring(0, lastIndex).split("\n"); } if (lines.length > 0) { GT.ulsDatabase.transaction(function (tx) { if (starting == true) { if (GT.ulsLoadTimer != null) { nodeTimers.clearTimeout(GT.ulsLoadTimer); } GT.ulsLoadTimer = null; GT.ulsWhenDate = 0; GT.ulsCallsignsCount = 0; ulsUpdatedTd.innerHTML = "Processing..."; tx.executeSql("delete from calls"); } for (var x in lines) { if (lines[x].length) { ++GT.ulsCallsignsCount; tx.executeSql("INSERT INTO calls (rowid, callsign, zip, state) VALUES (" + GT.ulsCallsignsCount + ",\"" + lines[x].substr(7) + "\",\"" + lines[x].substr(0, 5) + "\",\"" + lines[x].substr(5, 2) + "\")"); if (GT.ulsCallsignsCount % 10000 == 0) { tx.executeSql( "SELECT count(*) as cnt FROM calls", [], function (rx, results) { var len = results.rows.length; if (len == 1) { ulsCountTd.innerHTML = results.rows[0].cnt; } } ); } } } lines = null; }); } } if (finished == true) { var now = timeNowSec(); if (GT.ulsLoadTimer != null) { nodeTimers.clearTimeout(GT.ulsLoadTimer); } var ulsWhenTimer = 86400 * 7; GT.ulsWhenDate = ulsWhenTimer + now; GT.ulsLoadTimer = nodeTimers.setTimeout(ulsDownload, ulsWhenTimer * 1000); GT.ulsDatabase.transaction(function (tx) { tx.executeSql( "SELECT count(*) as cnt FROM calls", [], function (rx, results) { var len = results.rows.length, i; if (len == 1) { GT.ulsCallsignsCount = results.rows[0].cnt; ulsCountTd.innerHTML = GT.ulsCallsignsCount; GT.callsignLookups.ulsLastUpdate = timeNowSec(); saveCallsignSettings(); ulsSettingsDisplay(); updateQSO(); } } ); }); } return Buffer(returnBuffer); // eslint-disable-line node/no-deprecated-api } function lookupKnownCallsign(object, writeState = false) { GT.ulsDatabase.transaction(function (tx) { let qry = "SELECT * FROM calls where callsign = \"" + object.DEcall + "\""; tx.executeSql( qry, [], function (tx, results) { if (results.rows.length == 1) { if (object.state == null) { object.state = "US-" + results.rows[0].state; if (writeState) { refreshQSOs(); } } object.zipcode = String(results.rows[0].zip); if (object.cnty == null && object.zipcode in GT.zipToCounty) { var counties = GT.zipToCounty[object.zipcode]; if (counties.length > 1) { object.qual = false; } else { object.qual = true; } object.cnty = counties[0]; save = true; if (writeState) { refreshQSOs(); } } } }, null ); }); } function downloadCtyDat() { ctyDatStatus.innerHTML = "Downloading..."; getBuffer( "https://storage.googleapis.com/gt_app/ctydat.json?cb=" + Date.now(), processCtyDat, null, "https", 443 ); } function processCtyDat(buffer) { var data = String(buffer); ctyDatStatus.innerHTML = "Update: " + data.length + " bytes read"; try { var ctydata = JSON.parse(data); var file = "./data/mh-root-prefixed.json"; if (fs.existsSync(file)) { var fileBuf = fs.readFileSync(file, "UTF-8"); var dxccInfo = JSON.parse(fileBuf); for (const key in dxccInfo) { dxccInfo[key].ituzone = null; dxccInfo[key].cqzone = null; dxccInfo[key].prefixITU = {}; dxccInfo[key].prefixCQ = {}; dxccInfo[key].directITU = {}; dxccInfo[key].directCQ = {}; if (key in ctydata) { dxccInfo[key].cqzone = padNumber(Number(ctydata[key].cqzone), 2); dxccInfo[key].ituzone = padNumber(Number(ctydata[key].ituzone), 2); // Skip Guantanamo Bay, hand crafted with love if (key != "105") { dxccInfo[key].prefix = []; dxccInfo[key].direct = []; var arr = ctydata[key].prefix.substr(0, ctydata[key].prefix.length - 1).split(" "); for (const x in arr) { var test = arr[x]; var direct = false; var cq = null; var itu = null; if (test.charAt(0) == "=") { direct = true; test = test.substr(1); } var cqTest = test.match(/\((.*)\)/); if (cqTest) { cq = padNumber(Number(cqTest[1]), 2); } var ituTest = test.match(/\[(.*)\]/); if (ituTest) { itu = padNumber(Number(ituTest[1]), 2); } var i = test.indexOf("("); if (i > -1) { test = test.substr(0, i); } i = test.indexOf("["); if (i > -1) { test = test.substr(0, i); } i = test.indexOf("<"); if (i > -1) { test = test.substr(0, i); } i = test.indexOf("{"); if (i > -1) { test = test.substr(0, i); } i = test.indexOf("~"); if (i > -1) { test = test.substr(0, i); } if (direct) { dxccInfo[key].direct.push(test); if (cq) { dxccInfo[key].directCQ[test] = cq; } if (itu) { dxccInfo[key].directITU[test] = itu; } } else { dxccInfo[key].prefix.push(test); if (cq) { dxccInfo[key].prefixCQ[test] = cq; } if (itu) { dxccInfo[key].prefixITU[test] = itu; } } } dxccInfo[key].prefix = uniqueArrayFromArray(dxccInfo[key].prefix); dxccInfo[key].prefix.sort(); dxccInfo[key].direct = uniqueArrayFromArray(dxccInfo[key].direct); dxccInfo[key].direct.sort(); } } } fs.writeFileSync(file, JSON.stringify(dxccInfo, null, 2)); ctyDatFinal.innerHTML = file + " updated!"; } } catch (e) { console.log(e); } }