From f8c008ecd401bbd2a2dc3a70898507e6ffa04625 Mon Sep 17 00:00:00 2001 From: joeuhren Date: Mon, 3 May 2021 12:28:08 -0600 Subject: [PATCH] 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 --- bin/instance | 3 ++ lib/database.js | 78 ++++++++++++++++++++++++++++++------------- models/masternode.js | 4 ++- scripts/sync.js | 16 +++++++-- views/masternodes.pug | 51 ++++++++++++++++++++-------- 5 files changed, 110 insertions(+), 42 deletions(-) diff --git a/bin/instance b/bin/instance index ba841be..42f9389 100644 --- a/bin/instance +++ b/bin/instance @@ -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..'); diff --git a/lib/database.js b/lib/database.js index 037e6d2..7f2e94f 100644 --- a/lib/database.js +++ b/lib/database.js @@ -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 { diff --git a/models/masternode.js b/models/masternode.js index 8beb986..df2fe26 100644 --- a/models/masternode.js +++ b/models/masternode.js @@ -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); \ No newline at end of file diff --git a/scripts/sync.js b/scripts/sync.js index 9760999..cee99e3 100644 --- a/scripts/sync.js +++ b/scripts/sync.js @@ -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(); } }); diff --git a/views/masternodes.pug b/views/masternodes.pug index 350895a..927ff16 100644 --- a/views/masternodes.pug +++ b/views/masternodes.pug @@ -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'] = '
' + 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 \ No newline at end of file