diff --git a/www/i18n/locale-en.json b/www/i18n/locale-en.json index 58648623ddcd7cf936e9105590e79ba032175b9e..8fef23040cd5edb9c57fed47e75f372472d26847 100644 --- a/www/i18n/locale-en.json +++ b/www/i18n/locale-en.json @@ -112,6 +112,7 @@ "REMEMBER_ME": "Remember me", "PLUGINS_SETTINGS": "Extensions", "BTN_RESET": "Restore default values", + "EXPERT_MODE": "Enable expert mode<span class=\"hidden-xs\"> (Display more details on peers)</span>", "POPUP_NODE": { "TITLE" : "Duniter Node", "HELP" : "Set the address of the node to use:" diff --git a/www/i18n/locale-fr-FR.json b/www/i18n/locale-fr-FR.json index 90cdf8d3ba84d7c49ead890cd728030c9c111b2a..a4a13b1229c9eecb878872ede21a8ba3ac5dd409 100644 --- a/www/i18n/locale-fr-FR.json +++ b/www/i18n/locale-fr-FR.json @@ -112,6 +112,7 @@ "REMEMBER_ME": "Se souvenir de moi", "PLUGINS_SETTINGS": "Extensions", "BTN_RESET": "Restaurer les valeurs par défaut", + "EXPERT_MODE": "Activer le mode expert<span class=\"hidden-xs\"> (Informations détaillées sur les noeuds)</span>", "POPUP_NODE": { "TITLE" : "Noeud Duniter", "HELP" : "Saisissez l'adresse du noeud que vous voulez utiliser :" diff --git a/www/js/controllers/currency-controllers.js b/www/js/controllers/currency-controllers.js index 3767e3618c12be4cc101bed998696cfcef3ad497..5676ac627163399a23e2a9cdf1cc69b2388cd8f4 100644 --- a/www/js/controllers/currency-controllers.js +++ b/www/js/controllers/currency-controllers.js @@ -107,6 +107,7 @@ function CurrencyViewController($scope, $q, $translate, $timeout, BMA, UIUtils, $scope.medianTime = 0; $scope.difficulty = 0; $scope.Nprev = 0; + $scope.screen = UIUtils.screen; $scope.$on('$ionicView.enter', function(e, $state) { $translate(['COMMON.DATE_PATTERN']) diff --git a/www/js/services/bma-services.js b/www/js/services/bma-services.js index aff598f0513c2c45e2700945ed1d305a0d89c6b8..422d3fdfc2944eff35f3ff577576d46ad25d248b 100644 --- a/www/js/services/bma-services.js +++ b/www/js/services/bma-services.js @@ -261,7 +261,7 @@ angular.module('cesium.bma.services', ['ngResource', 'cesium.http.services', 'ce return { node: { - summary: csHttp.get(host, port, '/node/summary'), + summary: csHttp.getWithCache(host, port, '/node/summary', csHttp.cache.LONG), server: server, host: host, port: port, @@ -299,6 +299,7 @@ angular.module('cesium.bma.services', ['ngResource', 'cesium.http.services', 'ce ud: getBlockchainWithUd, tx: csHttp.get(host, port, '/blockchain/with/tx'), newcomers: csHttp.get(host, port, '/blockchain/with/newcomers'), + hardship: csHttp.get(host, port, '/blockchain/hardship/:pubkey'), }, lastUd: getBlockchainLastUd }, diff --git a/www/js/services/network-services.js b/www/js/services/network-services.js index ee6863e5f75c4f0f60b3e8347d4fc8b93e0a4842..f923e85500f9210a1e1b6db6d9ee1a2b63a6a87e 100644 --- a/www/js/services/network-services.js +++ b/www/js/services/network-services.js @@ -1,7 +1,7 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.services']) -.factory('csNetwork', function($rootScope, $q, $interval, $timeout, BMA, Api) { +.factory('csNetwork', function($rootScope, $q, $interval, $timeout, BMA, Api, csSettings) { 'ngInject'; factory = function(id) { @@ -83,42 +83,66 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se score += (100000000 * (peer.online ? 1 : 0)); score += (10000000 * (peer.hasMainConsensusBlock ? 1 : 0)); score += (1000 * (peer.hasConsensusBlock ? currents[peer.buid] : 0)); - score += (1 * (peer.uid ? peer.uid.charCodeAt(0) : 0)); // alphabetical order + score += (-1 * (peer.uid ? peer.uid.charCodeAt(0) : 999)); // alphabetical order return -score; }); }, - processPeer = function(peer) { - if (peer) { - peer = new Peer(peer); - var server = peer.getServer(); - // Test each peer only once - if (!data.knownPeers[server]) { - data.knownPeers[server] = true; - peer.dns = peer.getDns(); - peer.server = server; - peer.blockNumber = peer.block.replace(/-.+$/, ''); - data.newPeers.push(peer); - var node = BMA.instance(peer.getHost(), peer.getPort(), false); - return node.blockchain.current() - .then(function(block){ - peer.currentNumber = block.number; - peer.online = true; - peer.buid = buid(block); - peer.uid = data.uidsByPubkeys[peer.pubkey]; - if (data.knownBlocks.indexOf(peer.buid) === -1) { - data.knownBlocks.push(peer.buid); - } - console.debug('[network] Peer [' + server + '] status [UP] block [' + peer.buid.substring(0, 20) + ']'); + processPeer = function(peer, refresh) { + if (!peer) return; + peer = new Peer(peer); + var server = peer.getServer(); + // Test each peer only once + if (!refresh && data.knownPeers[server]) return; + var skipPushToNew = refresh && !data.knownPeers[server]; + data.knownPeers[server] = true; + peer.dns = peer.getDns(); + peer.server = server; + peer.blockNumber = peer.block.replace(/-.+$/, ''); + peer.uid = data.uidsByPubkeys[peer.pubkey]; + var node = BMA.instance(peer.getHost(), peer.getPort(), false); + var jobs = [ + node.blockchain.current() + .then(function(block){ + peer.currentNumber = block.number; + peer.online = true; + peer.buid = buid(block); + if (data.knownBlocks.indexOf(peer.buid) === -1) { + data.knownBlocks.push(peer.buid); + } + }) + ]; + if (csSettings.data.expertMode) { + // Get Version + jobs.push(node.node.summary() + .then(function(res){ + peer.version = res && res.duniter && res.duniter.version; + })); + + // Get hardship + if (peer.uid) { + jobs.push(node.blockchain.stats.hardship({pubkey: peer.pubkey}) + .then(function(res){ + peer.level = res && res.level; + }).catch(function() { + peer.level = null; }) - .catch(function(err) { - // node is DOWN - peer.online=false; - peer.buid = null; - console.debug('[network] Peer [' + server + '] status [DOWN]'); - }); + ); } } + $q.all(jobs) + .then(function() { + if (!skipPushToNew) data.newPeers.push(peer); + console.debug('[network] Peer [' + server + '] status [UP] block [' + peer.buid.substring(0, 20) + ']'); + }) + .catch(function(err) { + // node is DOWN + peer.online=false; + peer.buid = null; + peer.uid = data.uidsByPubkeys[peer.pubkey]; + if (!skipPushToNew) data.newPeers.push(peer); + console.debug('[network] Peer [' + server + '] status [DOWN]'); + }); }, refreshPeers = function() { @@ -170,6 +194,7 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se }, startListeningOnSocket = function() { + // Listen for new block data.bma.websocket.block().on('block', function(block) { if (data.updatingPeers) return; var uid = buid(block); @@ -188,11 +213,20 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se } } }); + // Listen for new peer data.bma.websocket.peer().on('peer', function(peer) { - processPeer(peer); - if (!data.updatingPeers) { - sortPeers(); - } + // Waiting block propagation + $timeout(function() { + var promise = processPeer(peer, true); + if (promise) promise.then(function() { + if (!data.updatingPeers && data.newPeers.length) { + data.peers = data.peers.concat(data.newPeers.splice(0)); + console.debug('[network] New peers found: sort and ad them to result...'); + } + sortPeers(); + api.data.raise.changed(data); // send event to plugins + }, 500); + }) }); }, diff --git a/www/js/services/settings-services.js b/www/js/services/settings-services.js index 9e5cea9ff14b7c7175c5cd5162f0b66e91bb0517..0669160d242930c4f2edef608896be51346abada 100644 --- a/www/js/services/settings-services.js +++ b/www/js/services/settings-services.js @@ -28,6 +28,7 @@ angular.module('cesium.settings.services', ['ngResource', 'ngApi', 'cesium.confi showUDHistory: true, showLoginSalt: false, initPhase: false, // For currency start (when block #0 not written) + expertMode: true, helptip: { enable: true, currency: 0, diff --git a/www/plugins/es/js/controllers/wot-controllers.js b/www/plugins/es/js/controllers/wot-controllers.js index c91c1b57a09b9390d132b6bcf0ddb15769354433..de681fe99847460d3e13d63db64e84975f8e9197 100644 --- a/www/plugins/es/js/controllers/wot-controllers.js +++ b/www/plugins/es/js/controllers/wot-controllers.js @@ -26,7 +26,7 @@ angular.module('cesium.es.wot.controllers', ['cesium.es.services']) ; -function ESWotIdentityViewController($scope, csSettings, PluginService, esModals) { +function ESWotIdentityViewController($scope, csSettings, PluginService, esModals, UIUtils) { 'ngInject'; $scope.extensionPoint = PluginService.extensions.points.current.get(); @@ -48,6 +48,7 @@ function ESWotIdentityViewController($scope, csSettings, PluginService, esModals $scope.showNewMessageModal = function() { return $scope.loadWallet() .then(function() { + UIUtils.loading.hide(); return esModals.showMessageCompose({ destPub: $scope.formData.pubkey, destUid: $scope.formData.name||$scope.formData.uid diff --git a/www/templates/currency/tabs/view_network.html b/www/templates/currency/tabs/view_network.html index 321aeddae34e2edcb6010643c2c7ac77de1ef628..e905439f3b2dc486f0f72f54197deda6c8d5101d 100644 --- a/www/templates/currency/tabs/view_network.html +++ b/www/templates/currency/tabs/view_network.html @@ -10,11 +10,24 @@ <a class="peer-item item item-icon-left" ng-repeat="peer in peers track by peer.server" - ng-class="{ assertive: !peer.online, balanced: (peer.online && peer.hasMainConsensusBlock), energized: (peer.online && !peer.hasMainConsensusBlock) }" + ng-class="{ assertive: !peer.online, balanced: (peer.online && peer.hasMainConsensusBlock), energized: (peer.online && !peer.hasMainConsensusBlock)}" ui-sref="app.view_peer({server: peer.server})"> <i class="icon ion-android-globe"></i> - <h3><span ng-class="{ positive: peer.uid }">{{peer.uid || peer.pubkey.substr(0,8)}}</span> <span class="gray">{{peer.dns && ' | ' + peer.dns}}</span></h3> - <h4>{{peer.server}}</h4> - <span class="badge" ng-class="{ 'badge-balanced': peer.hasMainConsensusBlock, 'badge-energized': peer.hasConsensusBlock }">{{peer.currentNumber}}</span> + <div class="row no-padding"> + <div class="col no-padding"> + <h3><i ng-class="{'ion-person': peer.uid, 'ion-key': !peer.uid}"></i> {{peer.uid || peer.pubkey.substr(0,8)}}</span> <span class="gray">{{peer.dns && ' | ' + peer.dns}}</h3> + <h4>{{peer.server}}</h4> + </div> + <div class="col col-10 no-padding" ng-if="settings.expertMode"> + <h3 class="hidden-sm hidden-xs hidden-md"> + <span ng-class="{balanced: peer.level <= 100, energized: peer.level > 100 && peer.level <= 200, assertive: peer.level > 200}" + ng-if="peer.level"><i class="ion-lock-combination"></i> {{peer.level}}</span> + </h3> + <h4 class="hidden-sm hidden-xs hidden-md gray">v{{peer.version}}</h4> + </div> + <div class="col col-20 no-padding"> + <span class="badge" ng-class="{ 'badge-balanced': peer.hasMainConsensusBlock, 'badge-energized': peer.hasConsensusBlock }">{{peer.currentNumber}}</span> + </div> + </div> </a> </div> diff --git a/www/templates/settings/settings.html b/www/templates/settings/settings.html index 4997758fc9c92596e10a9d569fbdccb91860b0ac..29a99a253a11ec12c5496be5b910c46db218e694 100644 --- a/www/templates/settings/settings.html +++ b/www/templates/settings/settings.html @@ -40,7 +40,7 @@ </label> </div> - <label class="item item-input item-select"> + <label class="item item-input item-select"> <div class="input-label"> {{'COMMON.LANGUAGE' | translate}} </div> @@ -50,7 +50,7 @@ </select> </label> - <div class="item item-toggle dark"> + <div class="item item-toggle dark"> <div class="input-label"> {{'SETTINGS.USE_LOCAL_STORAGE' | translate}} </div> @@ -62,7 +62,7 @@ </label> </div> - <div class="item item-toggle dark"> + <div class="item item-toggle dark"> <div class="input-label" ng-bind-html="'SETTINGS.ENABLE_HELPTIP' | translate"> </div> <label class="toggle toggle-royal"> @@ -94,7 +94,7 @@ <span class="item item-divider" translate>SETTINGS.HISTORY_SETTINGS</span> - <div class="item item-toggle dark"> + <div class="item item-toggle dark"> <div class="input-label" translate>SETTINGS.DISPLAY_UD_HISTORY</div> <label class="toggle toggle-royal"> <input type="checkbox" ng-model="formData.showUDHistory" > @@ -109,12 +109,22 @@ <span class="item item-divider" translate>SETTINGS.NETWORK_SETTINGS</span> - <div class="item ink" ng-click="changeNode()"> + <div class="item ink" ng-click="changeNode()"> <div class="input-label"> {{'SETTINGS.NODE' | translate}} </div> <span class="item-note dark">{{getServer()}}</ng-if></span> </div> + <div class="item item-toggle dark hidden-sm hidden-xs hidden-md"> + <div class="input-label" ng-bind-html="'SETTINGS.EXPERT_MODE' | translate"></div> + <label class="toggle toggle-royal"> + <input type="checkbox" ng-model="formData.expertMode" > + <div class="track"> + <div class="handle"></div> + </div> + </label> + </div> + <!-- Allow extension here --> <cs-extension-point name="network"></cs-extension-point>