Some new stuff
This commit is contained in:
parent
f20f9bc8fc
commit
fa6dede096
@ -1932,14 +1932,17 @@ li {
|
|||||||
border: solid 1px #80007e;
|
border: solid 1px #80007e;
|
||||||
background-color: #ffffff; }
|
background-color: #ffffff; }
|
||||||
|
|
||||||
#btc, #fx {
|
#btc, #fx, #trend {
|
||||||
font-size: 85%; }
|
font-size: 85%;
|
||||||
|
}
|
||||||
|
|
||||||
.up, .ontime {
|
.up, .ontime, .trendUp {
|
||||||
color: #4CAF50 !important; }
|
color: green !important;
|
||||||
|
}
|
||||||
|
|
||||||
.down, .delayed {
|
.down, .delayed, .trendDown {
|
||||||
color: #F44336 !important; }
|
color: red !important;
|
||||||
|
}
|
||||||
|
|
||||||
.nochange {
|
.nochange {
|
||||||
color: #000000; }
|
color: #000000; }
|
||||||
@ -1949,3 +1952,10 @@ li {
|
|||||||
background-color: #EEEEEE;
|
background-color: #EEEEEE;
|
||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
white-space: pre; }
|
white-space: pre; }
|
||||||
|
|
||||||
|
|
||||||
|
.trendUp:before {
|
||||||
|
content: "▲";
|
||||||
|
}
|
||||||
|
|
||||||
|
.trendDown:before{content:'▼'}
|
||||||
|
@ -44,15 +44,15 @@ li {
|
|||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
#btc, #fx {
|
#btc, #fx, #trend {
|
||||||
font-size: 85%;
|
font-size: 85%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.up, .ontime {
|
.up, .ontime, .trendUp {
|
||||||
color: mui-color('green') !important;
|
color: mui-color('green') !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.down, .delayed {
|
.down, .delayed, .trendDown {
|
||||||
color: mui-color('red') !important;
|
color: mui-color('red') !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,3 +65,9 @@ li {
|
|||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
white-space: pre;
|
white-space: pre;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.trendUp:before {
|
||||||
|
content: "▲";
|
||||||
|
}
|
||||||
|
|
||||||
|
.trendDown:before{content:'▼'}
|
@ -3,170 +3,189 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
let BitcoinModel = Backbone.Model.extend({
|
let BitcoinModel = Backbone.Model.extend({
|
||||||
initialize: function () {
|
initialize: function () {
|
||||||
this.set('url', '/btc');
|
this.set('url', '/btc');
|
||||||
this.set('balanceUrl', '/balance');
|
this.set('balanceUrl', '/balance');
|
||||||
let data = {
|
let data = {
|
||||||
lastGBP: 0.0,
|
lastGBP: 0.0,
|
||||||
lastUSD: 0.0,
|
lastUSD: 0.0,
|
||||||
lows: {gbp: 0, usd: 0},
|
lows: {gbp: 0, usd: 0},
|
||||||
highs: {gbp: 0, usd: 0},
|
highs: {gbp: 0, usd: 0},
|
||||||
eclass: '',
|
eclass: '',
|
||||||
balance: 0.0
|
balance: 0.0,
|
||||||
};
|
trend: 0
|
||||||
this.set('btcdata', data);
|
};
|
||||||
this.set('balance', 0);
|
this.set('btcdata', data);
|
||||||
this.update();
|
this.set('balance', 0);
|
||||||
this.updateHourly();
|
this.update();
|
||||||
},
|
this.updateHourly();
|
||||||
update: function () {
|
},
|
||||||
this.getBTC();
|
update: function () {
|
||||||
|
this.getBTC();
|
||||||
//this.getBalance();
|
//this.getBalance();
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
const mod = 300000 - (now.getTime() % 300000);
|
const mod = 300000 - (now.getTime() % 300000);
|
||||||
|
|
||||||
let btcupdateFn = function() {
|
let btcupdateFn = function() {
|
||||||
this.update();
|
this.update();
|
||||||
};
|
};
|
||||||
setTimeout(btcupdateFn.bind(this), mod + 10);
|
setTimeout(btcupdateFn.bind(this), mod + 10);
|
||||||
},
|
},
|
||||||
updateHourly: function () {
|
updateHourly: function () {
|
||||||
|
|
||||||
this.getBalance();
|
this.getBalance();
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
const mod = 3600000 - (now.getTime() % 3600000);
|
const mod = 3600000 - (now.getTime() % 3600000);
|
||||||
|
|
||||||
let btcupdateFn = function() {
|
let btcupdateFn = function() {
|
||||||
this.update();
|
this.update();
|
||||||
};
|
};
|
||||||
setTimeout(btcupdateFn.bind(this), mod + 10);
|
setTimeout(btcupdateFn.bind(this), mod + 10);
|
||||||
},
|
},
|
||||||
recalc: function () {
|
recalc: function () {
|
||||||
let data = this.get('btcdata');
|
let data = this.get('btcdata');
|
||||||
let lastGBP = data.lastGBP;
|
let lastGBP = data.lastGBP;
|
||||||
let lastUSD;
|
let lastUSD;
|
||||||
let g = data.gbp;
|
let g = data.gbp;
|
||||||
let u = data.usd;
|
let u = data.usd;
|
||||||
let lows = data.lows;
|
let lows = data.lows;
|
||||||
let highs = data.highs;
|
let highs = data.highs;
|
||||||
let eclass = data.eclass;
|
let eclass = data.eclass;
|
||||||
let balance = data.balance;
|
let balance = data.balance;
|
||||||
if (g !== undefined) {
|
let trend = data.trend;
|
||||||
if (data.lastGBP !== 0) {
|
|
||||||
if (g > lastGBP) {
|
|
||||||
eclass = 'up';
|
|
||||||
} else {
|
|
||||||
eclass = 'down';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
lows.gbp = g;
|
|
||||||
lows.usd = u;
|
|
||||||
|
|
||||||
highs.gbp = g;
|
if ((trend === undefined) || ( trend === null)) trend = 1;
|
||||||
highs.usd = u;
|
|
||||||
}
|
|
||||||
lastGBP = g;
|
|
||||||
lastUSD = u;
|
|
||||||
|
|
||||||
if (g < lows.gbp) lows.gbp = g;
|
if (g !== undefined) {
|
||||||
if (u < lows.usd) lows.usd = u;
|
if (data.lastGBP !== 0)
|
||||||
|
if (g > lastGBP) {
|
||||||
if (highs.gbp < g) highs.gbp = g;
|
eclass = 'up';
|
||||||
if (highs.usd < u) highs.usd = u;
|
} else {
|
||||||
|
eclass = 'down';
|
||||||
data = {
|
|
||||||
lastGBP,
|
|
||||||
lastUSD,
|
|
||||||
lows,
|
|
||||||
highs,
|
|
||||||
eclass,
|
|
||||||
balance
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
data.stub = Math.random(Number.MAX_SAFE_INTEGER).toString(32);
|
else {
|
||||||
|
lows.gbp = g;
|
||||||
|
lows.usd = u;
|
||||||
|
|
||||||
this.set('btcdata', data);
|
highs.gbp = g;
|
||||||
// total = myBTC * g;
|
highs.usd = u;
|
||||||
},
|
}
|
||||||
getBTC: function () {
|
lastGBP = g;
|
||||||
let self = this;
|
lastUSD = u;
|
||||||
let url = this.get('url');
|
|
||||||
console.log('>> getBTC');
|
|
||||||
$.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 gbp = data.bpi.GBP.rate_float,
|
|
||||||
usd = data.bpi.USD.rate_float;
|
|
||||||
let btcdata = self.get('btcdata');
|
|
||||||
btcdata.gbp = gbp;
|
|
||||||
btcdata.usd = usd;
|
|
||||||
self.set('btcdata', btcdata);
|
|
||||||
self.recalc();
|
|
||||||
},
|
|
||||||
error: function (xhr, type) {
|
|
||||||
console.log('ajax error');
|
|
||||||
console.log(xhr);
|
|
||||||
console.log(type);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
getBalance: function() {
|
|
||||||
let self = this;
|
|
||||||
let url = this.get('balanceUrl');
|
|
||||||
$.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 balance = data.balance;
|
|
||||||
|
|
||||||
self.set('balance', balance);
|
if (g < lows.gbp) lows.gbp = g;
|
||||||
self.recalc();
|
if (u < lows.usd) lows.usd = u;
|
||||||
},
|
|
||||||
error: function (xhr, type) {
|
if (highs.gbp < g) highs.gbp = g;
|
||||||
console.log('ajax error');
|
if (highs.usd < u) highs.usd = u;
|
||||||
console.log(xhr);
|
|
||||||
console.log(type);
|
data = {
|
||||||
}
|
lastGBP,
|
||||||
});
|
lastUSD,
|
||||||
|
lows,
|
||||||
|
highs,
|
||||||
|
eclass,
|
||||||
|
balance,
|
||||||
|
trend
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
data.stub = Math.random(Number.MAX_SAFE_INTEGER).toString(32);
|
||||||
|
|
||||||
|
this.set('btcdata', data);
|
||||||
|
// total = myBTC * g;
|
||||||
|
},
|
||||||
|
getBTC: function () {
|
||||||
|
let self = this;
|
||||||
|
let url = this.get('url');
|
||||||
|
$.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 gbp = data.bpi.GBP.rate_float,
|
||||||
|
usd = data.bpi.USD.rate_float;
|
||||||
|
let trend = data.trend;
|
||||||
|
let btcdata = self.get('btcdata');
|
||||||
|
btcdata.gbp = gbp;
|
||||||
|
btcdata.usd = usd;
|
||||||
|
btcdata.trend = trend;
|
||||||
|
self.set('btcdata', btcdata);
|
||||||
|
self.recalc();
|
||||||
|
},
|
||||||
|
error: function (xhr, type) {
|
||||||
|
console.log('ajax error');
|
||||||
|
console.log(xhr);
|
||||||
|
console.log(type);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
getBalance: function() {
|
||||||
|
let self = this;
|
||||||
|
let url = this.get('balanceUrl');
|
||||||
|
$.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 balance = data.balance;
|
||||||
|
|
||||||
|
self.set('balance', balance);
|
||||||
|
self.recalc();
|
||||||
|
},
|
||||||
|
error: function (xhr, type) {
|
||||||
|
console.log('ajax error');
|
||||||
|
console.log(xhr);
|
||||||
|
console.log(type);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
let Bitcoin = Backbone.View.extend({
|
let Bitcoin = Backbone.View.extend({
|
||||||
tagName: 'div',
|
tagName: 'div',
|
||||||
initialize: function () {
|
initialize: function () {
|
||||||
_.bindAll(this, 'render');
|
_.bindAll(this, 'render');
|
||||||
this.model.bind('change', this.render);
|
this.model.bind('change', this.render);
|
||||||
this.$btc = $('#btc');
|
this.$btc = $('#btc');
|
||||||
},
|
this.$trend = $('#trend');
|
||||||
render: function () {
|
},
|
||||||
let btcdata = this.model.get('btcdata');
|
render: function () {
|
||||||
let balance = this.model.get('balance');
|
let btcdata = this.model.get('btcdata');
|
||||||
|
let balance = this.model.get('balance');
|
||||||
//console.log(`Balance: ${btcdata.balance.toFixed(4)}`);
|
//console.log(`Balance: ${btcdata.balance.toFixed(4)}`);
|
||||||
//console.log(btcdata.lastGBP);
|
//console.log(btcdata.lastGBP);
|
||||||
let owned = parseFloat(btcdata.lastGBP) * parseFloat(balance);
|
let owned = parseFloat(btcdata.lastGBP) * parseFloat(balance);
|
||||||
//console.log(`owned: ${owned}`);
|
//console.log(`owned: ${owned}`);
|
||||||
let title = 'High: $' + parseFloat(btcdata.highs.usd.toFixed(2)) + ' / Low $' + parseFloat(btcdata.lows.usd.toFixed(2));
|
let title = 'High: $' + parseFloat(btcdata.highs.usd.toFixed(2)) + ' / Low $' + parseFloat(btcdata.lows.usd.toFixed(2));
|
||||||
this.$btc.removeClass();
|
let trendClass = '';
|
||||||
this.$btc.addClass(btcdata.eclass);
|
|
||||||
this.$btc.html(`$${parseFloat(btcdata.lastUSD.toFixed(2)) } / £${parseFloat(btcdata.lastGBP.toFixed(2))} <div>₿${balance} £${parseFloat(owned.toFixed(2))}</div>` );
|
if (btcdata.trend > 1.00)
|
||||||
this.$btc.prop('title', title);
|
trendClass = 'trendUp';
|
||||||
}
|
else if (btcdata.trend < 1.00)
|
||||||
|
trendClass = 'trendDown';
|
||||||
|
else
|
||||||
|
trendClass = '';
|
||||||
|
|
||||||
|
this.$trend.removeClass();
|
||||||
|
this.$trend.addClass(trendClass);
|
||||||
|
this.$btc.removeClass();
|
||||||
|
this.$btc.addClass(btcdata.eclass);
|
||||||
|
this.$btc.html(`$${parseFloat(btcdata.lastUSD.toFixed(2)) } / £${parseFloat(btcdata.lastGBP.toFixed(2))} <div>₿${balance} £${parseFloat(owned.toFixed(2))}</div>` );
|
||||||
|
this.$btc.prop('title', title);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
52
app/libs/float.js
Normal file
52
app/libs/float.js
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
* Credit: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
|
||||||
|
*/
|
||||||
|
var decimalAdjust = function(type, value, exp) {
|
||||||
|
value = value || 0;
|
||||||
|
exp = exp === undefined ? -2 : -Math.abs(exp);
|
||||||
|
// If the exp is undefined or zero...
|
||||||
|
if (typeof exp === 'undefined' || +exp === 0) {
|
||||||
|
return Math[type](value);
|
||||||
|
}
|
||||||
|
value = +value;
|
||||||
|
exp = +exp;
|
||||||
|
// If the value is not a number or the exp is not an integer...
|
||||||
|
if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {
|
||||||
|
return NaN;
|
||||||
|
}
|
||||||
|
// Shift
|
||||||
|
value = value.toString().split('e');
|
||||||
|
value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp)));
|
||||||
|
// Shift back
|
||||||
|
value = value.toString().split('e');
|
||||||
|
return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp));
|
||||||
|
};
|
||||||
|
|
||||||
|
var round = function(v, d) {
|
||||||
|
return decimalAdjust('round', v, d);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
round: round,
|
||||||
|
floor: function(v, d) {
|
||||||
|
return decimalAdjust('floor', v, d);
|
||||||
|
},
|
||||||
|
ceil: function(v, d) {
|
||||||
|
return decimalAdjust('ceil', v, d);
|
||||||
|
},
|
||||||
|
equals: function(a, b, d) {
|
||||||
|
return round(a, d) === round(b, d);
|
||||||
|
},
|
||||||
|
lessThan: function(a, b, d) {
|
||||||
|
return round(a, d) < round(b, d);
|
||||||
|
},
|
||||||
|
lessThanOrEquals: function(a, b, d) {
|
||||||
|
return round(a, d) <= round(b, d);
|
||||||
|
},
|
||||||
|
greaterThan: function(a, b, d) {
|
||||||
|
return round(a, d) > round(b, d);
|
||||||
|
},
|
||||||
|
greaterThanOrEquals: function(a, b, d) {
|
||||||
|
return round(a, d) >= round(b, d);
|
||||||
|
}
|
||||||
|
};
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -16,6 +16,8 @@
|
|||||||
"tests"
|
"tests"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"moment": "^2.18.1"
|
"moment": "^2.18.1",
|
||||||
|
"mui": "^0.9.21",
|
||||||
|
"float": "^1.0.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,9 @@ const http = require('http');
|
|||||||
const LimitedArray = require('limitedarray');
|
const LimitedArray = require('limitedarray');
|
||||||
const trend = require('trend');
|
const trend = require('trend');
|
||||||
const logger = require('log4js').getLogger('fx');
|
const logger = require('log4js').getLogger('fx');
|
||||||
|
const delay = (60000 * 30);
|
||||||
let fxCache = {};
|
let fxCache = {};
|
||||||
let history = new LimitedArray(96); // one days worth in 5 minute chunks
|
let history = new LimitedArray(48); // one days worth in 5 minute chunks
|
||||||
|
|
||||||
function getFx() {
|
function getFx() {
|
||||||
logger.info('FX request');
|
logger.info('FX request');
|
||||||
@ -37,17 +38,16 @@ function getFx() {
|
|||||||
|
|
||||||
history.push(a.rates.GBP);
|
history.push(a.rates.GBP);
|
||||||
fxCache.history = history.get();
|
fxCache.history = history.get();
|
||||||
fxCache.trend = trend(fxCache.history, {avgPoints: 24});
|
fxCache.trend = trend(fxCache.history, {avgPoints: 12});
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateFX() {
|
function updateFX() {
|
||||||
|
|
||||||
logger.warn('updateBitcoin');
|
logger.warn('updateBitcoin');
|
||||||
getFx();
|
getFx();
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
const mod = (60000 * 15) - (now.getTime() % (60000 * 15));
|
const mod = delay - (now.getTime() % delay);
|
||||||
|
|
||||||
let fxUpdateFn = () => {
|
let fxUpdateFn = () => {
|
||||||
updateFX();
|
updateFX();
|
||||||
|
@ -58,7 +58,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="mui-col-md-4">
|
<div class="mui-col-md-4">
|
||||||
<div class="mui--text-title mui-text-black">Bitcoin <span id="btc"></span></div>
|
<div class="mui--text-title mui-text-black">Bitcoin <span id="trend"> </span><span id="btc"></span></div>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://www.bitstamp.net">Bitstamp</a></li>
|
<li><a href="https://www.bitstamp.net">Bitstamp</a></li>
|
||||||
<li><a href="https://www.kraken.net">Kraken</a></li>
|
<li><a href="https://www.kraken.net">Kraken</a></li>
|
||||||
|
@ -133,7 +133,7 @@ app.route('/poly').get(polys);
|
|||||||
|
|
||||||
app.get('/slack', function(req, res) {
|
app.get('/slack', function(req, res) {
|
||||||
res.render('pages/slackV2-min');
|
res.render('pages/slackV2-min');
|
||||||
//res.render('pages/slackV2');
|
// res.render('pages/slackV2');
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get('/temp', function(req, res) {
|
app.get('/temp', function(req, res) {
|
||||||
|
Loading…
Reference in New Issue
Block a user