You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
378 lines
14 KiB
378 lines
14 KiB
// twister_network.js |
|
// 2013 Miguel Freitas |
|
// |
|
// Provides functions for periodic network status check |
|
// Interface to network.html page. |
|
|
|
var twisterVersion; |
|
var twisterDisplayVersion; |
|
var twisterdConnections = 0; |
|
var twisterdAddrman = 0; |
|
var twisterDhtNodes = 0; |
|
var twisterdBlocks = 0; |
|
var twisterdLastBlockTime = 0; |
|
var twisterdConnectedAndUptodate = false; |
|
var genproclimit = 1; |
|
|
|
// --- |
|
|
|
function formatDecimal(value) { |
|
if (!value) return '0'; |
|
var exponent = Math.floor(Math.log(value) / Math.LN10), |
|
scale = (exponent < 2) ? Math.pow(10, 2 - exponent) : 1; |
|
return Math.round(value * scale) / scale; |
|
} |
|
function formatSize(value) { |
|
if (value<1024) return value + ' B'; |
|
if (value<1024*1024) return formatDecimal(value/1024) + ' KB'; |
|
if (value<1024*1024*1024) return formatDecimal(value/(1024*1024)) + ' MB'; |
|
if (value<1024*1024*1024*1024) return formatDecimal(value/(1024*1024*1024)) + ' GB'; |
|
return formatDecimal(value/(1024*1024*1024*1024)) + ' TB'; |
|
} |
|
function formatSpeed(total, rate) { |
|
return formatSize(total) + ' @ ' + formatSize(rate) + '/s' |
|
} |
|
|
|
function requestNetInfo(cbFunc, cbArg) { |
|
twisterRpc("getinfo", [], |
|
function(args, ret) { |
|
twisterdConnections = ret.connections; |
|
twisterdAddrman = ret.addrman_total; |
|
twisterdBlocks = ret.blocks; |
|
twisterDhtNodes = ret.dht_nodes; |
|
twisterVersion = ("0000000" + ret.version).slice(-8); |
|
twisterDisplayVersion = twisterVersion.slice(0,2) + '.' + |
|
twisterVersion.slice(2,4) + '.' + |
|
twisterVersion.slice(4,6) + '.' + |
|
twisterVersion.slice(6,8); |
|
|
|
$(".connection-count").text(twisterdConnections); |
|
$(".known-peers").text(twisterdAddrman); |
|
$(".blocks").text(twisterdBlocks); |
|
$(".dht-nodes").text(twisterDhtNodes); |
|
$(".userMenu-dhtindicator a").text(twisterDhtNodes); |
|
$(".version").text(twisterDisplayVersion); |
|
|
|
if( ret.proxy !== undefined && ret.proxy.length ) { |
|
$(".proxy").text(ret.proxy); |
|
$(".using-proxy").show(); |
|
$(".not-using-proxy").hide(); |
|
} else { |
|
$(".ext-ip").text(ret.ext_addr_net1); |
|
$(".ext-port1").text(ret.ext_port1); |
|
$(".ext-port2").text(ret.ext_port2); |
|
$(".test-ext-port1").attr("href","http://www.yougetsignal.com/tools/open-ports/?port=" + ret.ext_port1); |
|
$(".test-ext-port2").attr("href","http://www.yougetsignal.com/tools/open-ports/?port=" + ret.ext_port2); |
|
$(".using-proxy").hide(); |
|
$(".not-using-proxy").show(); |
|
} |
|
|
|
$(".dht-torrents").text(ret.dht_torrents); |
|
$(".num-peers").text(ret.num_peers); |
|
$(".peerlist-size").text(ret.peerlist_size); |
|
$(".num-active-requests").text(ret.num_active_requests); |
|
|
|
$(".download-rate").text(formatSpeed(ret.total_download, ret.download_rate)); |
|
$(".upload-rate").text(formatSpeed(ret.total_upload, ret.upload_rate)); |
|
$(".dht-download-rate").text(formatSpeed(ret.total_dht_download, ret.dht_download_rate)); |
|
$(".dht-upload-rate").text(formatSpeed(ret.total_dht_upload, ret.dht_upload_rate)); |
|
$(".ip-overhead-download-rate").text(formatSpeed(ret.total_ip_overhead_download, ret.ip_overhead_download_rate)); |
|
$(".ip-overhead-upload-rate").text(formatSpeed(ret.total_ip_overhead_upload, ret.ip_overhead_upload_rate)); |
|
$(".payload-download-rate").text(formatSpeed(ret.total_payload_download, ret.payload_download_rate)); |
|
$(".payload-upload-rate").text(formatSpeed(ret.total_payload_upload, ret.payload_upload_rate)); |
|
|
|
if( !twisterdConnections ) { |
|
$.MAL.setNetworkStatusMsg(polyglot.t("Connection lost."), false); |
|
twisterdConnectedAndUptodate = false; |
|
} |
|
|
|
if( args.cbFunc ) |
|
args.cbFunc(args.cbArg); |
|
}, {cbFunc:cbFunc, cbArg:cbArg}, |
|
function(args, ret) { |
|
console.log("Error connecting to local twister daemon."); |
|
}, {}); |
|
|
|
twisterRpc("getpeerinfo", [], |
|
function(args, ret) { |
|
|
|
let connections = $(".connections > table > tbody"); |
|
|
|
connections.html(''); |
|
|
|
$.each(ret, function() { |
|
connections.append( |
|
$('<tr/>').append( |
|
$('<td/>').text( |
|
this.addr |
|
) |
|
).append( |
|
$('<td/>').text( |
|
this.subver |
|
) |
|
).append( |
|
$('<td/>').text( |
|
this.startingheight |
|
) |
|
).append( |
|
$('<td/>').text( |
|
this.bytessent / 1000 |
|
) |
|
).append( |
|
$('<td/>').text( |
|
this.bytesrecv / 1000 |
|
) |
|
) |
|
); |
|
}); |
|
}, {cbFunc:cbFunc, cbArg:cbArg}, |
|
function(args, ret) { |
|
console.log("Error connecting to local twister daemon."); |
|
}, {}); |
|
} |
|
|
|
function peerKeypress() { |
|
var peer = $(".new-peer-addr").val(); |
|
var $button = $(".add-peer"); |
|
if( peer.length ) { |
|
$.MAL.enableButton( $button ); |
|
} else { |
|
$.MAL.disableButton( $button ); |
|
} |
|
} |
|
|
|
function dnsKeypress() { |
|
var peer = $(".new-dns-addr").val(); |
|
var $button = $(".add-dns"); |
|
if( peer.length ) { |
|
$.MAL.enableButton( $button ); |
|
} else { |
|
$.MAL.disableButton( $button ); |
|
} |
|
} |
|
|
|
function addPeerClick() { |
|
var peer = $(".new-peer-addr").val(); |
|
twisterRpc("addnode", [peer, "onetry"], |
|
function(args, ret) { |
|
$(".new-peer-addr").val("") |
|
}, {}, |
|
function(args, ret) { |
|
alert(polyglot.t("error", { error: ret.message })); |
|
}, {}); |
|
} |
|
|
|
function addDNSClick() { |
|
var dns = $(".new-dns-addr").val(); |
|
twisterRpc("adddnsseed", [dns], |
|
function(args, ret) { |
|
$(".new-dns-addr").val("") |
|
}, {}, |
|
function(args, ret) { |
|
alert(polyglot.t("error", { error: ret.message })); |
|
}, {}); |
|
} |
|
|
|
function requestBestBlock(cbFunc, cbArg) { |
|
twisterRpc("getbestblockhash", [], |
|
function(args, hash) { |
|
requestBlock(hash, args.cbFunc, args.cbArg); |
|
}, {cbFunc:cbFunc, cbArg:cbArg}, |
|
function(args, ret) { |
|
console.log("getbestblockhash error"); |
|
}, {}); |
|
} |
|
|
|
function requestNthBlock(n, cbFunc, cbArg) { |
|
twisterRpc("getblockhash", [n], |
|
function(args, hash) { |
|
requestBlock(hash, args.cbFunc, args.cbArg); |
|
}, {cbFunc:cbFunc, cbArg:cbArg}, |
|
function(args, ret) { |
|
console.log("getblockhash error"); |
|
}, {}); |
|
} |
|
|
|
function requestBlock(hash, cbFunc, cbArg) { |
|
twisterRpc("getblock", [hash], |
|
function(args, block) { |
|
if( args.cbFunc ) |
|
args.cbFunc(block, args.cbArg); |
|
}, {cbFunc:cbFunc, cbArg:cbArg}, |
|
function(args, ret) { |
|
console.log("requestBlock error"); |
|
}, {}); |
|
} |
|
|
|
function networkUpdate(cbFunc, cbArg) { |
|
requestNetInfo(function () { |
|
requestBestBlock(function(block, args) { |
|
|
|
twisterdLastBlockTime = block.time; |
|
$(".last-block-time").text(timeGmtToText(twisterdLastBlockTime)); |
|
|
|
var curTime = new Date().getTime() / 1000; |
|
if (twisterdConnections) { |
|
if (twisterdLastBlockTime > curTime + 3600) { |
|
$.MAL.setNetworkStatusMsg(polyglot.t("Last block is ahead of your computer time, check your clock."), false); |
|
twisterdConnectedAndUptodate = false; |
|
} else if (twisterdLastBlockTime > curTime - (2 * 3600)) { |
|
if (twisterDhtNodes) { |
|
$.MAL.setNetworkStatusMsg(polyglot.t("Block chain is up-to-date, twister is ready to use!"), true); |
|
twisterdConnectedAndUptodate = true; |
|
} else { |
|
$.MAL.setNetworkStatusMsg(polyglot.t("DHT network down."), false); |
|
twisterdConnectedAndUptodate = true; |
|
} |
|
} else { |
|
var daysOld = (curTime - twisterdLastBlockTime) / (3600 * 24); |
|
$.MAL.setNetworkStatusMsg(polyglot.t("downloading_block_chain", {days: daysOld.toFixed(2)}), false); |
|
// don't alarm user if blockchain is just a little bit behind |
|
twisterdConnectedAndUptodate = (daysOld < 2); |
|
} |
|
} |
|
if (args.cbFunc) |
|
args.cbFunc(args.cbArg); |
|
}, {cbFunc:cbFunc, cbArg:cbArg} ); |
|
}); |
|
} |
|
|
|
function getMiningInfo(cbFunc, cbArg) { |
|
twisterRpc("getmininginfo", [], |
|
function(args, ret) { |
|
miningDifficulty = ret.difficulty; |
|
miningHashRate = ret.hashespersec; |
|
genproclimit = ret.genproclimit; |
|
|
|
$(".mining-difficulty").text(miningDifficulty); |
|
$(".mining-hashrate").text(miningHashRate); |
|
/* |
|
if( !twisterdConnections ) { |
|
$.MAL.setNetworkStatusMsg("Connection lost.", false); |
|
twisterdConnectedAndUptodate = false; |
|
} |
|
*/ |
|
if( args.cbFunc ) |
|
args.cbFunc(args.cbArg); |
|
}, {cbFunc:cbFunc, cbArg:cbArg}, |
|
function(args, ret) { |
|
console.log("Error connecting to local twister daemon."); |
|
}, {}); |
|
} |
|
|
|
function miningUpdate(cbFunc, cbArg) { |
|
getMiningInfo(cbFunc, cbArg); |
|
} |
|
|
|
function getGenerate() { |
|
twisterRpc("getgenerate", [], |
|
function(args, ret) { |
|
var $genblock = $("select.genblock"); |
|
if( ret ) { |
|
$genblock.val("enable"); |
|
} else { |
|
$genblock.val("disable"); |
|
} |
|
}, {}, |
|
function(args, ret) { |
|
console.log("getgenerate error"); |
|
}, {}); |
|
} |
|
|
|
function setGenerate() { |
|
var params = []; |
|
params.push($("select.genblock").val() == "enable"); |
|
params.push(parseInt($(".genproclimit").val())); |
|
twisterRpc("setgenerate", params, |
|
function(args, ret) { |
|
console.log("setgenerate updated"); |
|
}, {}, |
|
function(args, ret) { |
|
console.log("getgenerate error"); |
|
}, {}); |
|
} |
|
|
|
function getSpamMsg() { |
|
twisterRpc("getspammsg", [], |
|
function(args, ret) { |
|
var $postArea = $(".spam-msg"); |
|
var $localUsersList = $("select.local-usernames.spam-user"); |
|
$postArea.val(ret[1]); |
|
$localUsersList.val(ret[0]); |
|
}, {}, |
|
function(args, ret) { |
|
console.log("getgenerate error"); |
|
}, {}); |
|
} |
|
|
|
function setSpamMsg(event) { |
|
event.stopPropagation(); |
|
event.preventDefault(); |
|
|
|
var btnUpdate = $(event.target); |
|
$.MAL.disableButton(btnUpdate); |
|
|
|
var params = [$("select.local-usernames.spam-user").val(), |
|
btnUpdate.closest('.post-area-new').find('textarea.spam-msg').val().trim()]; |
|
|
|
twisterRpc("setspammsg", params, |
|
function(args, ret) {console.log("setspammsg updated");}, {}, |
|
function(args, ret) {console.log("setspammsg error");}, {} |
|
); |
|
} |
|
|
|
function exitDaemon() { |
|
$( ".terminate-daemon").text("Exiting..."); |
|
$.MAL.disableButton( $( ".terminate-daemon") ); |
|
|
|
twisterRpc("stop", undefined, |
|
function(args, ret) { |
|
console.log("daemon exiting"); |
|
|
|
setTimeout(function _reload_after_exit() { |
|
window.location.href = '/abort.html'; |
|
}, 2000); |
|
}, {}, |
|
function(args, ret) { |
|
console.log("error while exiting daemon"); |
|
}, {}); |
|
} |
|
|
|
// handlers common to both desktop and mobile |
|
function interfaceNetworkHandlers() { |
|
$('.new-peer-addr').on('keyup', peerKeypress); |
|
$('.new-dns-addr').on('keyup', dnsKeypress); |
|
$('.add-peer').on('click', addPeerClick); |
|
$('.add-dns').on('click', addDNSClick); |
|
$('select.genblock').on('change', setGenerate); |
|
$('.genproclimit').on('change', setGenerate); |
|
$('.post-submit.update-spam-msg').off('click').on('click', setSpamMsg); |
|
$('.terminate-daemon').on('click', |
|
{txtMessage: {polyglot: 'confirm_terminate_daemon'}, cbConfirm: exitDaemon}, confirmPopup); |
|
} |
|
|
|
|
|
function initInterfaceNetwork() { |
|
initInterfaceCommon(); |
|
initUser( function () { |
|
getSpamMsg(); |
|
|
|
if( defaultScreenName ) { |
|
loadFollowing( function() { |
|
initMentionsCount(); |
|
initDMsCount(); |
|
}); |
|
} |
|
}); |
|
networkUpdate(); |
|
setInterval("networkUpdate()", 2000); |
|
|
|
miningUpdate( function() { |
|
$(".genproclimit").val(genproclimit); |
|
}); |
|
setInterval("miningUpdate()", 2000); |
|
|
|
getGenerate(); |
|
|
|
interfaceNetworkHandlers(); |
|
}
|
|
|