sokolov-sbs-flowserver/flow/sokolovodchody.js
2025-08-07 21:49:01 +02:00

704 lines
14 KiB
JavaScript

exports.id = 'sokolovodchodyspojov';
exports.title = 'Sokolov odchody spojov';
exports.version = '1.0.0';
exports.group = 'Worksys';
exports.color = '#2134B0';
exports.input = 1;
exports.output = ["blue", "white", "yellow", "red"];
exports.click = false;
exports.author = 'Rastislav Kovac';
exports.options = { edge: "undefined" };
exports.readme = `Get bus departures from bus stop in Sokolov`;
const instanceSendTo = {
debug: 0,
departures: 1,
delays: 2
};
exports.install = function(instance) {
const parseString = require('xml2js').parseString;
const fetch = require('node-fetch');
const { execSync } = require('child_process');
class FetchRequest {
async getDepartures() {
// use simpleDate to get bus departures for current day, otherwise use date to get departures for next day
// it must be in format 2022-12-05
console.log(new Date())
//let date = new Date().toLocaleString().split('/'); //[ '12', '6', '2022, 11:47:32 PM' ]
// console.log(date)
// console.log(new Date().toLocaleString('zh', { hour12: false }))
// console.log(new Date().toLocaleString('sk', { hour12: false }))
const date = new Date(new Date().toLocaleString("en-US", {timeZone: "Europe/Bratislava" }))
const year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
console.log(year, month, day)
if(('' + month).length == 1) month = '0' + month;
if(('' + day).length == 1) day = '0' + day;
// if(date[0].length == 1) date[0] = '0' + date[0];
// if(date[1].length == 1) date[1] = '0' + date[1];
// const year = date[2].slice(0,4); // "2022"
// const month = date[0];
// const day = date[1];
const simpleDate = `${year}-${month}-${day}`;
console.log('simple date ~~~~~~', simpleDate)
const sr =
'<?xml version="1.0" encoding="utf-8"?>' +
'<soap12:Envelope ' +
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
'xmlns:xsd="http://www.w3.org/2001/XMLSchema" ' +
'xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> ' +
'<soap12:Body>' +
'<GetDepartures xmlns="http://www.emtest.sk/cp/">' +
'<busstopID>411000469</busstopID>' +
'<nastupiste>0</nastupiste>' +
`<dateFrom>${simpleDate}</dateFrom>` +
// '<dateFrom>2022-12-05</dateFrom>' +
`<dateTo>${simpleDate}</dateTo>` +
// '<dateTo>2022-12-05</dateTo>' +
'<firmaID>411</firmaID>' +
'</GetDepartures>' +
'</soap12:Body>' +
'</soap12:Envelope>';
let response = await fetch('http://62.141.28.141:5533/CPWebSvc2/service.asmx', {
method : "POST",
body: sr,
headers: {'Content-Type':'application/soap+xml'}
})
//console.log('bus departures``````````', response)
console.log('response ok ^^^^^^ dep',response.ok);
if (!response.ok) {
const message = `An error has occured: ${response.status}`;
throw new Error(message);
}
response = await response.text();
//console.log('bus departures``````````', response)
const result = this.parseDepartures(response);
return result;
}
parseDepartures(data) {
const allRegex = [/tn="[a-z]*/g, /lnt="[a-z]*/g, /td="[a-z]*/g, /ebn="[a-z]*/g];
let index = 0;
//we receive all departures for current day
const allDepartures = [];
//we filter just departures which are in future
const futureDepartures = [];
let value = null;
//for (const regexp of allRegex)
for (let i = 0; i < allRegex.length; i++)
{
index = 0;
const matches = data.matchAll(allRegex[i]);
// console.log('-----', matches)
for (const match of matches) {
if(!allDepartures[index]) allDepartures[index] = [];
//console.log(`Found ${match[0]} start=${match.index} end=${match.index + match[0].length}.`);
const substr = match.input.slice(match.index + match[0].length, );
const endOfSearchedString = substr.indexOf('"');
if(i == 1) value = substr.slice(4, endOfSearchedString); // bus number e.g. '7'
else if (i == 3) value = substr.slice(13, capitalizeFirstLetter(endOfSearchedString)); //name of buss stop e.g. "Sidlisko Michal skola"
else if (i == 2) {
// in case date, or time is just 1 number long (5.7.22 4:5), we need to change it to (05.07.22 04:05)
value = substr.slice(0, endOfSearchedString); // "5.11.22 4:5"
let date = value.slice(0, value.indexOf(' ')); // "5.11.22"
date = date.split('.') // ['5', '11', '22']
if(date[0].length == 1) date[0] = '0' + date[0];
if(date[1].length == 1) date[1] = '0' + date[1];
date = date.join('.')
let time = value.slice(value.indexOf(' ') + 1, value.length); // "4:5" ==> '04:05'
time = time.split(':');
if(time[0].length == 1) time[0] = '0' + time[0];
if(time[1].length == 1) time[1] = '0' + time[1];
time = time.join(':')
value = date + ' ' + time;
}
else value = substr.slice(0, endOfSearchedString);
allDepartures[index].push(value);
index++;
}
}
//return allDepartures;
// console.log('---',allDepartures);
//instance.send(instanceSendTo.allDepartures, allDepartures);
//we filter just departures, that are in future
let date = new Date();
date = date.toISOString();
console.log('******date', date)
allDepartures.map(item => {
let busDeparture = item[2];
let temp = [...busDeparture.matchAll(/\d\d/g)].map(a => a[0]); //[ '24', '11', '22', '04', '05' ]
busDeparture = new Date(`20${temp[2]}-${temp[1]}-${temp[0]} ${temp[3]}:${temp[4]}`)
//console.log(busDeparture.toISOString(), date.toISOString())
//date je UTC time, preto sa zmenia allDepartures az po 01:00
//console.log('***********',busDeparture, date)
if(busDeparture.toISOString() > date)
{
item[2] = `${temp[3]}:${temp[4]}`
futureDepartures.push(item);
}
})
return futureDepartures;
}
async getDelays() {
const delays = [];
const d = new Date();
const date = d.toISOString();
const sr =
'<?xml version="1.0" encoding="utf-8"?>' +
'<soap12:Envelope ' +
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
'xmlns:xsd="http://www.w3.org/2001/XMLSchema" ' +
'xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> ' +
'<soap12:Body>' +
'<FindAVLDepartureFromBusStopTable xmlns="http://www.emtest.sk/cp/">' +
'<busStopID>411000469</busStopID>' +
`<departureDateTime>${date}</departureDateTime>` +
'<count>10</count>' +
'<platformNumber>0</platformNumber>' +
'<firmId>411</firmId>' +
'</FindAVLDepartureFromBusStopTable>' +
'</soap12:Body>' +
'</soap12:Envelope>';
let response = await fetch('http://62.141.28.141:5533/CPWebSvc2/service.asmx', {
method : "POST",
body: sr,
headers: {'Content-Type':'application/soap+xml'}
})
//console.log('delays ------', response);
//console.log('response ok ^^^^^^ dep',response.ok);
if (!response.ok) {
const message = `An error has occured: ${response.status}`;
throw new Error(message);
}
response = await response.text();
//console.log('delays ~~~~~', response);
parseString(response, function (err, result) {
//console.log(result)
//console.log('asd',result['soap:Envelope']['soap:Body'][0].FindAVLDepartureFromBusStopTableResponse[0].departureCollection[0].Departure);
result = result['soap:Envelope']['soap:Body'][0].FindAVLDepartureFromBusStopTableResponse[0].departureCollection[0].Departure;
//console.log(checkNested(result,'soap:Envelope.soap:Body[0].FindAVLDepartureFromBusStopTableResponse[0].departureCollection[0].Departure' ));
//console.log(checkNested(result,'soapEnvelope' ));
// result = result['soap:Envelope']['soap:Body'][0].FindAVLDepartureFromBusStopTableResponse[0].departureCollection[0];
// console.log('====', result)
if(!result) return;
for (const item of result)
{
let a = null;
//console.log(item)
if(item.Delay[0].Departure[0].startsWith('0001-01')) a = [item.TripNumber[0], 0];
else a = [item.TripNumber[0], item.Delay[0].Departure[0], item.Delay[0].Arrival[0]];
delays.push(a);
}
});
return delays;
}
}
const departureRequest = new FetchRequest();
const delaysRequest = new FetchRequest();
const getDepartures = () => {
departureRequest.getDepartures()
.then(futureDepartures => {
let responseObj = {};
responseObj["departures"] = futureDepartures;
console.log('future +++++++', responseObj)
instance.send(instanceSendTo.departures, responseObj);
}).catch(error => {
console.log('Error fetching bus departures - repeating request in 1 minute', error);
setTimeout(() => getDepartures(), 60000)
});
}
function getDelays(){
delaysRequest.getDelays()
.then(delays => {
let responseObj = {};
responseObj["delays"] = delays;
console.log('delays -------', responseObj)
instance.send(instanceSendTo.delays, responseObj);
})
.catch(error => {
console.log('Error fetching bus delays data', error);
});
}
setTimeout(getDepartures, 30000);
setInterval(getDelays, 60000);
// let startDay = new Date().getDay();
let date = new Date().toLocaleString().split('/'); //[ '12', '6', '2022, 11:47:32 PM' ]
let startDay = date[1]; //'6'
function checkIfNewDay() {
let currentDay = new Date().toLocaleString().split('/')[1];
console.log('new day check -----',startDay, currentDay);
if(currentDay == startDay) return;
getDepartures();
startDay = currentDay;
}
//we check if day changed, if yes, we get bus departures. we check every 15 minutes
setInterval(checkIfNewDay, 900000);
function capitalizeFirstLetter(string) {
return string[0].toUpperCase() + string.slice(1);
}
};
const aodchody = [
[
"2",
"3",
"16.11.22 4:5",
"Závodu míru"
],
[
"290",
"3",
"16.11.22 4:25",
"Závodu míru"
],
[
"292",
"3",
"16.11.22 4:48",
"Závodu míru"
],
[
"296",
"3",
"16.11.22 4:58",
"Závodu míru"
],
[
"6",
"3",
"16.11.22 5:5",
"Závodu míru"
],
[
"300",
"3",
"16.11.22 5:18",
"Závodu míru"
],
[
"8",
"3",
"16.11.22 5:55",
"Závodu míru"
],
[
"16",
"3",
"16.11.22 6:30",
"Závodu míru"
],
[
"1",
"33",
"16.11.22 6:45",
"sídl. Michal škola"
],
[
"18",
"3",
"16.11.22 6:52",
"Hrušková"
],
[
"310",
"3",
"16.11.22 7:0",
"Závodu míru"
],
[
"22",
"3",
"16.11.22 7:10",
"Závodu míru"
],
[
"5",
"33",
"16.11.22 7:50",
"sídl. Michal škola"
],
[
"32",
"3",
"16.11.22 8:10",
"Závodu míru"
],
[
"7",
"33",
"16.11.22 8:25",
"sídl. Michal škola"
],
[
"100",
"3",
"16.11.22 8:30",
"Závodu míru"
],
[
"9",
"33",
"16.11.22 8:50",
"sídl. Michal škola"
],
[
"34",
"3",
"16.11.22 9:0",
"Závodu míru"
],
[
"38",
"3",
"16.11.22 9:20",
"Závodu míru"
],
[
"11",
"33",
"16.11.22 9:30",
"sídl. Michal škola"
],
[
"298",
"3",
"16.11.22 9:55",
"Závodu míru"
],
[
"2",
"7",
"16.11.22 10:10",
"Březová, aut. st."
],
[
"13",
"33",
"16.11.22 10:20",
"sídl. Michal škola"
],
[
"48",
"3",
"16.11.22 10:50",
"Závodu míru"
],
[
"50",
"3",
"16.11.22 11:13",
"Závodu míru"
],
[
"15",
"33",
"16.11.22 11:25",
"sídl. Michal škola"
],
[
"52",
"3",
"16.11.22 11:40",
"Závodu míru"
],
[
"17",
"33",
"16.11.22 11:52",
"sídl. Michal škola"
],
[
"56",
"3",
"16.11.22 12:20",
"Závodu míru"
],
[
"62",
"3",
"16.11.22 12:40",
"Závodu míru"
],
[
"64",
"3",
"16.11.22 12:55",
"Závodu míru"
],
[
"19",
"33",
"16.11.22 13:0",
"sídl. Michal škola"
],
[
"66",
"3",
"16.11.22 13:20",
"Stará ovčárna"
],
[
"21",
"33",
"16.11.22 13:35",
"sídl. Michal škola"
],
[
"23",
"33",
"16.11.22 14:0",
"sídl. Michal škola"
],
[
"72",
"3",
"16.11.22 14:5",
"Závodu míru"
],
[
"25",
"33",
"16.11.22 14:42",
"sídl. Michal škola"
],
[
"94",
"3",
"16.11.22 14:48",
"Závodu míru"
],
[
"27",
"33",
"16.11.22 15:5",
"sídl. Michal škola"
],
[
"106",
"3",
"16.11.22 15:9",
"Závodu míru"
],
[
"84",
"3",
"16.11.22 15:35",
"Závodu míru"
],
[
"29",
"33",
"16.11.22 15:35",
"sídl. Michal škola"
],
[
"6",
"7",
"16.11.22 15:50",
"Březová, aut. st."
],
[
"96",
"3",
"16.11.22 16:10",
"Závodu míru"
],
[
"31",
"33",
"16.11.22 16:10",
"sídl. Michal škola"
],
[
"4",
"7",
"16.11.22 16:25",
"Březová, aut. st."
],
[
"102",
"3",
"16.11.22 16:30",
"Závodu míru"
],
[
"302",
"3",
"16.11.22 16:44",
"Závodu míru"
],
[
"8",
"7",
"16.11.22 16:55",
"Březová, aut. st."
],
[
"108",
"3",
"16.11.22 17:5",
"Stará ovčárna"
],
[
"112",
"3",
"16.11.22 17:30",
"Závodu míru"
],
[
"114",
"3",
"16.11.22 17:53",
"Závodu míru"
],
[
"118",
"3",
"16.11.22 18:10",
"Závodu míru"
],
[
"120",
"3",
"16.11.22 18:30",
"Závodu míru"
],
[
"122",
"3",
"16.11.22 18:50",
"Závodu míru"
],
[
"124",
"3",
"16.11.22 19:15",
"Závodu míru"
],
[
"126",
"3",
"16.11.22 19:30",
"Závodu míru"
],
[
"130",
"3",
"16.11.22 19:50",
"Závodu míru"
],
[
"132",
"3",
"16.11.22 20:15",
"Závodu míru"
],
[
"134",
"3",
"16.11.22 20:45",
"Závodu míru"
],
[
"136",
"3",
"16.11.22 21:5",
"Závodu míru"
],
[
"256",
"3",
"16.11.22 21:20",
"Stará ovčárna"
],
[
"140",
"3",
"16.11.22 22:8",
"Stará ovčárna"
]
]