mirror of https://github.com/BTCPrivate/z-nomp.git
124 lines
4.5 KiB
JavaScript
124 lines
4.5 KiB
JavaScript
var redis = require('redis');
|
|
var async = require('async');
|
|
|
|
var stats = require('./stats.js');
|
|
|
|
module.exports = function(logger, portalConfig, poolConfigs){
|
|
|
|
var _this = this;
|
|
|
|
var portalStats = this.stats = new stats(logger, portalConfig, poolConfigs);
|
|
|
|
this.liveStatConnections = {};
|
|
|
|
this.handleApiRequest = function(req, res, next){
|
|
|
|
switch(req.params.method){
|
|
case 'stats':
|
|
res.end(portalStats.statsString);
|
|
return;
|
|
case 'pool_stats':
|
|
res.end(JSON.stringify(portalStats.statPoolHistory));
|
|
return;
|
|
case 'payments':
|
|
var poolBlocks = [];
|
|
for(var pool in portalStats.stats.pools) {
|
|
poolBlocks.push({name: pool, pending: portalStats.stats.pools[pool].pending, payments: portalStats.stats.pools[pool].payments});
|
|
}
|
|
res.end(JSON.stringify(poolBlocks));
|
|
return;
|
|
case 'worker_stats':
|
|
if (req.url.indexOf("?")>0) {
|
|
var url_parms = req.url.split("?");
|
|
if (url_parms.length > 0) {
|
|
var history = {};
|
|
var workers = {};
|
|
var address = url_parms[1] || null;
|
|
//res.end(portalStats.getWorkerStats(address));
|
|
if (address != null && address.length > 0) {
|
|
// make sure it is just the miners address
|
|
address = address.split(".")[0];
|
|
// get miners balance along with worker balances
|
|
portalStats.getBalanceByAddress(address, function(balances) {
|
|
// get current round share total
|
|
portalStats.getTotalSharesByAddress(address, function(shares) {
|
|
var totalHash = parseFloat(0.0);
|
|
var totalShares = shares;
|
|
var networkSols = 0;
|
|
for (var h in portalStats.statHistory) {
|
|
for(var pool in portalStats.statHistory[h].pools) {
|
|
for(var w in portalStats.statHistory[h].pools[pool].workers){
|
|
if (w.startsWith(address)) {
|
|
if (history[w] == null) {
|
|
history[w] = [];
|
|
}
|
|
if (portalStats.statHistory[h].pools[pool].workers[w].hashrate) {
|
|
history[w].push({time: portalStats.statHistory[h].time, hashrate:portalStats.statHistory[h].pools[pool].workers[w].hashrate});
|
|
}
|
|
}
|
|
}
|
|
// order check...
|
|
//console.log(portalStats.statHistory[h].time);
|
|
}
|
|
}
|
|
for(var pool in portalStats.stats.pools) {
|
|
for(var w in portalStats.stats.pools[pool].workers){
|
|
if (w.startsWith(address)) {
|
|
workers[w] = portalStats.stats.pools[pool].workers[w];
|
|
for (var b in balances.balances) {
|
|
if (w == balances.balances[b].worker) {
|
|
workers[w].paid = balances.balances[b].paid;
|
|
workers[w].balance = balances.balances[b].balance;
|
|
}
|
|
}
|
|
workers[w].balance = (workers[w].balance || 0);
|
|
workers[w].paid = (workers[w].paid || 0);
|
|
totalHash += portalStats.stats.pools[pool].workers[w].hashrate;
|
|
networkSols = portalStats.stats.pools[pool].poolStats.networkSols;
|
|
}
|
|
}
|
|
}
|
|
res.end(JSON.stringify({miner: address, totalHash: totalHash, totalShares: totalShares, networkSols: networkSols, balance: balances.totalHeld, paid: balances.totalPaid, workers: workers, history: history}));
|
|
});
|
|
});
|
|
} else {
|
|
res.end(JSON.stringify({result: "error"}));
|
|
}
|
|
} else {
|
|
res.end(JSON.stringify({result: "error"}));
|
|
}
|
|
} else {
|
|
res.end(JSON.stringify({result: "error"}));
|
|
}
|
|
return;
|
|
case 'live_stats':
|
|
res.writeHead(200, {
|
|
'Content-Type': 'text/event-stream',
|
|
'Cache-Control': 'no-cache',
|
|
'Connection': 'keep-alive'
|
|
});
|
|
res.write('\n');
|
|
var uid = Math.random().toString();
|
|
_this.liveStatConnections[uid] = res;
|
|
req.on("close", function() {
|
|
delete _this.liveStatConnections[uid];
|
|
});
|
|
return;
|
|
default:
|
|
next();
|
|
}
|
|
};
|
|
|
|
this.handleAdminApiRequest = function(req, res, next){
|
|
switch(req.params.method){
|
|
case 'pools': {
|
|
res.end(JSON.stringify({result: poolConfigs}));
|
|
return;
|
|
}
|
|
default:
|
|
next();
|
|
}
|
|
};
|
|
|
|
};
|