Mainly frontend
@ -12,67 +12,42 @@ const keys = require('/srv/keys/owlboard/keys.configs');
|
||||
const axios = require('axios');
|
||||
const zlib = require('zlib');
|
||||
|
||||
async function initCorpus() {
|
||||
let gzipData = await getCorpusAgain();
|
||||
async function init() {
|
||||
var gzipData = await get();
|
||||
console.log(gzipData);
|
||||
var rawData = await extract(gzipData);
|
||||
console.log(rawData);
|
||||
var cleanData = await clean(rawData);
|
||||
console.log(cleanData)
|
||||
return cleanData;
|
||||
}
|
||||
|
||||
async function getCorpus() {
|
||||
async function get() {
|
||||
authHead = Buffer.from(`${keys.nr_user}:${keys.nr_pass}`).toString('base64');
|
||||
const url = 'https://datafeeds.networkrail.co.uk/ntrod/SupportingFileAuthenticate?type=CORPUS'
|
||||
const options = {
|
||||
method: 'get',
|
||||
timeout: 3000,
|
||||
timeout: 20000,
|
||||
headers: {'Authorization': `Basic ${authHead}`},
|
||||
responseType: 'arraybuffer'
|
||||
};
|
||||
return await axios.get(url, options).then(function (response){console.log(response.data);return response.data;});
|
||||
var { output } = await axios.get(url, options)
|
||||
console.log(output)
|
||||
return output;
|
||||
}
|
||||
|
||||
async function getCorpusAgain() {
|
||||
authHead = Buffer.from(`${keys.nr_user}:${keys.nr_pass}`).toString('base64');
|
||||
const decomp = zlib.createGunzip();
|
||||
const getReq = axios.create({
|
||||
method: 'get',
|
||||
baseURL: 'https://datafeeds.networkrail.co.uk/ntrod/SupportingFileAuthenticate?type=CORPUS',
|
||||
timeout: 3000,
|
||||
headers: {'Authorization': `Basic ${authHead}`},
|
||||
responseType: 'arraybuffer'
|
||||
});
|
||||
|
||||
let download = await getReq().then(function (response){
|
||||
return response.data;
|
||||
})
|
||||
|
||||
zlib.gunzip(download, function (_err, output){
|
||||
let string = output.toString()
|
||||
async function extract(input) {
|
||||
var { data } = zlib.Gunzip(input);
|
||||
let string = data.toString()
|
||||
let obj = JSON.parse(string)
|
||||
//console.log(obj);
|
||||
return obj; // Find out how to get data out of callback -> See pinned tab on laptop2.ws
|
||||
})
|
||||
}
|
||||
|
||||
async function init() { // PSUEDOCODE
|
||||
var zipData = await get();
|
||||
var rawData = extract(zipData);
|
||||
var cleanData = clean(rawData)
|
||||
}
|
||||
|
||||
async function get() {
|
||||
|
||||
}
|
||||
|
||||
async function extract() {
|
||||
|
||||
}
|
||||
|
||||
async function clean() {
|
||||
|
||||
return "Empty Function: clean()"
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
initCorpus,
|
||||
getCorpusAgain,
|
||||
getCorpus,
|
||||
init
|
||||
}
|
5
static/board.html
Normal file
@ -0,0 +1,5 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title id="pgTitle">OwlBoard - Loading</title>
|
||||
</head>
|
||||
</html>
|
BIN
static/images/.app-icon-main.xcf
Normal file
BIN
static/images/app-icons/any/app-256.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
static/images/app-icons/any/app-512.png
Normal file
After Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
@ -1,32 +1,30 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<meta name="description" content="Athena - Live train departures for traincrew."/>
|
||||
<meta name="description" content="OwlBoard - Live train departures for traincrew."/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="application-name" content="Athena">
|
||||
<meta name="application-name" content="OwlBoard">
|
||||
<meta name="author" content="Frederick Boniface">
|
||||
<meta name="theme-color" content="#155bb7">
|
||||
<link rel="stylesheet" type="text/css" href="/styles/style.css"/>
|
||||
<link rel="icon" type="image/png" href="/assets/icons/favicon.ico"/>
|
||||
<link rel="icon" type="image/png" href="/images/logo/logo-sq-256.png"/>
|
||||
<link rel="manifest" type="application/json" href="/manifest.json"/>
|
||||
|
||||
<script src="/js/nav.js"></script> <title>Athena</title>
|
||||
|
||||
<script src="/js/tiploc-finder.js" async></script>
|
||||
|
||||
<script src="/js/nav.js"></script>
|
||||
<title>OwlBoard</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- Popup Menu -->
|
||||
<div id="menubar_hamburger" class="hide_micro">
|
||||
<button class="sidebar_control" id="sidebar_open_short" onclick="sidebarOpen()">☰</button>
|
||||
<button class="sidebar_control" id="sidebar_close_short" onclick="sidebarClose()">×</button>
|
||||
<button aria-label="Menu" class="sidebar_control" id="sidebar_open_short" onclick="sidebarOpen()">☰</button>
|
||||
<button aria-label="Close Menu" class="sidebar_control" id="sidebar_close_short" onclick="sidebarClose()">×</button>
|
||||
</div>
|
||||
<div id="sidebar">
|
||||
<a href="/">Home</a>
|
||||
<a href="/help.php">Help</a>
|
||||
<a href="/issue.php">Report Issue</a>
|
||||
<a href="/help.html">Help</a>
|
||||
<a href="/issue.html">Report Issue</a>
|
||||
</div>
|
||||
|
||||
<!-- Main Content Begins -->
|
||||
@ -61,8 +59,8 @@
|
||||
<br>
|
||||
<br>
|
||||
<div class="text-description">
|
||||
<p>This is an Alpha release and is under testing.</p>
|
||||
<p>Some features may not work and some stations may not be available.</p>
|
||||
<p>This is a development release and is under testing.</p>
|
||||
<p>Many features do not yet work.</p>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
|
0
static/js/service-worker.js
Normal file
@ -1,90 +0,0 @@
|
||||
const url = "https://tiger.worldline.global/";
|
||||
const view = "/staff;scrollbar=true";
|
||||
|
||||
console.group("Athena - Departure Boards")
|
||||
console.info("Initialising");
|
||||
|
||||
|
||||
/* Get lookup data from JSON file */
|
||||
let dataGlobal;
|
||||
|
||||
const getData = async () => {
|
||||
console.info("Loading Tiger lookup file");
|
||||
// Probably put a loading wheel here!
|
||||
const response = await fetch("./assets/tiger_codes.json");
|
||||
const data = await response.json();
|
||||
dataGlobal = data;
|
||||
return data;
|
||||
};
|
||||
|
||||
(async () => {
|
||||
await getData();
|
||||
console.info("Lookup file loaded");
|
||||
console.info(dataGlobal);
|
||||
console.info("Initialisation complete");
|
||||
// Probably end the loading wheel here.
|
||||
console.groupEnd();
|
||||
})();
|
||||
|
||||
/* Read Lookup textbox entry and call the gotoInfoBoard() function */
|
||||
function getTextEntry() {
|
||||
console.group("Athena: function: getTextEntry()");
|
||||
console.info("Getting contents of textbox 'crs-lookup'");
|
||||
let forLookup = document.getElementById("crs-lookup").value;
|
||||
console.info("You have entered: " + forLookup.toUpperCase());
|
||||
console.info("Calling gotoInfoBoard(" + forLookup.toLowerCase() + ")");
|
||||
console.groupEnd()
|
||||
gotoInfoBoard(forLookup);
|
||||
};
|
||||
|
||||
/* Runs basic validation of data type and then process that and finally
|
||||
redirects to Tiger using a built URL */
|
||||
function gotoInfoBoard(station) {
|
||||
// Firstly start a console group for the function
|
||||
console.group("Athena: function: gotoInfoBoard(" + station.toLowerCase() + ")");
|
||||
|
||||
//Determins if code is TIPLOC and if so redirects immediately
|
||||
if (station.length > 3 && station.length < 8) {
|
||||
console.info(station.length + "characters, presumed to be tiploc.");
|
||||
console.info("Redirecting to " + station + " departure board");
|
||||
window.location = url + station.toUpperCase() + view;
|
||||
|
||||
//If code is CRS then process further to determine the TIPLOC then redirect
|
||||
} else if (station.length == 3) {
|
||||
console.info("CRS entered: " + station.toUpperCase() + ", required lookup");
|
||||
console.info("Finding object");
|
||||
let crs_to_find = station.toLowerCase();
|
||||
console.debug("Converted string to lower case:" + crs_to_find);
|
||||
//Check if the entered CRS exists in the lookup file
|
||||
console.info("Checking if CRS code exists in lookup data")
|
||||
let hasKey = dataGlobal.hasOwnProperty(crs_to_find);
|
||||
if (hasKey) { //If key exists then log and continue
|
||||
console.info(crs_to_find.toUpperCase() + " does exist in lookup file");
|
||||
} else { //If key does not exist then stop further processing
|
||||
console.warn(crs_to_find.toUpperCase() + "does not exist in lookup file");
|
||||
console.error(crs_to_find.toUpperCase() + " is an incorrect code or not supported.");
|
||||
alert(crs_to_find.toUpperCase() + " is not a valid or supported CRS, " +
|
||||
"please see the help section for more information");
|
||||
console.groupEnd();
|
||||
return 0;
|
||||
}
|
||||
let crs_obj = dataGlobal[crs_to_find];
|
||||
console.info("Isolating TIPLOC from Object");
|
||||
let tiploc = crs_obj['tiploc']; // crs_obj['tiploc']??
|
||||
console.info("TIPLOC: " + tiploc);
|
||||
console.info("Redirecting to " + tiploc + " departure board");
|
||||
window.location = url + tiploc.toUpperCase() + view;
|
||||
|
||||
//If the code cannot be validated as CRS or TIPLOC then throw an alert and log
|
||||
} else {
|
||||
console.error("Please only enter:\n - A 3 character CRS code,\n - A 4-7 " +
|
||||
"character TIPLOC code.\n\nPartial codes or station names cannot be looked "+
|
||||
"up.");
|
||||
alert("Please only enter:\n - A 3 character CRS code,\n - A 4-7 " +
|
||||
"character TIPLOC code.\n\nPartial codes or station names cannot be looked "+
|
||||
"up.");
|
||||
}
|
||||
// Lastly close the log group at the end of the Function and return.
|
||||
console.groupEnd();
|
||||
return 0;
|
||||
}
|
@ -1,10 +1,10 @@
|
||||
{
|
||||
"name": "OwlBoards",
|
||||
"short_name": "OwlBoards",
|
||||
"name": "OwlBoard",
|
||||
"short_name": "OwlBoard",
|
||||
"start_url": "/",
|
||||
"scope": "/",
|
||||
"display": "standalone",
|
||||
"background_color": "#ffffff",
|
||||
"background_color": "#404c55",
|
||||
"description": "Live station departures - aimed at train-crew.",
|
||||
"categories": "travel,utilities",
|
||||
"lang": "en",
|
||||
@ -12,46 +12,56 @@
|
||||
"theme_color": "#155bb7",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/images/app-icons/app-1200.png",
|
||||
"src": "/images/app-icons/maskable/app-1200.png",
|
||||
"sizes": "1200x1200",
|
||||
"type": "image/png",
|
||||
"purpose": "any maskable"
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/images/app-icons/app-768.png",
|
||||
"src": "/images/app-icons/maskable/app-768.png",
|
||||
"sizes": "768x768",
|
||||
"type": "image/png",
|
||||
"purpose": "any maskable"
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/images/app-icons/app-512.png",
|
||||
"src": "/images/app-icons/maskable/app-512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "any maskable"
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/images/app-icons/app-384.png",
|
||||
"src": "/images/app-icons/maskable/app-384.png",
|
||||
"sizes": "384x384",
|
||||
"type": "image/png",
|
||||
"purpose": "any maskable"
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/images/app-icons/app-256.png",
|
||||
"src": "/images/app-icons/maskable/app-256.png",
|
||||
"sizes": "256x256",
|
||||
"type": "image/png",
|
||||
"purpose": "any maskable"
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/images/app-icons/app-128.png",
|
||||
"src": "/images/app-icons/maskable/app-128.png",
|
||||
"sizes": "128x128",
|
||||
"type": "image/png",
|
||||
"purpose": "any maskable"
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/images/app-icons/app-76.png",
|
||||
"src": "/images/app-icons/maskable/app-76.png",
|
||||
"sizes": "76x76",
|
||||
"type": "image/png",
|
||||
"purpose": "any maskable"
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/images/app-icons/any/app-512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "/images/app-icons/any/app-256.png",
|
||||
"sizes": "256x256",
|
||||
"type": "image/png"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
0
static/report.html
Normal file
0
static/styles/boards.css
Normal file
@ -18,9 +18,9 @@
|
||||
|
||||
/* COLOR VARS */
|
||||
:root {
|
||||
--main-bg-color: #5d5d74;
|
||||
--main-bg-color: #404c55;
|
||||
--accent-color: #007979;
|
||||
--overlay-color: #7fa6e6de;
|
||||
--overlay-color: #3c6f79de;
|
||||
--main-text-color: #00b7b7;
|
||||
--link-color: azure;
|
||||
--link-visited-color: azure;
|
||||
@ -33,10 +33,11 @@ body {
|
||||
padding-bottom: 60px; /*Footer height*/
|
||||
}
|
||||
.titleimg {
|
||||
width: 80%;
|
||||
width: 45%;
|
||||
padding-top: 20px;
|
||||
padding-bottom: 20px;
|
||||
max-width: 500px;
|
||||
min-width: 200px;
|
||||
transition: 0.2s;
|
||||
}
|
||||
.lookup-box {
|
||||
@ -129,7 +130,7 @@ body {
|
||||
}
|
||||
.sidebar_control {
|
||||
background-color: transparent;
|
||||
color: var(--accent-color);
|
||||
color: var(--link-color);
|
||||
border: none;
|
||||
font-family: sans-serif;
|
||||
font-size: larger;
|
||||
@ -170,6 +171,7 @@ body {
|
||||
footer {
|
||||
background-color: var(--accent-color);
|
||||
font-family: firamono, monospace;
|
||||
font-size: smaller;
|
||||
color: white;
|
||||
width: 100%;
|
||||
position: fixed;
|
||||
|