Added statistics to main screen.
This commit is contained in:
@@ -37,6 +37,8 @@ const SQL_GET_LAST_FULL_BLOCK_FOR_KEY: &str = "SELECT * FROM blocks WHERE id < ?
|
|||||||
const SQL_GET_DOMAIN_OWNER_BY_ID: &str = "SELECT signing FROM domains WHERE id < ? AND identity = ? ORDER BY id DESC LIMIT 1;";
|
const SQL_GET_DOMAIN_OWNER_BY_ID: &str = "SELECT signing FROM domains WHERE id < ? AND identity = ? ORDER BY id DESC LIMIT 1;";
|
||||||
const SQL_GET_DOMAIN_BY_ID: &str = "SELECT * FROM domains WHERE identity = ? ORDER BY id DESC LIMIT 1;";
|
const SQL_GET_DOMAIN_BY_ID: &str = "SELECT * FROM domains WHERE identity = ? ORDER BY id DESC LIMIT 1;";
|
||||||
const SQL_GET_DOMAINS_BY_KEY: &str = "SELECT * FROM domains WHERE signing = ? ORDER BY id;";
|
const SQL_GET_DOMAINS_BY_KEY: &str = "SELECT * FROM domains WHERE signing = ? ORDER BY id;";
|
||||||
|
const SQL_GET_DOMAINS_COUNT: &str = "SELECT count(DISTINCT identity) FROM domains;";
|
||||||
|
const SQL_GET_USERS_COUNT: &str = "SELECT count(DISTINCT pub_key) FROM blocks;";
|
||||||
|
|
||||||
const SQL_GET_OPTIONS: &str = "SELECT * FROM options;";
|
const SQL_GET_OPTIONS: &str = "SELECT * FROM options;";
|
||||||
|
|
||||||
@@ -601,6 +603,22 @@ impl Chain {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_domains_count(&self) -> i64 {
|
||||||
|
let mut statement = self.db.prepare(SQL_GET_DOMAINS_COUNT).unwrap();
|
||||||
|
while let State::Row = statement.next().unwrap() {
|
||||||
|
return statement.read::<i64>(0).unwrap();
|
||||||
|
}
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_users_count(&self) -> i64 {
|
||||||
|
let mut statement = self.db.prepare(SQL_GET_USERS_COUNT).unwrap();
|
||||||
|
while let State::Row = statement.next().unwrap() {
|
||||||
|
return statement.read::<i64>(0).unwrap();
|
||||||
|
}
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_my_domains(&self, keystore: Option<&Keystore>) -> HashMap<Bytes, (String, i64, DomainData)> {
|
pub fn get_my_domains(&self, keystore: Option<&Keystore>) -> HashMap<Bytes, (String, i64, DomainData)> {
|
||||||
if keystore.is_none() {
|
if keystore.is_none() {
|
||||||
return HashMap::new();
|
return HashMap::new();
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@ pub enum Event {
|
|||||||
BlockchainChanged { index: u64 },
|
BlockchainChanged { index: u64 },
|
||||||
ActionStopMining,
|
ActionStopMining,
|
||||||
ActionQuit,
|
ActionQuit,
|
||||||
NetworkStatus { nodes: usize, blocks: u64 },
|
NetworkStatus { blocks: u64, domains: i64, keys: i64, nodes: usize },
|
||||||
Syncing { have: u64, height: u64 },
|
Syncing { have: u64, height: u64 },
|
||||||
SyncFinished,
|
SyncFinished,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -119,6 +119,7 @@ fn main() {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
info!("Blocks count: {}, domains count: {}, users count: {}", chain.get_height(), chain.get_domains_count(), chain.get_users_count());
|
||||||
let settings_copy = settings.clone();
|
let settings_copy = settings.clone();
|
||||||
let mut keys = Vec::new();
|
let mut keys = Vec::new();
|
||||||
if settings.key_files.len() > 0 {
|
if settings.key_files.len() > 0 {
|
||||||
|
|||||||
+14
-7
@@ -129,8 +129,10 @@ impl Network {
|
|||||||
token => {
|
token => {
|
||||||
if !handle_connection_event(Arc::clone(&context), &mut peers, &poll.registry(), &event) {
|
if !handle_connection_event(Arc::clone(&context), &mut peers, &poll.registry(), &event) {
|
||||||
let _ = peers.close_peer(poll.registry(), &token);
|
let _ = peers.close_peer(poll.registry(), &token);
|
||||||
let blocks_count = context.lock().unwrap().chain.get_height();
|
let blocks = context.lock().unwrap().chain.get_height();
|
||||||
post(crate::event::Event::NetworkStatus { nodes: peers.get_peers_active_count(), blocks: blocks_count });
|
let keys = context.lock().unwrap().chain.get_users_count();
|
||||||
|
let domains = context.lock().unwrap().chain.get_domains_count();
|
||||||
|
post(crate::event::Event::NetworkStatus { blocks, domains, keys, nodes: peers.get_peers_active_count() });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -151,13 +153,16 @@ impl Network {
|
|||||||
// Send pings to idle peers
|
// Send pings to idle peers
|
||||||
let (height, hash) = {
|
let (height, hash) = {
|
||||||
let context = context.lock().unwrap();
|
let context = context.lock().unwrap();
|
||||||
let height = context.chain.get_height();
|
let blocks = context.chain.get_height();
|
||||||
let nodes = peers.get_peers_active_count();
|
let nodes = peers.get_peers_active_count();
|
||||||
let banned = peers.get_peers_banned_count();
|
let banned = peers.get_peers_banned_count();
|
||||||
post(crate::event::Event::NetworkStatus { nodes, blocks: height });
|
|
||||||
|
let keys = context.chain.get_users_count();
|
||||||
|
let domains = context.chain.get_domains_count();
|
||||||
|
post(crate::event::Event::NetworkStatus { blocks, domains, keys, nodes });
|
||||||
|
|
||||||
if log_timer.elapsed().as_secs() > LOG_REFRESH_DELAY_SEC {
|
if log_timer.elapsed().as_secs() > LOG_REFRESH_DELAY_SEC {
|
||||||
info!("Active nodes count: {}, banned count: {}, blocks count: {}", nodes, banned, height);
|
info!("Active nodes count: {}, banned count: {}, blocks count: {}", nodes, banned, blocks);
|
||||||
let elapsed = last_events_time.elapsed().as_secs();
|
let elapsed = last_events_time.elapsed().as_secs();
|
||||||
if elapsed >= 10 {
|
if elapsed >= 10 {
|
||||||
warn!("Last network events time {} seconds ago", elapsed);
|
warn!("Last network events time {} seconds ago", elapsed);
|
||||||
@@ -168,7 +173,7 @@ impl Network {
|
|||||||
peers.connect_new_peers(poll.registry(), &mut unique_token, yggdrasil_only);
|
peers.connect_new_peers(poll.registry(), &mut unique_token, yggdrasil_only);
|
||||||
connect_timer = Instant::now();
|
connect_timer = Instant::now();
|
||||||
}
|
}
|
||||||
(height, context.chain.get_last_hash())
|
(blocks, context.chain.get_last_hash())
|
||||||
};
|
};
|
||||||
peers.update(poll.registry(), height, hash);
|
peers.update(poll.registry(), height, hash);
|
||||||
ui_timer = Instant::now();
|
ui_timer = Instant::now();
|
||||||
@@ -534,7 +539,9 @@ fn handle_block(context: Arc<Mutex<Context>>, peers: &mut Peers, token: &Token,
|
|||||||
let event = crate::event::Event::Syncing { have: my_height, height: max(max_height, my_height) };
|
let event = crate::event::Event::Syncing { have: my_height, height: max(max_height, my_height) };
|
||||||
post(event);
|
post(event);
|
||||||
}
|
}
|
||||||
post(crate::event::Event::NetworkStatus { nodes: peers_count, blocks: my_height });
|
let domains = context.chain.get_domains_count();
|
||||||
|
let keys = context.chain.get_users_count();
|
||||||
|
post(crate::event::Event::NetworkStatus { blocks: my_height, domains, keys, nodes: peers_count });
|
||||||
}
|
}
|
||||||
BlockQuality::Twin => { debug!("Ignoring duplicate block {}", block.index); }
|
BlockQuality::Twin => { debug!("Ignoring duplicate block {}", block.index); }
|
||||||
BlockQuality::Future => { debug!("Ignoring future block {}", block.index); }
|
BlockQuality::Future => { debug!("Ignoring future block {}", block.index); }
|
||||||
|
|||||||
+6
-3
@@ -303,11 +303,11 @@ fn action_loaded(context: &Arc<Mutex<Context>>, web_view: &mut WebView<()>) {
|
|||||||
format!("setLeftStatusBarText('Idle'); showMiningIndicator(false, false);")
|
format!("setLeftStatusBarText('Idle'); showMiningIndicator(false, false);")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Event::NetworkStatus { nodes, blocks } => {
|
Event::NetworkStatus { blocks, domains, keys, nodes } => {
|
||||||
if status.mining || status.syncing || nodes < 3 {
|
if status.mining || status.syncing || nodes < 3 {
|
||||||
format!("setRightStatusBarText('Nodes: {}, Blocks: {}')", nodes, blocks)
|
format!("setStats({}, {}, {}, {});", blocks, domains, keys, nodes)
|
||||||
} else {
|
} else {
|
||||||
format!("setLeftStatusBarText('Idle'); setRightStatusBarText('Nodes: {}, Blocks: {}')", nodes, blocks)
|
format!("setLeftStatusBarText('Idle'); setStats({}, {}, {}, {});", blocks, domains, keys, nodes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Event::BlockchainChanged {index} => {
|
Event::BlockchainChanged {index} => {
|
||||||
@@ -343,6 +343,9 @@ fn action_loaded(context: &Arc<Mutex<Context>>, web_view: &mut WebView<()>) {
|
|||||||
let _ = web_view.eval(&format!("zonesChanged('{}');", &zones));
|
let _ = web_view.eval(&format!("zonesChanged('{}');", &zones));
|
||||||
}
|
}
|
||||||
send_keys_to_ui(&c, &web_view.handle());
|
send_keys_to_ui(&c, &web_view.handle());
|
||||||
|
if let Err(e) = web_view.eval(&format!("setStats({}, {}, {}, {});", c.chain.get_height(), c.chain.get_domains_count(), c.chain.get_users_count(), 0)) {
|
||||||
|
error!("Error evaluating stats: {}", e);
|
||||||
|
}
|
||||||
event_info(web_view, "Application loaded");
|
event_info(web_view, "Application loaded");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+29
-2
@@ -82,6 +82,33 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p class="help">To mine domains you need to mine a strong pair of signing keys and a pair of encryption keys.</p>
|
<p class="help">To mine domains you need to mine a strong pair of signing keys and a pair of encryption keys.</p>
|
||||||
|
|
||||||
|
<nav class="level is-mobile">
|
||||||
|
<div class="level-item has-text-centered">
|
||||||
|
<div>
|
||||||
|
<p class="heading">Blocks in chain</p>
|
||||||
|
<p class="title" id="stat_blocks">?</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="level-item has-text-centered">
|
||||||
|
<div>
|
||||||
|
<p class="heading">Domains</p>
|
||||||
|
<p class="title" id="stat_domains">?</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="level-item has-text-centered">
|
||||||
|
<div>
|
||||||
|
<p class="heading">Users/Keys</p>
|
||||||
|
<p class="title" id="stat_keys">?</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="level-item has-text-centered">
|
||||||
|
<div>
|
||||||
|
<p class="heading">Connected nodes</p>
|
||||||
|
<p class="title" id="stat_nodes">0</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Domain mining -->
|
<!-- Domain mining -->
|
||||||
@@ -138,7 +165,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row status is-family-code">
|
<div class="row status is-family-code">
|
||||||
<div class="level">
|
<div class="level is-mobile">
|
||||||
<div class="level-left">
|
<div class="level-left">
|
||||||
<div class="level-item" id="indicator_parent">
|
<div class="level-item" id="indicator_parent">
|
||||||
<div class="busy_indicator busy_blue" id="busy_indicator" onclick="miningIndicatorClick(this)">
|
<div class="busy_indicator busy_blue" id="busy_indicator" onclick="miningIndicatorClick(this)">
|
||||||
@@ -152,7 +179,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="level-right">
|
<div class="level-right">
|
||||||
<div class="level-item" id="status_bar_right">No data</div>
|
<div class="level-item" id="status_bar_right">🚀</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -510,9 +510,11 @@ function setLeftStatusBarText(text) {
|
|||||||
bar.innerHTML = text;
|
bar.innerHTML = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setRightStatusBarText(text) {
|
function setStats(blocks, domains, keys, nodes) {
|
||||||
var bar = document.getElementById("status_bar_right");
|
document.getElementById("stat_blocks").innerHTML = blocks;
|
||||||
bar.innerHTML = text;
|
document.getElementById("stat_domains").innerHTML = domains;
|
||||||
|
document.getElementById("stat_keys").innerHTML = keys;
|
||||||
|
document.getElementById("stat_nodes").innerHTML = nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addEvent(type, time, message) {
|
function addEvent(type, time, message) {
|
||||||
|
|||||||
@@ -148,6 +148,12 @@ th, td {
|
|||||||
background-color: rgba(250, 250, 250, 0.7);
|
background-color: rgba(250, 250, 250, 0.7);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nav.level {
|
||||||
|
width: 100%;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 6em;
|
||||||
|
}
|
||||||
|
|
||||||
.list {
|
.list {
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user