#!/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 ' } }); 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; });