Add support for newer Dash masternode format
-Automatically detect if using newer or older Dash masternode format and display applicable columns and data -Added new fields 'ip_address' and 'last_paid_block' to the Masternode collection
This commit is contained in:
@@ -57,6 +57,9 @@ db.connect(dbString, function() {
|
||||
// Add new field(s) to tx collection if missing
|
||||
db.check_txes(function(exists) {});
|
||||
|
||||
// Add new field(s) to masternode collection if missing
|
||||
db.check_masternodes(function(exists) {});
|
||||
|
||||
db.check_richlist(settings.coin.name, function(exists) {
|
||||
if (exists == false) {
|
||||
console.log('no richlist entry found, creating now..');
|
||||
|
||||
+54
-24
@@ -289,7 +289,7 @@ module.exports = {
|
||||
// loop through masternode addresses
|
||||
for (m = 0; m < masternodes.length; m++) {
|
||||
// check if this is the correct address
|
||||
if (masternodes[m].addr == hash) {
|
||||
if ((masternodes[m].proTxHash != null ? masternodes[m].payee : masternodes[m].addr) == hash) {
|
||||
// update the claim name
|
||||
masternodes[m]['claim_name'] = claim_name;
|
||||
// mark as updated
|
||||
@@ -1043,14 +1043,30 @@ module.exports = {
|
||||
});
|
||||
},
|
||||
|
||||
check_masternodes: function(cb) {
|
||||
Masternode.findOne({}, function(err, masternode) {
|
||||
if (masternode) {
|
||||
// collection has data
|
||||
// determine if ip_address field exists
|
||||
check_add_db_field(Masternode, 'ip_address', null, function(exists) {
|
||||
// determine if last_paid_block field exists
|
||||
check_add_db_field(Masternode, 'last_paid_block', null, function(exists) {
|
||||
return cb(true);
|
||||
});
|
||||
});
|
||||
} else
|
||||
return cb(false);
|
||||
});
|
||||
},
|
||||
|
||||
// determine if masternode exists and save masternode to collection
|
||||
save_masternode: function (raw_masternode, cb) {
|
||||
// lookup masternode in local collection
|
||||
module.exports.find_masternode(raw_masternode.txhash, raw_masternode.outidx, function (masternode) {
|
||||
module.exports.find_masternode((raw_masternode.proTxHash != null ? raw_masternode.proTxHash : raw_masternode.txhash), function (masternode) {
|
||||
// determine if the claim address feature is enabled
|
||||
if (settings.claim_address_page.enabled == true) {
|
||||
// claim address is enabled so lookup the address claim name
|
||||
find_address(raw_masternode.addr, false, function(address) {
|
||||
find_address((raw_masternode.proTxHash != null ? raw_masternode.payee : raw_masternode.addr), false, function(address) {
|
||||
if (address) {
|
||||
// save claim name to masternode obejct
|
||||
raw_masternode.claim_name = address.name;
|
||||
@@ -1075,26 +1091,40 @@ module.exports = {
|
||||
|
||||
// add or update a single masternode
|
||||
add_update_masternode(masternode, add, cb) {
|
||||
if (!masternode.txhash == null || !masternode.outidx == null) {
|
||||
console.log('Masternode Update - TX or Outidx is missing');
|
||||
console.log(masternode.txhash);
|
||||
console.log(masternode.outidx);
|
||||
if (masternode.proTxHash == null && masternode.txhash == null) {
|
||||
console.log('Masternode Update - TXid is missing');
|
||||
|
||||
return cb(false);
|
||||
} else {
|
||||
var mn = new Masternode({
|
||||
rank: masternode.rank,
|
||||
network: masternode.network,
|
||||
txhash: masternode.txhash,
|
||||
outidx: masternode.outidx,
|
||||
status: masternode.status,
|
||||
addr: masternode.addr,
|
||||
version: masternode.version,
|
||||
lastseen: masternode.lastseen,
|
||||
activetime: masternode.activetime,
|
||||
lastpaid: masternode.lastpaid,
|
||||
claim_name: (masternode.claim_name == null ? '' : masternode.claim_name)
|
||||
});
|
||||
// Check if this older or newer Dash masternode format
|
||||
if (masternode.proTxHash != null) {
|
||||
// This is the newer Dash format
|
||||
var mn = new Masternode({
|
||||
txhash: masternode.proTxHash,
|
||||
status: masternode.status,
|
||||
addr: masternode.payee,
|
||||
lastpaid: masternode.lastpaidtime,
|
||||
ip_address: masternode.address,
|
||||
last_paid_block: masternode.lastpaidblock,
|
||||
lastseen: Math.floor(Date.now() / 1000),
|
||||
claim_name: (masternode.claim_name == null ? '' : masternode.claim_name)
|
||||
});
|
||||
} else {
|
||||
// This is the older Dash format, or an unknown format
|
||||
var mn = new Masternode({
|
||||
rank: masternode.rank,
|
||||
network: masternode.network,
|
||||
txhash: masternode.txhash,
|
||||
outidx: masternode.outidx,
|
||||
status: masternode.status,
|
||||
addr: masternode.addr,
|
||||
version: masternode.version,
|
||||
lastseen: masternode.lastseen,
|
||||
activetime: masternode.activetime,
|
||||
lastpaid: masternode.lastpaid,
|
||||
claim_name: (masternode.claim_name == null ? '' : masternode.claim_name)
|
||||
});
|
||||
}
|
||||
|
||||
if (add) {
|
||||
// add new masternode to collection
|
||||
@@ -1107,7 +1137,7 @@ module.exports = {
|
||||
});
|
||||
} else {
|
||||
// update existing masternode in local collection
|
||||
Masternode.updateOne({ txhash: masternode.txhash, outidx: masternode.outidx }, masternode, function (err) {
|
||||
Masternode.updateOne({ txhash: (masternode.proTxHash != null ? masternode.proTxHash : masternode.txhash) }, masternode, function (err) {
|
||||
if (err) {
|
||||
console.log(err);
|
||||
return cb(false);
|
||||
@@ -1118,9 +1148,9 @@ module.exports = {
|
||||
}
|
||||
},
|
||||
|
||||
// find masternode by txid and offset
|
||||
find_masternode: function (txhash, outidx, cb) {
|
||||
Masternode.findOne({ txhash: txhash, outidx: outidx }, function (err, masternode) {
|
||||
// find masternode by txid
|
||||
find_masternode: function (txhash, cb) {
|
||||
Masternode.findOne({ txhash: txhash }, function (err, masternode) {
|
||||
if (err)
|
||||
return cb(null);
|
||||
else {
|
||||
|
||||
@@ -12,7 +12,9 @@ var MasternodeSchema = new Schema({
|
||||
lastseen: { type: Number, default: 0 },
|
||||
activetime: { type: Number, default: 0 },
|
||||
lastpaid: { type: Number, default: 0 },
|
||||
claim_name: { type: String, default: '', index: true }
|
||||
claim_name: { type: String, default: '', index: true },
|
||||
ip_address: { type: String, default: '', index: true },
|
||||
last_paid_block: {type: Number, default: 0}
|
||||
}, {id: false});
|
||||
|
||||
module.exports = mongoose.model('Masternode', MasternodeSchema);
|
||||
+13
-3
@@ -209,14 +209,24 @@ if (database == 'peers') {
|
||||
} else {
|
||||
lib.get_masternodelist(function (body) {
|
||||
if (body != null) {
|
||||
lib.syncLoop(body.length, function (loop) {
|
||||
var isObject = false;
|
||||
var objectKeys = null;
|
||||
|
||||
// Check if the masternode data is an array or an object
|
||||
if (body.length == null) {
|
||||
// Process data as an object
|
||||
objectKeys = Object.keys(body);
|
||||
isObject = true;
|
||||
}
|
||||
|
||||
lib.syncLoop((isObject ? objectKeys : body).length, function (loop) {
|
||||
var i = loop.iteration();
|
||||
|
||||
db.save_masternode(body[i], function (success) {
|
||||
db.save_masternode((isObject ? body[objectKeys[i]] : body[i]), function (success) {
|
||||
if (success)
|
||||
loop.next();
|
||||
else {
|
||||
console.log('error: cannot save masternode %s.', (body[i].addr ? body[i].addr : 'UNKNOWN'));
|
||||
console.log('error: cannot save masternode %s.', (isObject ? (body[objectKeys[i]].payee ? body[objectKeys[i]].payee : 'UNKNOWN') : (body[i].addr ? body[i].addr : 'UNKNOWN')));
|
||||
exit();
|
||||
}
|
||||
});
|
||||
|
||||
+37
-14
@@ -27,6 +27,7 @@ block content
|
||||
return ('0' + dy).slice(-2) + " day" + (('0' + dy).slice(-2) == 1 ? "" : "s") + " " + ('0' + h).slice(-2) + "h " + ('0' + m).slice(-2) + "m " + ('0' + s).slice(-2) + "s";
|
||||
}
|
||||
$(document).ready(function() {
|
||||
var useNewDashFormat = false;
|
||||
var labels = !{JSON.stringify(settings.labels)};
|
||||
var ctable = $('#masternodes-table').dataTable({
|
||||
autoWidth: true,
|
||||
@@ -70,34 +71,42 @@ block content
|
||||
json[i]['addr'] = '<div><label class="badge badge-default" style="margin-bottom:10px;">' + labels[addr].label + (labels[addr].url ? '<a href="' + labels[addr].url + '" target="_blank", alt="Visit site", title="Visit site" data-toggle="tooltip" data-placement="top"><span class="fa fa-question-circle" style="margin-left:5px"></span></a>' : '') + '</label></div>' + json[i]['addr'];
|
||||
}
|
||||
}
|
||||
|
||||
useNewDashFormat = json.length > 0 && json[0].ip_address != null && json[0].ip_address != '';
|
||||
|
||||
return json;
|
||||
}
|
||||
},
|
||||
columns: [
|
||||
{ data: 'rank' },
|
||||
{ data: 'network' },
|
||||
{ data: 'addr' },
|
||||
{ data: 'version' },
|
||||
{ data: 'lastseen' },
|
||||
{ data: 'lastpaid' },
|
||||
{ data: 'activetime' },
|
||||
{ data: 'status' }
|
||||
{ name: 'rank', data: 'rank', className: "rankCol" },
|
||||
{ name: 'network', data: 'network', className: "networkCol" },
|
||||
{ name: 'ip_address', data: 'ip_address', className: "ipAddressCol" },
|
||||
{ name: 'addr', data: 'addr', className: "addressCol" },
|
||||
{ name: 'version', data: 'version', className: "versionCol" },
|
||||
{ name: 'lastseen', data: 'lastseen', className: "lastSeenCol" },
|
||||
{ name: 'lastpaid', data: 'lastpaid', className: "lastPaidCol" },
|
||||
{ name: 'last_paid_block', data: 'last_paid_block', className: "lastPaidBlockCol" },
|
||||
{ name: 'activetime', data: 'activetime', className: "activeTimeCol" },
|
||||
{ name: 'status', data: 'status', className: "statusCol" }
|
||||
],
|
||||
rowCallback: function(row, data, index) {
|
||||
$("td:eq(2)", row).addClass("breakWord");
|
||||
$("td.addressCol", row).addClass("breakWord");
|
||||
|
||||
if (useNewDashFormat)
|
||||
$("td.ipAddressCol", row).addClass("breakWord");
|
||||
|
||||
switch (data['status'].toUpperCase()) {
|
||||
case 'ENABLED':
|
||||
$("td:eq(7)", row).addClass('bg-success');
|
||||
$("td.statusCol", row).addClass('bg-success');
|
||||
break;
|
||||
case 'REMOVE':
|
||||
$("td:eq(7)", row).addClass('bg-danger');
|
||||
$("td.statusCol", row).addClass('bg-danger');
|
||||
break;
|
||||
case 'EXPIRED':
|
||||
$("td:eq(7)", row).addClass('bg-warning');
|
||||
$("td.statusCol", row).addClass('bg-warning');
|
||||
break;
|
||||
default:
|
||||
$("td:eq(7)", row).addClass('bg-info');
|
||||
$("td.statusCol", row).addClass('bg-info');
|
||||
break;
|
||||
}
|
||||
},
|
||||
@@ -105,6 +114,18 @@ block content
|
||||
fixDataTableColumns();
|
||||
fixFooterHeightAndPosition();
|
||||
enableTooltips();
|
||||
},
|
||||
fnInitComplete: function(settings, json) {
|
||||
setTimeout(function () {
|
||||
// Hide/show columns based on which Dash masternode format is used
|
||||
ctable.api().column('rank:name').visible(!useNewDashFormat, false);
|
||||
ctable.api().column('network:name').visible(!useNewDashFormat, false);
|
||||
ctable.api().column('version:name').visible(!useNewDashFormat, false);
|
||||
ctable.api().column('lastseen:name').visible(!useNewDashFormat, false);
|
||||
ctable.api().column('activetime:name').visible(!useNewDashFormat, false);
|
||||
ctable.api().column('ip_address:name').visible(useNewDashFormat, false);
|
||||
ctable.api().column('last_paid_block:name').visible(useNewDashFormat);
|
||||
}, 0);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -161,10 +182,12 @@ block content
|
||||
tr
|
||||
th.text-center Pay rank
|
||||
th.text-center Protocol
|
||||
th.text-center Address
|
||||
th.text-center IP address
|
||||
th.text-center Wallet address
|
||||
th.text-center Protocol
|
||||
th.text-center Last seen
|
||||
th.text-center Last paid
|
||||
th.text-center Last paid block
|
||||
th.text-center Active since
|
||||
th.text-center Status
|
||||
tbody.text-center
|
||||
Reference in New Issue
Block a user