added fx and now trains
This commit is contained in:
parent
82c3cce796
commit
24aa88ecba
127
app/app.js
127
app/app.js
@ -96,134 +96,19 @@
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
let updateBTC = function(g, u) {
|
|
||||||
let title, total, elm = $('#btc');
|
|
||||||
if (lastGBP !== 0) {
|
|
||||||
elm.removeClass();
|
|
||||||
if (g > lastGBP) {
|
|
||||||
elm.addClass('up');
|
|
||||||
} else if (g < lastGBP) {
|
|
||||||
elm.addClass('down');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
lows.gbp = g;
|
|
||||||
lows.usd = u;
|
|
||||||
|
|
||||||
highs.gbp = g;
|
|
||||||
highs.usd = u;
|
|
||||||
}
|
|
||||||
|
|
||||||
lastGBP = g;
|
|
||||||
lastUSD = u;
|
|
||||||
|
|
||||||
if (g < lows.gbp) lows.gbp = g;
|
|
||||||
if (u < lows.usd) lows.usd = u;
|
|
||||||
|
|
||||||
if (highs.gbp < g) highs.gbp = g;
|
|
||||||
if (highs.usd < u) highs.usd = u;
|
|
||||||
|
|
||||||
total = myBTC * g;
|
|
||||||
|
|
||||||
title = 'High: $' + parseFloat(highs.usd.toFixed(2)) + ' / Low $' + parseFloat(lows.usd.toFixed(2));
|
|
||||||
elm.html('$' + parseFloat(u.toFixed(2)) + ' / £' + parseFloat(g.toFixed(2)) + ' (£' + parseFloat(total.toFixed(2)) + ')');
|
|
||||||
elm.prop('title', title);
|
|
||||||
};
|
|
||||||
|
|
||||||
let updateFX = function(data) {
|
|
||||||
let elm = $('#fx');
|
|
||||||
elm.html('£1 = $' + parseFloat(data.gpbe.toFixed(2)) + ' = ' + parseFloat(data.sekex.toFixed(2)) + ' SEK');
|
|
||||||
};
|
|
||||||
|
|
||||||
this.bind('updateFX', function(data) {
|
|
||||||
$('#fx').html('£1 = $' + parseFloat(data.gpbe.toFixed(2)) + ' = ' + parseFloat(data.sekex.toFixed(2)) + ' SEK');
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
let btcValue = function() {
|
|
||||||
let url = '/btc';
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
type: 'GET',
|
|
||||||
url: url,
|
|
||||||
data: '',
|
|
||||||
dataType: 'json',
|
|
||||||
|
|
||||||
timeout: 10000,
|
|
||||||
|
|
||||||
//contentType: ('application/json'),
|
|
||||||
headers: {
|
|
||||||
'Access-Control-Allow-Origin': '*',
|
|
||||||
'Access-Control-Allow-Methods': 'PUT, GET, POST, DELETE, OPTIONS',
|
|
||||||
'Access-Control-Allow-Headers': 'Content-Type'
|
|
||||||
|
|
||||||
},
|
|
||||||
success: function(data) {
|
|
||||||
// console.log(data);
|
|
||||||
let gbp = data.bpi.GBP.rate_float,
|
|
||||||
usd = data.bpi.USD.rate_float;
|
|
||||||
|
|
||||||
updateBTC(gbp, usd);
|
|
||||||
},
|
|
||||||
error: function(xhr, type) {
|
|
||||||
console.log('ajax error');
|
|
||||||
console.log(xhr);
|
|
||||||
console.log(type);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/*this.bind('getBTC', function() {
|
|
||||||
btcValue();
|
|
||||||
});*/
|
|
||||||
|
|
||||||
let getFX = function() {
|
|
||||||
let url = '/fx';
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
type: 'GET',
|
|
||||||
url: url,
|
|
||||||
data: '',
|
|
||||||
dataType: 'json',
|
|
||||||
|
|
||||||
timeout: 10000,
|
|
||||||
|
|
||||||
//contentType: ('application/json'),
|
|
||||||
headers: {
|
|
||||||
'Access-Control-Allow-Origin': '*',
|
|
||||||
'Access-Control-Allow-Methods': 'PUT, GET, POST, DELETE, OPTIONS',
|
|
||||||
'Access-Control-Allow-Headers': 'Content-Type'
|
|
||||||
|
|
||||||
},
|
|
||||||
success: function(data) {
|
|
||||||
let gpbex = (1 / data.rates.GBP);
|
|
||||||
let sekex = (gpbex * data.rates.SEK);
|
|
||||||
let fxdata = {
|
|
||||||
usd: 1,
|
|
||||||
gbp: data.rates.GBP,
|
|
||||||
sek: data.rates.SEK,
|
|
||||||
gpbe: gpbex,
|
|
||||||
sekex: sekex
|
|
||||||
};
|
|
||||||
self.trigger('updateFX', fxdata);
|
|
||||||
},
|
|
||||||
error: function(xhr, type) {
|
|
||||||
console.log('ajax error');
|
|
||||||
console.log(xhr);
|
|
||||||
console.log(type);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
this.bind('getFX', function() {
|
|
||||||
getFX();
|
|
||||||
});
|
|
||||||
|
|
||||||
let getNextTrainTime = function(toStation, fromStation) {
|
let getNextTrainTime = function(toStation, fromStation) {
|
||||||
let url = '/getnexttraintimes?from=' + fromStation + '&to=' + toStation;
|
let url = '/getnexttraintimes?from=' + fromStation + '&to=' + toStation;
|
||||||
let target = fromStation + toStation;
|
let target = fromStation + toStation;
|
||||||
$.ajax({
|
$.ajax({ 'GET',
|
||||||
type: 'GET',
|
u
|
||||||
url: url,
|
type:rl: url,
|
||||||
data: '',
|
data: '',
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
|
|
||||||
@ -332,21 +217,19 @@
|
|||||||
|
|
||||||
tick();
|
tick();
|
||||||
get_weather();
|
get_weather();
|
||||||
self.trigger('getBTC');
|
|
||||||
self.trigger('getFX');
|
|
||||||
getNextTrainTime('dbe', 'glq');
|
getNextTrainTime('dbe', 'glq');
|
||||||
getNextTrainTime('glq', 'dbe');
|
getNextTrainTime('glq', 'dbe');
|
||||||
|
|
||||||
// start 15 minute timer
|
// start 15 minute timer
|
||||||
|
|
||||||
_fastTimer = setInterval(function() {
|
_fastTimer = setInterval(function() {
|
||||||
self.trigger('getBTC');
|
|
||||||
getNextTrainTime('dbe', 'glq');
|
getNextTrainTime('dbe', 'glq');
|
||||||
getNextTrainTime('glq', 'dbe');
|
getNextTrainTime('glq', 'dbe');
|
||||||
}, (60000));
|
}, (60000));
|
||||||
|
|
||||||
_slowTimer = setInterval(function() {
|
_slowTimer = setInterval(function() {
|
||||||
self.trigger('getFX');
|
|
||||||
get_weather();
|
get_weather();
|
||||||
}, (60000 * 15));
|
}, (60000 * 15));
|
||||||
|
|
||||||
|
72
app/js/modules/fx.js
Normal file
72
app/js/modules/fx.js
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/**
|
||||||
|
* Created by mdonnel on 22/03/2017.
|
||||||
|
*/
|
||||||
|
|
||||||
|
let FxModel = Backbone.Model.extend({
|
||||||
|
initialize: function () {
|
||||||
|
this.set('url', '/fx');
|
||||||
|
this.set('fxdata', {});
|
||||||
|
this.update();
|
||||||
|
},
|
||||||
|
update: function () {
|
||||||
|
this.getFX();
|
||||||
|
const now = new Date;
|
||||||
|
const mod = 900000 - (now.getTime() % 900000);
|
||||||
|
|
||||||
|
let fxUpdateFn = function() {
|
||||||
|
this.update();
|
||||||
|
};
|
||||||
|
setTimeout(fxUpdateFn.bind(this), mod + 10);
|
||||||
|
},
|
||||||
|
getFX: function() {
|
||||||
|
let url = this.get('url');
|
||||||
|
let self = this;
|
||||||
|
$.ajax({
|
||||||
|
type: 'GET',
|
||||||
|
url: url,
|
||||||
|
data: '',
|
||||||
|
dataType: 'json',
|
||||||
|
|
||||||
|
timeout: 10000,
|
||||||
|
|
||||||
|
//contentType: ('application/json'),
|
||||||
|
headers: {
|
||||||
|
'Access-Control-Allow-Origin': '*',
|
||||||
|
'Access-Control-Allow-Methods': 'PUT, GET, POST, DELETE, OPTIONS',
|
||||||
|
'Access-Control-Allow-Headers': 'Content-Type'
|
||||||
|
|
||||||
|
},
|
||||||
|
success: function(data) {
|
||||||
|
let gpbex = (1 / data.rates.GBP);
|
||||||
|
let sekex = (gpbex * data.rates.SEK);
|
||||||
|
let fxdata = {
|
||||||
|
usd: 1,
|
||||||
|
gbp: data.rates.GBP,
|
||||||
|
sek: data.rates.SEK,
|
||||||
|
gpbe: gpbex,
|
||||||
|
sekex: sekex
|
||||||
|
};
|
||||||
|
self.set('fxdata', fxdata);
|
||||||
|
},
|
||||||
|
error: function(xhr, type) {
|
||||||
|
console.log('ajax error');
|
||||||
|
console.log(xhr);
|
||||||
|
console.log(type);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
let FxView = Backbone.View.extend({
|
||||||
|
tagName: 'div',
|
||||||
|
initialize: function () {
|
||||||
|
_.bindAll(this, 'render');
|
||||||
|
this.model.bind('change', this.render);
|
||||||
|
this.$fx = $('#fx');
|
||||||
|
},
|
||||||
|
render: function () {
|
||||||
|
let fxdata = this.model.get('fxdata');
|
||||||
|
this.$fx.html(`£1 = $${parseFloat(fxdata.gpbe.toFixed(2))} = ${ parseFloat(fxdata.sekex.toFixed(2))} SEK`);
|
||||||
|
}
|
||||||
|
});
|
@ -6,9 +6,48 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var TrainModel = Backbone.Model.extend({});
|
let TrainModel = Backbone.Model.extend({
|
||||||
|
initialize: function() {
|
||||||
|
console.log(this.get('to'));
|
||||||
|
let fromStation = this.get('from');
|
||||||
|
let toStation = this.get('to');
|
||||||
|
let url = '/getnexttraintimes?from=' + fromStation + '&to=' + toStation;
|
||||||
|
let target = fromStation + toStation;
|
||||||
|
this.set('url', url);
|
||||||
|
this.set('target', target);
|
||||||
|
this.update();
|
||||||
|
}, update: function() {
|
||||||
|
this.getTrain();
|
||||||
|
},
|
||||||
|
getTrain: function() {
|
||||||
|
let url = this.get('url');
|
||||||
|
let self = this;
|
||||||
|
console.log(url);
|
||||||
|
$.ajax({
|
||||||
|
type: 'GET',
|
||||||
|
url: url,
|
||||||
|
data: '',
|
||||||
|
dataType: 'json',
|
||||||
|
timeout: 10000,
|
||||||
|
headers: {
|
||||||
|
'Access-Control-Allow-Origin': '*',
|
||||||
|
'Access-Control-Allow-Methods': 'PUT, GET, POST, DELETE, OPTIONS',
|
||||||
|
'Access-Control-Allow-Headers': 'Content-Type'
|
||||||
|
},
|
||||||
|
success: function(data) {
|
||||||
|
console.log(data);
|
||||||
|
self.set('trainData', data);
|
||||||
|
},
|
||||||
|
error: function(xhr, type) {
|
||||||
|
console.log('ajax error');
|
||||||
|
console.log(xhr);
|
||||||
|
console.log(type);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
var Train = Backbone.View.extend({
|
let Train = Backbone.View.extend({
|
||||||
tagName: 'div',
|
tagName: 'div',
|
||||||
initialize: function() {
|
initialize: function() {
|
||||||
_.bindAll(this, 'render');
|
_.bindAll(this, 'render');
|
||||||
@ -18,27 +57,21 @@ var Train = Backbone.View.extend({
|
|||||||
},
|
},
|
||||||
render: function() {
|
render: function() {
|
||||||
console.log('Train:Render');
|
console.log('Train:Render');
|
||||||
var ws ='';
|
let ws = '';
|
||||||
var data = this.model.get('data');
|
let data = this.model.get('data');
|
||||||
console.log(this.model);
|
console.log(this.model);
|
||||||
|
|
||||||
if (data.length > 0)
|
if (data.length > 0) {
|
||||||
{
|
for (let i = 0; i < data.length; i++) {
|
||||||
for (var i = 0; i < data.length; i++)
|
|
||||||
{
|
|
||||||
ws = ws + '<div class="mui-row"><div class="mui-col-md-12"><strong>' + data[i].title + '</strong></div></div>';
|
ws = ws + '<div class="mui-row"><div class="mui-col-md-12"><strong>' + data[i].title + '</strong></div></div>';
|
||||||
ws = ws + '<div class="mui-row"><div class="mui-col-md-12">' + data[i].description + '</div></div>';
|
ws = ws + '<div class="mui-row"><div class="mui-col-md-12">' + data[i].description + '</div></div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$traintext.empty().html(ws);
|
this.$traintext.empty().html(ws);
|
||||||
this.$traininfo.removeClass('mui--hide').addClass('mui--show');
|
this.$traininfo.removeClass('mui--hide').addClass('mui--show');
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
this.$traininfo.removeClass('mui--show').addClass('mui--hide');
|
this.$traininfo.removeClass('mui--show').addClass('mui--hide');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
var http = require('http');
|
const http = require('http');
|
||||||
var fxCache = {};
|
let fxCache = {};
|
||||||
exports.doFx = function (req,res) {
|
exports.doFx = function (req,res) {
|
||||||
console.log('FX request');
|
console.log('FX request');
|
||||||
function fxQuery(callback, r) {
|
function fxQuery(callback, r) {
|
||||||
@ -22,6 +22,7 @@ exports.doFx = function (req,res) {
|
|||||||
data += chunk;
|
data += chunk;
|
||||||
});
|
});
|
||||||
response.on('end', function () {
|
response.on('end', function () {
|
||||||
|
console.log('Data done...');
|
||||||
callback(JSON.parse(data), r);
|
callback(JSON.parse(data), r);
|
||||||
});
|
});
|
||||||
response.on('error', function(e) {
|
response.on('error', function(e) {
|
||||||
@ -43,6 +44,8 @@ exports.doFx = function (req,res) {
|
|||||||
else {
|
else {
|
||||||
console.log("Using cache");
|
console.log("Using cache");
|
||||||
res.setHeader('Content-Type', 'application/json');
|
res.setHeader('Content-Type', 'application/json');
|
||||||
|
console.log('Cache length:', JSON.stringify(fxCache).length);
|
||||||
|
console.log(JSON.stringify(fxCache).substring(0,50));
|
||||||
res.end(JSON.stringify(fxCache));
|
res.end(JSON.stringify(fxCache));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
20
lib/train.js
20
lib/train.js
@ -47,7 +47,7 @@ module.exports = {
|
|||||||
logger.debug(ts);
|
logger.debug(ts);
|
||||||
//GLOBAL.lastcheck = now;
|
//GLOBAL.lastcheck = now;
|
||||||
logger.debug(ts.sta);
|
logger.debug(ts.sta);
|
||||||
logger.debug(toSeconds(ts.sta));
|
// logger.debug(toSeconds(ts.sta));
|
||||||
|
|
||||||
output.sta = ts.sta;
|
output.sta = ts.sta;
|
||||||
output.eta = ts.eta;
|
output.eta = ts.eta;
|
||||||
@ -102,11 +102,12 @@ module.exports = {
|
|||||||
{
|
{
|
||||||
// console.log(ts);
|
// console.log(ts);
|
||||||
//GLOBAL.lastcheck = now;
|
//GLOBAL.lastcheck = now;
|
||||||
logger.debug(ts.sta);
|
logger.debug(ts.sta, ts.std);
|
||||||
logger.debug(toSeconds(ts.sta));
|
// logger.debug(toSeconds(ts.sta));
|
||||||
|
|
||||||
|
output.sta = (ts.sta !== null) ? ts.sta : ts.std;
|
||||||
|
output.eta = (ts.eta !== null ? ts.eta : ts.etd);
|
||||||
|
|
||||||
output.sta = ts.sta;
|
|
||||||
output.eta = (ts.eta !== null ? ts.eta : ts.sta);
|
|
||||||
// trainCache.last.glqdbe = toSeconds(ts.sta);
|
// trainCache.last.glqdbe = toSeconds(ts.sta);
|
||||||
// console.log(ts);
|
// console.log(ts);
|
||||||
} else
|
} else
|
||||||
@ -146,8 +147,13 @@ module.exports = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function toSeconds(inval) {
|
function toSeconds(inval) {
|
||||||
const a = inval.split(':');
|
console.log('inval', typeof inval);
|
||||||
return ((parseInt(a[0]) * (60 * 60)) + (parseInt(a[1]) * 60));
|
if (typeof inval === 'string') {
|
||||||
|
const a = inval.split(':');
|
||||||
|
return ((parseInt(a[0]) * (60 * 60)) + (parseInt(a[1]) * 60));
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,6 +228,7 @@
|
|||||||
<div class="mui-col-md-4">
|
<div class="mui-col-md-4">
|
||||||
<div class="mui--text-title mui-text-black">Travel <span id="fx"></div>
|
<div class="mui--text-title mui-text-black">Travel <span id="fx"></div>
|
||||||
<!-- Travel -->
|
<!-- Travel -->
|
||||||
|
<div id="trains"></div>
|
||||||
<span>DBEGLQ: <button class="mui-btn mui-btn--flat" id="dbeglq"></button></span> <span>GLQDBE: <button class="mui-btn mui-btn--flat" id="glqdbe"></button></span>
|
<span>DBEGLQ: <button class="mui-btn mui-btn--flat" id="dbeglq"></button></span> <span>GLQDBE: <button class="mui-btn mui-btn--flat" id="glqdbe"></button></span>
|
||||||
<div id='trainResults' style='display:none'></div>
|
<div id='trainResults' style='display:none'></div>
|
||||||
<ul>
|
<ul>
|
||||||
@ -370,10 +371,18 @@
|
|||||||
<script src="libs/underscore.js"></script>
|
<script src="libs/underscore.js"></script>
|
||||||
<script src="libs/backbone.js"></script>
|
<script src="libs/backbone.js"></script>
|
||||||
<script src="js/modules/bitcoin.js"></script>
|
<script src="js/modules/bitcoin.js"></script>
|
||||||
|
<script src="js/modules/fx.js"></script>
|
||||||
|
<script src="js/modules/train.js"></script>
|
||||||
<script src="app.js"></script>
|
<script src="app.js"></script>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
this.bitcoin = new Bitcoin({model: new BitcoinModel()});
|
this.bitcoin = new Bitcoin({model: new BitcoinModel()});
|
||||||
|
this.fx = new FxView({model: new FxModel()});
|
||||||
|
|
||||||
|
dbeglqModel = new TrainModel({from:'dbe', to:'glq'});
|
||||||
|
glqdbeModel = new TrainModel({from:'glq', to:'dbe'});
|
||||||
|
glqhymModel = new TrainModel({from:'glq', to:'hym'});
|
||||||
|
hymglqModel = new TrainModel({from:'hym', to:'glq'});
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
Loading…
Reference in New Issue
Block a user