/** * Created by marti on 30/01/2016. */ var http = require('http'), request = require('request'), cheerio = require('cheerio'), Forecast = require('forecast.io'), util = require('util'), UltraSES = require('ultrases'), cron = require('node-cron'); var jade = require('jade'), _ = require('lodash'); var jsonfile = require('jsonfile'); var todayCache = { last: 0, data: { trains: {last: 0, data: []}, weather: {}, history: [] }, expire: ((60 * 1000) * 60) * 1 }; var trainList = [ {id: 'dbeglq', url: 'http://www.journeycheck.com/scotrail/route?from=DBE&to=GLQ&action=search&savedRoute='}, {id: 'glqdbe', url: 'http://www.journeycheck.com/scotrail/route?from=GLQ&to=DBE&action=search&savedRoute='} ]; //https://api.forecast.io/forecast/0657dc0d81c037cbc89ca88e383b6bbf/55.8582846,-4.2593033?units=uk2 var forecastOptions = { APIKey: '0657dc0d81c037cbc89ca88e383b6bbf', units: 'uk2' }; var mailer = new UltraSES({ aws: { accessKeyId: 'AKIAJWJS75F7WNCGK64A', secretAccessKey: '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', "region": "eu-west-1" }, defaults: { from: 'Martin Donnelly ' } }); var file = 'data.json'; function saveData() { jsonfile.writeFileSync(file, todayCache); } Array.prototype.indexOfOld = Array.prototype.indexOf Array.prototype.indexOf = function (e, fn) { if (!fn) { return this.indexOfOld(e) } else { if (typeof fn === 'string') { var att = fn; fn = function (e) { return e[att]; } } return this.map(fn).indexOfOld(e); } }; module.exports = { getToday: function (req, res) { res.render('pages/today', todayCache); }, getHistory: function () { var url, d, day, month, monthNames = ["january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"]; d = new Date(); month = monthNames[d.getMonth()]; day = d.getDate(); url = ['http://www.bbc.co.uk/scotland/history/onthisday/', month, '/', day].join(''); console.log(url); request(url, function (err, resp, body) { if (err) throw err; $ = cheerio.load(body); var body = $('DIV#bbcPageContent').first(); var output = []; body.find('.story > p').each(function (div) { var s = $(this).text(); if (s.indexOf('Today\'s recipe:') == -1) { output.push(s); } }); todayCache.data.history = output; console.log(todayCache.data.history); }); }, getTrainUpdates: function (id) { console.log('Getting train events...'); var url = trainList[id].url; var now = new Date(); var outputArray = []; // if ((now - eventCache.last) > eventCache.expire) { request(url, function (err, resp, body) { if (err) throw err; $ = cheerio.load(body); var lu = $('DIV#LU').first(); var us = lu.find('.updatesSection').first(); us.find('.updateTitle').each(function (div) { var wO = {title: '', description: ''}; title = $(this).find('A').first().text().trim(); wO.title = title; outputArray.push(wO); }); us.find('.updateBodyStart').each(function (div) { var description = $(this).find('.bodyInner').first().find('.primaryStyle').first().text().trim(); var splitDesc = description.split('\r\n'); var wa = []; for (var i = 0; i < splitDesc.length; i++) { var contentCheck = splitDesc[i].trim(); if (contentCheck.indexOf('Impact') > -1) contentCheck = ''; if (contentCheck.indexOf('Additional Information') > -1) contentCheck = ''; if (contentCheck.indexOf('apologise for the delay') > -1) contentCheck = ''; if (contentCheck.indexOf('Delay Repay') > -1) contentCheck = ''; if (contentCheck.length > 0) wa.push(contentCheck); } description = wa.join(' '); outputArray[div].description = description; }); // join arrays for (var i = 0; i < outputArray.length; i++) { var p = todayCache.data.trains.data.indexOf(outputArray[i].title); console.log('P: ' + p); todayCache.data.trains.data.push(outputArray[i]) } todayCache.data.trains.data = _.uniq(todayCache.data.trains.data); }); todayCache.data.trains.last = now; }, updateTrains: function () { console.log('Updating trains..'); todayCache.data.trains.data = []; module.exports.getTrainUpdates(0); module.exports.getTrainUpdates(1); }, doGetWeatherOutlook: function () { console.log('Retrieving weather..'); var j = {}; var forecast = new Forecast(forecastOptions); forecast.get(55.8582846, -4.2593033, {units: 'uk2'}, function (err, res, data) { if (err) throw err; j.currently = data.currently.summary; j.today = data.daily.summary; j.alerts = data.alerts || {}; todayCache.data.weather = j; }); }, preLoadToday: function () { try { module.exports.doGetWeatherOutlook(); } catch (e) { // statements to handle any exceptions console.log('ERROR:'); console.log(e); } try { module.exports.updateTrains(); } catch (e) { // statements to handle any exceptions console.log('ERROR:'); console.log(e); } setTimeout(function () { module.exports.preLoadToday(); }, todayCache.expire); } } ; function sendEmail() { var email = { to: 'martind2000@gmail.com', subject: 'Today' }; var template = {file: 'jade/today.jade', locals: todayCache}; mailer.sendTemplate(email, template, function (err) { if (err) throw err; console.log('compiled template email sent'); }); /* console.log(JSON.stringify(todayCache));*/ var fn = jade.compileFile(template.file); console.log(fn(todayCache)); } setTimeout(function () { // console.log('Pre loading trains...'); module.exports.preLoadToday(); }, 15000); setTimeout(function () { // console.log('Pre loading trains...'); module.exports.getHistory(); }, 25000); setTimeout(function () { // console.log('Pre loading trains...'); saveData(); sendEmail(); }, 45000); cron.schedule('45 6 * * *', function () { module.exports.getHistory(); return -1; }); cron.schedule('0 7 * * *', function () { sendEmail(); // console.log('tick'); return -1; });