/** * Created by marti on 30/01/2016. */ var http = require('http'), request = require('request'), cheerio = require( 'cheerio'), util = require('util'), cron = require('node-cron'); var dateFormat = require('dateformat'); var jsonfile = require('jsonfile'), fs = require('fs'); var nano = require('nano')('http://martind2000:1V3D4m526i@localhost:5984'); var log4js = require('log4js'); var logger = log4js.getLogger(); var calHandler = require('./today/calHandler'); var swedishWord = require('./today/swedishword'); var weather = require('./today/weather'); var trains = require('./today/trains'); var history = require('./today/history'); var mdMailer = require('./today/mailer'); var mdFitbit = require('./today/fitbit'); var todayFTSE = require('./today/todayftse'); var quotes = require('./today/quotes'); var db_name = 'silvrgit'; var dbCouch = nano.use(db_name); require('sugar-date'); String.prototype.hashCode = function() { if (Array.prototype.reduce) { return this.split('').reduce(function(a,b) {a = ((a << 5) - a) + b.charCodeAt(0);return a & a},0); } else { var hash = 0, i, chr, len; if (this.length == 0) return hash; for (i = 0, len = this.length; i < len; i++) { chr = this.charCodeAt(i); hash = ((hash << 5) - hash) + chr; hash |= 0; // Convert to 32bit integer } return hash; } }; var todayCache = { last: 0, data: { trains: {last: 0, data: []}, weather: {}, history: [], today: '', tv: {entries: []}, cal: {today: [], tomorrow: [], week: []}, swedish: {}, fitbit: {}, ftse: {} }, expire: ((60 * 1000) * 60) }; var file = __dirname + '/' + 'newdata.json'; var htmlfile = __dirname + '/' + 'today.html'; var eventEmitter; function runable() { try { var now = new Date().getTime(); console.log('last updated', ((now - todayCache.last) / 60000)); if (now - todayCache.last < 3600000) { return false; } else { todayCache.last = now; return true; } } catch (e) { todayCache.last = new Date().getTime(); return true; } } function broadcastWeather() { const wData = { temperature: todayCache.data.weather.data.currently.temperature, icon: todayCache.data.weather.data.currently.icon, summary: todayCache.data.weather.data.currently.summary }; if (todayCache.data.weather.data.hasOwnProperty('alerts')) { wData.alerts = todayCache.data.weather.data.alerts; } eventEmitter.emit('sendSocket', {id: 'weather', data: wData}); } function loadData() { console.log('Loading old data'); try { todayCache = jsonfile.readFileSync(file); } catch (e) { console.error('Could not load previous data'); } } function saveData() { todayCache.last = new Date().getTime(); logger.info('Saving...'); jsonfile.writeFileSync(file, todayCache); } function saveToDB(data) { saveData(); logger.debug('Inserting into couch...'); // Logger.info(util.inspect(obj)); dbCouch.insert(data, function(err, body, header) { if (err) { logger.error('Error inserting into couch'); logger.error(err); return; } }); } function nth(d) { // If (d > 3 && d < 21) {return 'th';} // Thanks kennebec // if (d % 10 === 1) {return 'st';} else if (d % 10 === 2) {return 'nd';} else if (d % 10 === 3) {return 'rd';} else {return 'th';} var n = d; return Math.floor(n / 10) === 1 ? 'th' : (n % 10 === 1 ? 'st' : (n % 10 === 2 ? 'nd' : (n % 10 === 3 ? 'rd' : '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); } function breakDay() { var now = new Date(); return { year: now.getFullYear(), month: parseInt(now.getMonth()) + 1, day: now.getDate() }; } function reduceTrains(d) { var titles = [], ta = []; console.log('reducetrains',d); for (var items in d) { if (typeof d[items].title !== 'undefined') { var hash = d[items].title.hashCode(); if (titles.indexOf(hash) === -1) { titles.push(hash); ta.push(d[items]); } } } return ta; } /** * @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); var d = new Date(); DayCount = d.daysSince('beginning of this year'); 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 = { setEmitter: function(newEmitter) { console.log('Setting events', newEmitter); eventEmitter = newEmitter; }, getClock: function(req, res) { // Console.log(todayCache); res.render('pages/clock', todayCache); }, getToday: function(req, res) { logger.info(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(), nextYear = (parseInt(d.getFullYear()) + 1).toString() + '-01-01'; console.log(d.daysUntil('beginning of next year')); var daysSinceStart = d.daysSince('beginning of this year'); var daysRemaining = d.daysUntil('beginning of next year'); todayCache.data.history = []; s = '' + d.format('{Weekday} {Month} {dd}, {yyyy}') + ' - '; s = s + 'The ' + daysSinceStart + nth(daysSinceStart) + ' day of ' + dateFormat( d, 'yyyy') + ', and there are ' + daysRemaining + ' days left until the end of the year.'; logger.debug(s); todayCache.data.today = s; }, refreshTrain: function() { var self = this; trains.updateTrains() .then((d) => { 'use strict'; d = reduceTrains(d); console.log('Trains: ', d); eventEmitter.emit('sendSocket', {id: 'trains', data: d}); todayCache.data.trains.data = d; todayCache.data.trains.last = new Date(); }) .catch((e)=> { 'use strict'; console.error(e); }); }, refreshWeather: function() { weather.newDoGetWeather() .then((d) => { todayCache.data.weather = d; console.log('Updating weather'); broadcastWeather(); }).catch((e) => { logger.error(e); }); }, refreshTrainAndWeather: function() { this.refreshTrain(); this.refreshWeather(); }, preLoadToday: function() { module.exports.getTodayDate(); todayCache.data.cal = {today: [], tomorrow: [], week: []}; weather.newDoGetWeather() .then((d)=> { todayCache.data.weather = d; }) .catch((e) => { logger.error(e); }); trains.updateTrains() .then((d) => { 'use strict'; console.log('Trains: ', d); todayCache.data.trains.data = d; todayCache.data.trains.last = new Date(); }) .catch((e)=> { 'use strict'; console.error(e); }); history.updateHistory() .then((d) => { 'use strict'; console.log('History result: ', d); todayCache.data.history = d; }) .catch((e)=> { 'use strict'; console.error(e); }); calHandler.getSimpleCalV3( 'http://www.pogdesign.co.uk/cat/download_ics/60cfdff469d0490545d33d7e3b5c0bcc') .then((d) => { 'use strict'; todayCache.data.tv = d; }) .catch((e) => { 'use strict'; logger.error(e); }); todayFTSE.getFTSE() .then((d) => { todayCache.data.ftse = d; }) .catch((e) => { logger.error(e); }); quotes.GetQuotes() .then((d) => { todayCache.data.quotes = d; }) .catch((e)=> { logger.error(e); }); for (var t = 0; t < calHandler.calendars.length; t++) { calHandler.getAdvancedCalV3(calHandler.calendars[t]) .then((d) => { 'use strict'; todayCache.data.cal.today = todayCache.data.cal.today.concat(d.today); todayCache.data.cal.tomorrow = todayCache.data.cal.tomorrow.concat(d.tomorrow); todayCache.data.cal.week = todayCache.data.cal.week.concat(d.week); }) .catch((e) => { 'use strict'; logger.error(e); }); } swedishWord.getSwedishWord() .then((d) => { 'use strict'; console.log('Swedish result: ', d); todayCache.data.swedish = d; }) .catch((e)=> { 'use strict'; console.error(e); }); mdFitbit.getYesterdayFitbit() .then((d) => { todayCache.data.fitbit = d; }) .catch((e)=> { 'use strict'; console.error(e); }); todayCache.date = breakDay(); }, broadcast: function() { console.log('BROADCAST'); broadcastWeather(); eventEmitter.emit('sendSocket', {id: 'trains', data: todayCache.data.trains.data}); } }; setTimeout(function() { loadData(); if (runable()) { module.exports.preLoadToday(); } //Module.exports.preLoadToday(); }, 5000); setTimeout(function() { // mdMailer.sendEmailV1(todayCache, __dirname); // saveToDB(todayCache); saveData(); }, 45000); setInterval(function() { // EventEmitter.emit('sendSocket',{id:'weather',data:todayCache.data.weather}); // broadcastWeather(); // eventEmitter.emit('sendSocket', {id: 'trains', data: todayCache.data.trains.data}); }, (60000)); cron.schedule('45 6 * * *', function() { if (runable()) { module.exports.preLoadToday(); } return -1; }); cron.schedule('0 */1 * * *', function() { // Module.exports.refreshTrainAndWeather(); // this.refreshTrain(); module.exports.refreshWeather(); return -1; }); cron.schedule('*/15 * * * *', function() { module.exports.refreshTrain(); // Module.exports.refreshWeather(); return -1; }); cron.schedule('0 7 * * *', function() { mdMailer.sendEmailV1(todayCache, __dirname); saveToDB(todayCache); // Console.log('tick'); return -1; });