/** * 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'), dateFormat = require('dateformat'); var jsonfile = require('jsonfile'), fs = require('fs'), STRING = require('string'); var log4js = require('log4js'); var logger = log4js.getLogger(); var calHandler = require('./calHandler'); var swedishWord = require('./swedishword'); var todayCache = { last: 0, data: { trains: {last: 0, data: []}, weather: {}, history: [], today: '', tv:{entries:[]}, cal:{entries:[]}, swedish:{} }, expire: ((60 * 1000) * 60) }; 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 = __dirname + '/' + 'newdata.json'; var htmlfile = __dirname + '/' + 'today.html'; function saveData() { logger.info('Saving...'); jsonfile.writeFileSync(file, todayCache); } function nth(d) { if (d > 3 && d < 21) return 'th'; // thanks kennebec switch (d % 10) { case 1: return "st"; case 2: return "nd"; case 3: return "rd"; default: return "th"; } } function dayNumber() { var now = new Date(); var start = new Date(now.getFullYear(), 0, 0); var diff = now - start; var oneDay = 1000 * 60 * 60 * 24; return Math.floor(diff / oneDay); } /** * @return {number} */ function DayDiff(CurrentDate) { var TYear = CurrentDate.getFullYear(); var TDay = new Date("January, 01, " + (parseInt(TYear) + 1)); TDay.getFullYear(TYear); var DayCount = (TDay - CurrentDate) / (1000 * 60 * 60 * 24); DayCount = Math.round(DayCount); return (DayCount); } 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 = { getClock: function(req, res) { // console.log(todayCache); res.render('pages/clock', todayCache); }, getToday: function (req, res) { console.log(todayCache); res.render('pages/today', todayCache); }, getData: function(req, res) { res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify(todayCache)); }, getTodayDate: function () { var s, d = new Date(); todayCache.data.history = []; s = '' + dateFormat(d, "mmmm d") + ' - '; s = s + 'The ' + dayNumber() + nth(dayNumber) + ' day of ' + dateFormat(d, "yyyy") + ', and there are ' + DayDiff(d) + ' days left until the end of the year.'; logger.debug(s); todayCache.data.today = s; }, getTechHistory: 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.computerhistory.org/tdih/', month, '/', day].join(''); logger.info(url); request(url, function (err, resp, body) { if (err) throw err; $ = cheerio.load(body); var tdihbody = $('#tdihbody'); var output = []; tdihbody.find('.tdihevent > p').each(function (div) { var s = $(this).text(); output.push(STRING(s).collapseWhitespace().s); }); todayCache.data.history = todayCache.data.history.concat(output); console.log(todayCache.data.history); }); }, 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 = todayCache.data.history.concat(output); console.log(todayCache.data.history); module.exports.getTechHistory(); }); }, 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 flag=false; for (var j = 0; j < todayCache.data.trains.data.length;j++) { flag = _.isEqual(todayCache.data.trains.data[j], outputArray[i]) } if (!flag) { 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; var tempMin = parseInt(data.daily.data[0].temperatureMin); var tempMax = parseInt(data.daily.data[0].temperatureMax); j.currently = data.currently.summary; j.today = data.daily.data[0].summary; j.later = data.daily.summary; j.alerts = data.alerts || {}; j.data = data; var fs = STRING(j.currently).endsWith('.') ? '' : '.'; if (tempMax == tempMin) { j.currently += fs + ' Around ' + tempMin.toString() + ' degrees.'; } else { j.currently += fs + ' Around ' + tempMin.toString() + ' to ' + tempMax.toString() + ' degrees.'; } todayCache.data.weather = j; }); }, refreshTrainAndWeather:function() { try { module.exports.doGetWeatherOutlook(); } catch (e) { // statements to handle any exceptions logger.error(e); } try { module.exports.updateTrains(); } catch (e) { // statements to handle any exceptions logger.error(e); } }, preLoadToday: function () { module.exports.getTodayDate(); var self = this; try { module.exports.doGetWeatherOutlook(); } catch (e) { // statements to handle any exceptions logger.error(e); } try { module.exports.updateTrains(); } catch (e) { // statements to handle any exceptions logger.error(e); } try { module.exports.getHistory(); } catch (e) { // statements to handle any exceptions logger.error(e); } try { calHandler.getSimpleCalV2('http://www.pogdesign.co.uk/cat/download_ics/60cfdff469d0490545d33d7e3b5c0bcc', function(v) { todayCache.data.tv = v; }); } catch (e) { logger.error(e); } try { calHandler.getSimpleCalV2('https://calendar.google.com/calendar/ical/martind2000%40gmail.com/private-40cfebc9f7dcfa7fde6b9bf2f0092c93/basic.ics', function(v) { todayCache.data.cal.entries = todayCache.data.cal.entries.concat(v.entries) ; }); } catch (e) { logger.error(e); } try { calHandler.getSimpleCalV2('https://calendar.google.com/calendar/ical/mt5pgdhknvgoc8usfnrso9vkv0%40group.calendar.google.com/private-58876002af9f302a593acfa6fa792dcf/basic.ics', function(v) { todayCache.data.cal.entries = todayCache.data.cal.entries.concat(v.entries) ; }); } catch (e) { logger.error(e); } try { calHandler.getSimpleCalV2('https://www.tripit.com/feed/ical/private/DB96E4BB-94A9BD8F9CC1CF51C6CC0D920840F4F5/tripit.ics', function(v) { todayCache.data.cal.entries = todayCache.data.cal.entries.concat(v.entries) ; }); } catch (e) { logger.error(e); } try { swedishWord.getSwedishWord(function(v) { todayCache.data.swedish = v ; }); } catch (e) { logger.error(e); } // word of the day http://wotd.transparent.com/rss/swedish-widget.xml?t=1455840000000 // time stamp } } ; function sendEmailV1() { var now = new Date(); var email = { to: 'martind2000@gmail.com', subject: 'Today - ' + dateFormat(now, "dddd, mmmm dS, yyyy") }; var template = {file: __dirname + '/' + 'jade/today.jade', locals: todayCache}; logger.debug(__dirname); logger.debug(__dirname.substr(__dirname.lastIndexOf('/'), __dirname.length)); //if (__dirname.substr(__dirname.lastIndexOf('/'),__dirname.length)) mailer.sendTemplate(email, template, function (err) { if (err) throw err; console.log('compiled template email sent'); }); // saveData(); var fn = jade.compileFile(template.file); console.log(fn(todayCache)); // fs.writeFileSync(htmlfile, fn(todayCache)); } function sendEmail() { logger.log('Simple email'); var now = new Date(); var email = { to: 'martind2000@gmail.com', subject: 'Today - ' + dateFormat(now, "dddd, mmmm dS, yyyy") }; /* mailer.sendText(email, 'Look at this fantastic email body!', function (err) { if (err) throw err; console.log('email sent!'); }); */ saveData(); } setTimeout(function () { module.exports.preLoadToday(); }, 15000); setTimeout(function () { sendEmailV1(); }, 45000); cron.schedule('45 6 * * *', function () { module.exports.preLoadToday(); return -1; }); cron.schedule('0 */1 * * *', function () { module.exports.refreshTrainAndWeather(); return -1; }); cron.schedule('0 7 * * *', function () { sendEmailV1(); // console.log('tick'); return -1; });