today/todayV3.js
2019-09-10 09:56:43 +01:00

283 lines
6.7 KiB
JavaScript

const cron = require('node-cron');
const LocalStorage = require('node-localstorage').LocalStorage;
// var nano = require('nano')('http://martind2000:1V3D4m526i@localhost:5984');
const logger = require('log4js').getLogger();
const prettyMs = require('pretty-ms');
const Sugar = require('sugar');
const calHandler = require('./lib/calHandler');
const swedishWord = require('./lib/swedishword');
const weather = require('./lib/weather');
const trains = require('./lib/trains');
const history = require('./lib/history');
const mdMailer = require('./lib/mailer');
// const mdFitbit = require('./lib/fitbit');
const todayFTSE = require('./lib/todayftse');
const quotes = require('./lib/quotes');
const euronews = require('./lib/euronews');
// var db_name = 'silvrgit';
// var dbCloudant = nano.use(db_name);
const memwatch = require('memwatch-next');
memwatch.on('leak', (info) => {
console.error('Memory leak detected:\n', info);
});
localStorage = new LocalStorage('./scratch');
logger.level = 'trace';
const credentials = {
'username': '25f854ee-1b51-49ff-acd9-5b0ff478d944-bluemix',
'password': '8e417af1b0462ca55726848846cc6b8696fc76defe9d1864cbc334be59549e0c',
'host': '25f854ee-1b51-49ff-acd9-5b0ff478d944-bluemix.cloudant.com',
'port': 443,
'url': 'https://25f854ee-1b51-49ff-acd9-5b0ff478d944-bluemix:8e417af1b0462ca55726848846cc6b8696fc76defe9d1864cbc334be59549e0c@25f854ee-1b51-49ff-acd9-5b0ff478d944-bluemix.cloudant.com',
'database': 'today'
};
const Cloudant = require('cloudant');
const cloudant = Cloudant({ 'account': credentials.username, 'password': credentials.password });
const dbCloudant = cloudant.db.use(credentials.database);
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 {
let 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;
}
};
const todayCacheSrc = {
'last': 0, 'data': {
'trains': { 'last': 0, 'data': [] },
'weather': {},
'history': [],
'today': '',
'tv': { 'entries': [] },
'cal': { 'today': [], 'tomorrow': [], 'week': [] },
'swedish': {},
'fitbit': {},
'ftse': {}
}, 'expire': ((60 * 1000) * 60)
};
let todayCache = {
'last': 0, 'data': {
'trains': { 'last': 0, 'data': [] },
'weather': {},
'history': [],
'today': '',
'tv': { 'entries': [] },
'cal': { 'today': [], 'tomorrow': [], 'week': [] },
'swedish': {},
'fitbit': {},
'ftse': {}
}, 'expire': ((60 * 1000) * 60)
};
function saveLastRunTime() {
const now = new Date();
logger.info('Logging last run...');
localStorage.setItem('lastRun', now.getTime());
}
function saveToday() {
logger.info('Saving today...');
localStorage.setItem('today', JSON.stringify(todayCache));
}
function runable() {
try {
const lastRun = localStorage.getItem('lastRun');
logger.debug('lastrun', lastRun);
const now = new Date().getTime();
const timeDiff = now - lastRun;
logger.info('last updated', prettyMs(timeDiff));
if (now - lastRun < 3600000)
return false;
else {
todayCache.last = now;
return true;
}
}
catch (e) {
logger.debug('Creating new today object.. Lets go!');
todayCache = Object.assign({}, todayCacheSrc);
todayCache.last = new Date().getTime();
return true;
}
}
async function testNews() {
await euronews.getEuroNews()
.then((d) => {
// todayCache.data.news = d;
// logger.debug(d);
// console.log();
h = euronews.render(d.items);
let html = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
${h}
</body>
</html>`;
logger.debug(html);
})
.catch((e) => {
logger.error(e);
});
}
async function preLoadToday() {
function compare(a, b) {
if (a.ts < b.ts)
return -1;
if (a.ts > b.ts)
return 1;
return 0;
}
logger.debug('preload');
todayCache.data.cal = { 'today': [], 'tomorrow': [], 'week': [] };
await weather.newDoGetWeather()
.then((d) => {
todayCache.data.weather = d;
})
.catch((e) => {
logger.error(e);
});
await 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);
});
await history.updateHistory()
.then((d) => {
'use strict';
console.log('History result: ', d);
todayCache.data.history = d;
})
.catch((e) => {
'use strict';
console.error(e);
});
await 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);
});
await todayFTSE.getFTSE()
.then((d) => {
todayCache.data.ftse = d;
})
.catch((e) => {
logger.error(e);
});
await quotes.GetQuotes()
.then((d) => {
todayCache.data.quotes = d;
})
.catch((e) => {
logger.error(e);
});
for (const item of calHandler.calendars)
await calHandler.getAdvancedCalV3(item)
.then((d) => {
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);
});
console.log('>> SORT!!');
todayCache.data.cal.today = todayCache.data.cal.today.sort(compare);
todayCache.data.cal.tomorrow = todayCache.data.cal.tomorrow.sort(compare);
todayCache.data.cal.week = todayCache.data.cal.week.sort(compare);
await swedishWord.getSwedishWord()
.then((d) => {
'use strict';
logger.debug('Got swedish...');
todayCache.data.swedish = d;
})
.catch((e) => {
'use strict';
logger.error(e);
});
await euronews.getEuroNews()
.then((d) => {
todayCache.data.news = d;
})
.catch((e) => {
logger.error(e);
});
await saveToday();
}
// saveLastRunTime();
setTimeout(function () {
// loadData();
if (runable()) {
logger.trace('Runable');
preLoadToday();
// testNews();
}
// Module.exports.preLoadToday();
}, 5000);