lot/lot.js
2017-09-08 10:45:53 +01:00

634 lines
14 KiB
JavaScript

#!/usr/bin/env node
const jsonfile = require('jsonfile'),
https = require('https'),
UltraSES = require('ultrases'), cron = require('node-cron');
const Sugar = require('sugar-date');
const file = 'data/data.json';
const m = [],
prev = [],
mo = [],
star = [],
trip = [],
results = [];
let line = [];
let re = [];
let resultsObj = {};
const mailer = new UltraSES({
'aws': {
'accessKeyId': 'AKIAJWJS75F7WNCGK64A',
'secretAccessKey': '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',
'region': 'eu-west-1'
},
'defaults': {
'from': 'Martin Donnelly <martind2000@gmail.com>'
}
});
function $(elm) {
return document.getElementById(elm);
}
function resultsQuery(callback) {
/* var options = {
host: 'nunofcguerreiro.com',
path: '/api-euromillions-json',
port: 443,
headers: {
accept: '*!/!*'
/!* 'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(data)*!/
},
method: 'GET'
};*/
const options = {
'host': 'euromillions.p.mashape.com',
'path': '/ResultsService/FindLast',
//port: 443,
'headers': {
'accept': 'text/plain',
'X-Mashape-Key': '5A0H980jK6mshSFL24ZmfiRrNHV2p1d1fhQjsngtx8QWuO9oe4'
/* 'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(data)*/
},
'method': 'GET'
};
/*
unirest.get("https://euromillions.p.mashape.com/ResultsService/FindLast")
.header("X-Mashape-Key", "5A0H980jK6mshSFL24ZmfiRrNHV2p1d1fhQjsngtx8QWuO9oe4")
.header("Accept", "text/plain")
.end(function (result) {
console.log(result.status, result.headers, result.body);
});
*/
https.request(options).on('response', function (response) {
let data = '';
response.on('data', function (chunk) {
data += chunk;
});
response.on('end', function () {
//console.log(data);
callback(JSON.parse(data));
});
}).end();
}
function sortNumber(a, b) {
return a - b;
}
function dynamicSort(property) {
let sortOrder = 1;
if (property[0] === '-') {
sortOrder = -1;
property = property.substr(1);
}
return function (a, b) {
const result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
return result * sortOrder;
};
}
function buildArray() {
for (let x = 0; x < 51; x++) {
const l = [];
for (let y = 0; y < 51; y++)
l.push(0);
m[x] = l;
}
}
function buildTable() {
const area = $('area');
// clean area.
/* while (area.lastChild) {
area.removeChild(area.lastChild);
}
*/
const table = document.createElement('table');
var row = document.createElement('tr');
var cell = document.createElement('td');
var p = document.createTextNode('---');
cell.appendChild(p);
row.appendChild(cell);
for (var x = 1; x < 50; x++) {
var cell = document.createElement('td');
var p = document.createTextNode(x);
cell.appendChild(p);
row.appendChild(cell);
}
table.appendChild(row);
/**
*
*/
for (let y = 0; y < 51; y++) {
var row = document.createElement('tr');
var cell = document.createElement('td');
var p = document.createTextNode(`[${ parseInt(y + 1) }]`);
cell.appendChild(p);
row.appendChild(cell);
for (var x = 1; x < 51; x++) {
var cell = document.createElement('td');
var p = document.createTextNode(m[y][x - 1]);
cell.appendChild(p);
row.appendChild(cell);
}
table.appendChild(row);
}
area.appendChild(table);
}
function calc() {
let i = 0;
for (i = 0; i < re.length - 1; i++) {
console.log(re[i]);
for (let s = 1; s < 6; s++) {
const cv = re[i][s];
console.log(`row: ${ cv}`);
for (let n = 1; n < 6; n++)
if (n != s) {
workVal = re[i][n];
console.log(workVal);
m[cv - 1][workVal - 1]++;
}
}
}
buildTable();
}
function othercalc() {
let i = 0;
// var p = 1 / ((-1)*re.length);
const p = 1.0 / (re.length);
console.log('P', p);
for (i = 0; i < re.length - 1; i++) {
console.log((p * i));
// console.log(re[i]);
for (let s = 1; s < 6; s++) {
const cv = re[i][s];
// console.log("row: " + cv);
for (let n = 1; n < 6; n++)
if (n != s) {
workVal = re[i][n];
// console.log(workVal);
// m[cv-1][workVal-1]++;
let flag = false;
for (var t = 0; t < mo.length; t++)
if (mo[t].a == cv && mo[t].b == workVal) {
if (typeof mo[t].c === 'undefined' || mo[t].c == null)
mo[t].c = 0;
mo[t].c++;
flag = true;
// mo[t].v++;
/*
if (i < (re.length/2))
mo[t].v = mo[t].v - (p * i)
else
*/
// original weighting
//mo[t].v = mo[t].v + (p * i);
//reverse weighting..
mo[t].v = mo[t].v + (1 - (p * i));
console.log(mo[t], 1 - (p * i));
//;
//mo[t].v = mo[t].v + 1;
// ;
}
if (!flag)
mo.push({
'a': cv,
'b': workVal,
'v': 1
});
}
}
}
console.log('******************************************');
mo.sort(dynamicSort('v'));
//for (var t = (mo.length - 20); t < mo.length; t++) {
var t = mo.length - 1;
while (line.length < 5) {
if (line.indexOf(mo[t].a) == -1 && line.length < 5)
line.push(mo[t].a);
if (line.indexOf(mo[t].b) == -1 && line.length < 5)
line.push(mo[t].b);
t = t - 1;
}
// console.log(line);
console.log(line.sort());
resultsObj.mainline = line.sort();
resultsObj.otherLine = [];
resultsObj.otherLine.push(mo[mo.length - 1].a);
resultsObj.otherLine.push(mo[mo.length - 1].b);
for (var t = mo.length - 1; t > (mo.length - 3); t--)
// if (mo[t].v >= 3) {
if (mo[t].v > 1)
console.log(`${mo[t].a }, ${ mo[t].b }, ${ mo[t].v}`);
// buildTable();
}
function tripCalc() {
const blist = [[0, 1, 2], [0, 1, 3], [0, 1, 4], [0, 2, 3], [0, 2, 4], [0, 3, 4], [1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]];
const p = 1.0 / (re.length);
let a, b, c, cur;
//var trip = [];
//console.log
for (i = 0; i < re.length - 1; i++)
for (let t = 0; t < blist.length; t++) {
cur = blist[t];
a = re[i][cur[0] + 1];
b = re[i][cur[1] + 1];
c = re[i][cur[2] + 1];
// console.log(a + ", " + b + "," + c);
let found = false;
for (y = 0; y < trip.length; y++) {
const nums = trip[y].nums;
if (!found)
if ((nums.indexOf(a) != -1) && (nums.indexOf(b) != -1) && (nums.indexOf(c) != -1)) {
/* console.log("nums:" + nums);
console.log("want: " + a + ", " + b + "," + c);
console.log("A:" + nums.indexOf(a));
console.log("B:" + nums.indexOf(b));
console.log("C:" + nums.indexOf(c));
*/
trip[y].cnt = trip[y].cnt + (p * i);
// trip[y].cnt = trip[y].cnt + 1;
// console.log(">>>" + trip[y].cnt);
found = true;
}
}
if (!found)
//trip.push({nums:[a,b,c],cnt:(p * i)});
trip.push({
'nums': [a, b, c],
'cnt': 1
});
}
let max = 0;
for (y = 0; y < trip.length; y++)
if (trip[y].cnt > max) max = trip[y].cnt;
console.log(`Max: ${ max}`);
for (y = 0; y < trip.length; y++)
if (trip[y].cnt == max) {
console.log(`${trip[y].cnt }, ${ trip[y].nums}`);
resultsObj.otherLine = resultsObj.otherLine.concat(trip[y].nums).sort();
}
// console.log(JSON.stringify(trip));
}
function starcalc() {
let i = 0;
const p = 1 / re.length;
for (i = 0; i < re.length - 1; i++)
// console.log(re[i]);
for (let s = 6; s < 8; s++) {
const cv = re[i][s];
// console.log("row: " + cv);
for (let n = 6; n < 8; n++)
if (n != s) {
workVal = re[i][n];
// console.log(workVal);
// m[cv-1][workVal-1]++;
let flag = false;
for (var t = 0; t < mo.length; t++)
if (mo[t].a == cv && mo[t].b == workVal) {
flag = true;
mo[t].v++;
mo[t].v = mo[t].v + (p * i);
}
if (!flag)
mo.push({
'a': cv,
'b': workVal,
'v': 1
});
}
}
console.log('******************************************');
mo.sort(dynamicSort('v'));
var t = mo.length - 1;
const starOutput = [];
starOutput.push(mo[t].a);
starOutput.push(mo[t].b);
resultsObj.mainstars = [];
resultsObj.mainstars.push(starOutput.sort()[0]);
resultsObj.mainstars.push(starOutput.sort()[1]);
resultsObj.otherStars = [];
resultsObj.otherStars.push(mo[mo.length - 3].a);
resultsObj.otherStars.push(mo[mo.length - 3].b);
//console.log('Stars: ' + mo[t].a + ', ' + mo[t].b);
console.log(`Stars: ${ starOutput.sort()[0] }, ${ starOutput.sort()[1]}`);
for (var t = mo.length - 6; t < mo.length; t++)
if (mo[t].v >= 3)
console.log(`${mo[t].a }, ${ mo[t].b }, ${ mo[t].v}`);
// buildTable();
}
function performCalcs() {
buildArray();
//buildTable();
othercalc();
console.log('---------------------------------------');
starcalc();
tripCalc();
}
function prepareResults() {
resultsObj.mainline = resultsObj.mainline.sort(sortNumber);
resultsObj.otherLine = resultsObj.otherLine.sort(sortNumber);
resultsObj.mainstars = resultsObj.mainstars.sort(sortNumber);
resultsObj.otherStars = resultsObj.otherStars.sort(sortNumber);
}
function saveData() {
jsonfile.writeFileSync(file, re);
}
function sendEmail() {
const email = {
'to': 'martind2000@gmail.com',
'subject': 'Todays numbers'
};
const template = {'file': './jade/output.jade', 'locals': resultsObj};
mailer.sendTemplate(email, template, function(err) {
if(err) throw err;
console.log('compiled template email sent');
});
}
function processData(data) {
newArray.push(data.drawns[0].date);
numbers = data.drawns[0].numbers.split(' ');
for (var i = 0; i < numbers.length; ++i)
numbers[i] = parseInt(numbers[i]);
stars = data.drawns[0].stars.split(' ');
for (var i = 0; i < stars.length; ++i)
stars[i] = parseInt(stars[i]);
newArray = newArray.concat(numbers);
newArray = newArray.concat(stars);
re.unshift(newArray);
}
function processDataV2(data) {
const newArray = [];
let numbers, stars, date;
console.log(data);
date = /(\/Date\()([0-9]+)([\s\S]+)/.exec(data.Date);
const newdate = Sugar.Date.format(new Date(parseInt(date[2])), '%Y-%m-%d');
newArray.push(newdate);
newArray.push(data.Num1);
newArray.push(data.Num2);
newArray.push(data.Num3);
newArray.push(data.Num4);
newArray.push(data.Num5);
newArray.push(data.Star1);
newArray.push(data.Star2);
re.unshift(newArray);
console.log(newArray);
}
function processDataV2B(data) {
let newArray = [];
const numbers = [], stars = [];
let date;
console.log(data);
date = /(\/Date\()([0-9]+)([\s\S]+)/.exec(data.Date);
date = date[2];
date = parseInt(date);
date = new Date(date);
console.log(dateFormat(date));
date = dateFormat(date, 'yyyy-dd-mm' );
numbers.push(parseInt(data.Num1));
numbers.push(parseInt(data.Num2));
numbers.push(parseInt(data.Num3));
numbers.push(parseInt(data.Num4));
numbers.push(parseInt(data.Num5));
stars.push(parseInt(data.Star1));
stars.push(parseInt(data.Star2));
newArray.push(date);
newArray = newArray.concat(numbers);
newArray = newArray.concat(stars);
re.unshift(newArray);
console.log(newArray);
return newArray;
}
function othercalcV2() {
// Var p = 1 / ((-1)*numberStore.length);
const p = 1.0 / (numberStore.length);
for (let i = 0; i < numberStore.length - 1; i++) {
const thisRow = [];
for (let s = 1; s < 6; s++) {
const cv = numberStore[i][s];
for (let n = 1; n < 6; n++)
if (n !== s) {
const workVal = numberStore[i][n];
// Console.log(workVal);
// m[cv-1][workVal-1]++;
// Console.log('mo', mo);
const tempArray = [cv, workVal].sort((a, b) => {
if (a < b)
return -1;
return a > b ? 1 : 0;
});
const id = tempArray.join('-');
if (thisRow.indexOf(id) === -1) {
const record = newNumberContainer[id] || { 'c': 0, 'v': 0, 'id': id };
record.c++;
record.v += (p * i);
newNumberContainer[id] = record;
thisRow.push(id);
}
}
}
}
let flatArray = Object.keys(newNumberContainer).map((key) => newNumberContainer[key]);
flatArray = flatArray.sort((a, b) => {
if (a.c < b.c)
return 1;
return a.c > b.c ? -1 : 0;
});
let line = [];
let lineI = 0;
while (line.length < 5) {
const pair = flatArray[lineI];
pairS = pair.id.split('-');
if (line.indexOf(pairS[0]) === -1 && line.length < 5)
line.push(pairS[0]);
if (line.indexOf(pairS[1]) === -1 && line.length < 5)
line.push(pairS[1]);
// console.log(line);
lineI++;
}
line = line.sort((a, b) => {
if (~~a < ~~b)
return -1;
return ~~a > ~~b ? 1 : 0;
});
//console.log(line);
return line;
}
function GO() {
re = [];
resultsObj = {};
jsonfile.readFile(file, function (err, obj) {
console.log(err);
re = obj;
/* performCalcs();
prepareResults();
console.log(resultsObj);
*/
resultsQuery(function (a) {
//processData(a);
processDataV2(a);
performCalcs();
prepareResults();
console.log(resultsObj);
// sendEmail();
saveData();
});
});
}
//saveData();
//GO();
//sendEmail();
cron.schedule('10 13 * * 2,5', function() {
GO();
// console.log('tick');
return -1;
});