-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
108 lines (93 loc) · 3.52 KB
/
Copy pathscript.js
File metadata and controls
108 lines (93 loc) · 3.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
const rssFeedUrl = "https://raw.githubusercontent.com/dionma2020/rss/main/feed.xml";
const allCallsFileUrl = "https://raw.githubusercontent.com/dionma2020/rss/main/allcalls.dat";
const fireTruckFileUrl = "https://raw.githubusercontent.com/dionma2020/rss/main/FireTruckStatus.dat";
// Fetch file data with cache busting
async function fetchData(url) {
const cacheBuster = `${url}?t=${new Date().getTime()}`; // Prevent caching
const response = await fetch(cacheBuster);
if (!response.ok) {
throw new Error(`Error fetching ${url}: ${response.statusText}`);
}
return response.text();
}
// Parse RSS feed
function parseRSSFeed(feedText) {
const entries = [];
const lines = feedText.split("\n").filter(line => line.includes(","));
for (const line of lines) {
const [code, timestamp] = line.split(",");
if (code && timestamp) {
entries.push({ code: code.trim(), timestamp: timestamp.trim() });
}
}
return entries;
}
// Parse data file
function parseDataFile(fileText) {
const map = new Map();
const lines = fileText.split("\n").filter(line => line.includes(","));
for (const line of lines) {
const [key, value] = line.split(",");
if (key && value) {
map.set(key.trim(), value.trim());
}
}
return map;
}
// Decode RSS entries
function decodeEntries(rssEntries, allCallsMap, fireTruckMap) {
return rssEntries
.map(entry => {
let callDesc = null;
let truckDesc = null;
// Iterate over possible prefix-suffix splits
for (let i = 1; i < entry.code.length; i++) {
const prefix = entry.code.slice(0, i);
const suffix = entry.code.slice(i);
if (allCallsMap.has(prefix)) callDesc = allCallsMap.get(prefix);
if (fireTruckMap.has(suffix)) truckDesc = fireTruckMap.get(suffix);
}
// Return entry only if both matches are found
if (callDesc && truckDesc) {
return { ...entry, callDesc, truckDesc };
}
return null;
})
.filter(entry => entry !== null); // Remove null entries
}
// Display decoded entries
function displayDecodedEntries(decodedEntries) {
const output = document.getElementById("output");
output.innerHTML = ""; // Clear previous content
if (decodedEntries.length === 0) {
output.innerHTML = "<p>No decoded entries found.</p>";
return;
}
for (const entry of decodedEntries) {
const p = document.createElement("p");
p.textContent = `${entry.callDesc} - ${entry.truckDesc} (${entry.timestamp})`;
output.appendChild(p);
}
}
// Main function
async function processRSSFeed() {
try {
const [rssText, allCallsText, fireTruckText] = await Promise.all([
fetchData(rssFeedUrl),
fetchData(allCallsFileUrl),
fetchData(fireTruckFileUrl),
]);
const rssEntries = parseRSSFeed(rssText);
const allCallsMap = parseDataFile(allCallsText);
const fireTruckMap = parseDataFile(fireTruckText);
const decodedEntries = decodeEntries(rssEntries, allCallsMap, fireTruckMap);
displayDecodedEntries(decodedEntries);
} catch (error) {
console.error("Error:", error);
const output = document.getElementById("output");
output.innerHTML = `<p style="color: red;">Error: ${error.message}</p>`;
}
}
// Refresh data every second
setInterval(processRSSFeed, 1000);
processRSSFeed();