// train.js const request = require('request'); const http = require('http'); const cheerio = require('cheerio'); // const STRING = require('string'); const logger = require('log4js').getLogger('train'); const trainCache = { 'last': {}, 'data': {} }; // logger.level = 'debug'; function getTrainTimes(req, res) { // console.log(req); logger.info(`getTrainTimes: ${ JSON.stringify(req.query)}`); if (req.query.hasOwnProperty('from') && req.query.hasOwnProperty('from')) { const url = `/all/${ req.query.from }/to/${ req.query.to }/10?accessToken=215b99fe-b237-4a01-aadc-cf315d6756d8`; Query(function (a, b) { res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify(a)); }, res, 'huxley.apphb.com', url); } else { res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({})); } } function getNextTrainTimes(req, res) { logger.info(`getNextTrainTimes: ${ JSON.stringify(req.query)}`); let trainFrom, trainTo, trainToken, url; if (req.query.hasOwnProperty('from') && req.query.hasOwnProperty('from')) { trainFrom = req.query.from; trainTo = req.query.to; trainToken = trainFrom + trainTo; url = `/next/${ trainFrom }/to/${ trainTo }/1?accessToken=215b99fe-b237-4a01-aadc-cf315d6756d8`; logger.info(`Requesting latest time for : ${ trainToken}`); const now = new Date(); const nowSeconds = (now.getHours() * (60 * 60)) + (now.getMinutes() * 60); logger.info(`Now Seconds: ${ nowSeconds}`); if (trainCache.last[trainToken] === null || nowSeconds !== trainCache.last[trainToken]) Query(function (a, b) { const output = {}; const ts = a.departures[0].service; if (ts !== null) { // console.log(ts); // GLOBAL.lastcheck = now; logger.debug(ts.sta, ts.std); // logger.debug(toSeconds(ts.sta)); output.sta = (ts.sta !== null) ? ts.sta : ts.std; output.eta = (ts.eta !== null ? ts.eta : ts.etd); // trainCache.last.glqdbe = toSeconds(ts.sta); // console.log(ts); } else { logger.warn('*** NO SERVICE'); output.sta = 'No Service'; output.eta = 'No Service'; } trainCache.data[trainToken] = output; res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify(trainCache.data[trainToken])); }, res, 'huxley.apphb.com', url); } } function getRoute(req, res) { logger.info(`getRoute: ${ JSON.stringify(req.query)}`); let routeID; let data = {}; if (req.query.hasOwnProperty('route')) { routeID = req.query.route; Query(function (a, b) { if (a !== null && a.message === null) data = a; res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify(data)); }, res, 'huxley.apphb.com', `/service/${ routeID }?accessToken=215b99fe-b237-4a01-aadc-cf315d6756d8`); } } function grabNews(q) { const url = `http://nationalrail.co.uk/service_disruptions/${ q }`; logger.debug(url); return new Promise(function(resolve, reject) { request(url, function(err, resp, body) { if (err) // Logger.error(err); return reject(err); // Throw err; // logger.debug(body); const $ = cheerio.load(body); const nbody = $('.zebra').first().html(); logger.debug(nbody); return resolve(nbody); }, function(error, response, body) { if (response.statusCode !== 200) { logger.error(response.statusCode); logger.error(body); return reject(error); } }); }); } function getNews(req, res) { logger.info(`getNews: ${ JSON.stringify(req.query)}`); if (req.query.hasOwnProperty('q')) { const q = req.query.q; grabNews(q) .then((d) => { res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({ 'd':d })); }); } } module.exports = { getTrainTimes, getNextTrainTimes, getRoute, getNews }; function toSeconds(inval) { console.log('inval', typeof inval); if (typeof inval === 'string') { const a = inval.split(':'); return ((parseInt(a[0]) * (60 * 60)) + (parseInt(a[1]) * 60)); } return ''; } function Query(callback, r, host, path) { logger.debug(path); const req = r; const options = { 'host': host, // port: 80, 'path': path, // method: 'GET', 'headers': {} }; try { http.request(options).on('response', function (response) { let data = ''; response.on('data', function (chunk) { data += chunk; }); response.on('end', function () { callback(JSON.parse(data), r); }); response.on('error', function (e) { console.error(e); }); }).end(); } catch (e) { console.log(e); } }