mirror of
https://github.com/Cyrix126/gupaxx.git
synced 2024-12-22 22:59:27 +00:00
p2pool: add [Select random node] and [<- Last] & [Next ->] UI
This commit is contained in:
parent
166c89a8d1
commit
0e15f0a73a
3 changed files with 118 additions and 15 deletions
|
@ -197,6 +197,9 @@ pub const P2POOL_LOG: &str = "Verbosity of the console log";
|
||||||
pub const P2POOL_AUTO_NODE: &str = "Automatically ping the community Monero nodes at Gupax startup";
|
pub const P2POOL_AUTO_NODE: &str = "Automatically ping the community Monero nodes at Gupax startup";
|
||||||
pub const P2POOL_AUTO_SELECT: &str = "Automatically select the fastest community Monero node after pinging";
|
pub const P2POOL_AUTO_SELECT: &str = "Automatically select the fastest community Monero node after pinging";
|
||||||
pub const P2POOL_SELECT_FASTEST: &str = "Select the fastest community Monero node";
|
pub const P2POOL_SELECT_FASTEST: &str = "Select the fastest community Monero node";
|
||||||
|
pub const P2POOL_SELECT_RANDOM: &str = "Select a random community Monero node";
|
||||||
|
pub const P2POOL_SELECT_LAST: &str = "Select the previous community Monero node";
|
||||||
|
pub const P2POOL_SELECT_NEXT: &str = "Select the next community Monero node";
|
||||||
pub const P2POOL_PING: &str = "Ping the built-in community Monero nodes";
|
pub const P2POOL_PING: &str = "Ping the built-in community Monero nodes";
|
||||||
pub const P2POOL_ADDRESS: &str = "You must use a primary Monero address to mine on P2Pool (starts with a 4). It is highly recommended to create a new wallet since addresses are public on P2Pool!";
|
pub const P2POOL_ADDRESS: &str = "You must use a primary Monero address to mine on P2Pool (starts with a 4). It is highly recommended to create a new wallet since addresses are public on P2Pool!";
|
||||||
pub const P2POOL_INPUT: &str = "Send a command to P2Pool";
|
pub const P2POOL_INPUT: &str = "Send a command to P2Pool";
|
||||||
|
|
85
src/node.rs
85
src/node.rs
|
@ -19,6 +19,7 @@ use crate::{
|
||||||
constants::*,
|
constants::*,
|
||||||
};
|
};
|
||||||
use serde::{Serialize,Deserialize};
|
use serde::{Serialize,Deserialize};
|
||||||
|
use rand::{thread_rng, Rng};
|
||||||
use std::time::{Instant,Duration};
|
use std::time::{Instant,Duration};
|
||||||
use std::sync::{Arc,Mutex};
|
use std::sync::{Arc,Mutex};
|
||||||
use egui::Color32;
|
use egui::Color32;
|
||||||
|
@ -56,12 +57,88 @@ pub const NODE_IPS: [&str; 17] = [
|
||||||
MONERUJO,PLOWSOF_1,PLOWSOF_2,RINO,SETH,SUPPORTXMR,SUPPORTXMR_IR,XMRVSBEAST,
|
MONERUJO,PLOWSOF_1,PLOWSOF_2,RINO,SETH,SUPPORTXMR,SUPPORTXMR_IR,XMRVSBEAST,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
pub const COMMUNITY_NODE_LENGTH: usize = NODE_IPS.len();
|
||||||
|
|
||||||
#[derive(Copy,Clone,Eq,PartialEq,Debug,Deserialize,Serialize)]
|
#[derive(Copy,Clone,Eq,PartialEq,Debug,Deserialize,Serialize)]
|
||||||
pub enum NodeEnum {
|
pub enum NodeEnum {
|
||||||
C3pool,Cake,CakeEu,CakeUk,CakeUs,MajesticBankIs,MajesticBankSu,Monerujo,Plowsof1,
|
C3pool,Cake,CakeEu,CakeUk,CakeUs,MajesticBankIs,MajesticBankSu,Monerujo,Plowsof1,
|
||||||
Plowsof2,Rino,Feather1,Feather2,Seth,SupportXmr,SupportXmrIr,XmrVsBeast,
|
Plowsof2,Rino,Feather1,Feather2,Seth,SupportXmr,SupportXmrIr,XmrVsBeast,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl NodeEnum {
|
||||||
|
fn get_index(&self) -> usize {
|
||||||
|
match self {
|
||||||
|
C3pool => 0,
|
||||||
|
Cake => 1,
|
||||||
|
CakeEu => 2,
|
||||||
|
CakeUk => 3,
|
||||||
|
CakeUs => 4,
|
||||||
|
Feather1 => 5,
|
||||||
|
Feather2 => 6,
|
||||||
|
MajesticBankIs => 7,
|
||||||
|
MajesticBankSu => 8,
|
||||||
|
Monerujo => 9,
|
||||||
|
Plowsof1 => 10,
|
||||||
|
Plowsof2 => 11,
|
||||||
|
Rino => 12,
|
||||||
|
Seth => 13,
|
||||||
|
SupportXmr => 14,
|
||||||
|
SupportXmrIr => 15,
|
||||||
|
_ => 16,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return a random node (that isn't the one already selected).
|
||||||
|
pub fn get_random(&self) -> Self {
|
||||||
|
let index = Self::get_index(self);
|
||||||
|
let mut rand = thread_rng().gen_range(0..COMMUNITY_NODE_LENGTH);
|
||||||
|
while rand == index {
|
||||||
|
rand = thread_rng().gen_range(0..COMMUNITY_NODE_LENGTH);
|
||||||
|
}
|
||||||
|
ip_to_enum(NODE_IPS[rand])
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the node [-1] of this one (wraps around)
|
||||||
|
pub fn get_last(&self) -> Self {
|
||||||
|
let index = Self::get_index(self);
|
||||||
|
if index == 0 {
|
||||||
|
ip_to_enum(NODE_IPS[COMMUNITY_NODE_LENGTH-1])
|
||||||
|
} else {
|
||||||
|
ip_to_enum(NODE_IPS[index-1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the node [+1] of this one (wraps around)
|
||||||
|
pub fn get_next(&self) -> Self {
|
||||||
|
let index = Self::get_index(self);
|
||||||
|
if index == COMMUNITY_NODE_LENGTH-1 {
|
||||||
|
ip_to_enum(NODE_IPS[0])
|
||||||
|
} else {
|
||||||
|
ip_to_enum(NODE_IPS[index+1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This returns relative to the ping.
|
||||||
|
pub fn get_last_from_ping(&self, nodes: &Vec<NodeData>) -> Self {
|
||||||
|
let mut found = false;
|
||||||
|
let mut last = *self;
|
||||||
|
for data in nodes {
|
||||||
|
if found { return last }
|
||||||
|
if *self == data.id { found = true; } else { last = data.id; }
|
||||||
|
}
|
||||||
|
last
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_next_from_ping(&self, nodes: &Vec<NodeData>) -> Self {
|
||||||
|
let mut found = false;
|
||||||
|
for data in nodes {
|
||||||
|
if found { return data.id }
|
||||||
|
if *self == data.id { found = true; }
|
||||||
|
}
|
||||||
|
*self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl std::fmt::Display for NodeEnum {
|
impl std::fmt::Display for NodeEnum {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
write!(f, "{:#?}", self)
|
write!(f, "{:#?}", self)
|
||||||
|
@ -225,6 +302,7 @@ impl Ping {
|
||||||
ping.lock().unwrap().msg = msg;
|
ping.lock().unwrap().msg = msg;
|
||||||
ping.lock().unwrap().pinged = true;
|
ping.lock().unwrap().pinged = true;
|
||||||
ping.lock().unwrap().auto_selected = false;
|
ping.lock().unwrap().auto_selected = false;
|
||||||
|
ping.lock().unwrap().prog = 100.0;
|
||||||
},
|
},
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
error!("Ping ... FAIL ... {}", err);
|
error!("Ping ... FAIL ... {}", err);
|
||||||
|
@ -260,7 +338,7 @@ impl Ping {
|
||||||
let ping = Arc::clone(ping);
|
let ping = Arc::clone(ping);
|
||||||
ping.lock().unwrap().pinging = true;
|
ping.lock().unwrap().pinging = true;
|
||||||
ping.lock().unwrap().prog = 0.0;
|
ping.lock().unwrap().prog = 0.0;
|
||||||
let percent = (100.0 / ((NODE_IPS.len()) as f32)).floor();
|
let percent = (100.0 / (COMMUNITY_NODE_LENGTH as f32)).floor();
|
||||||
|
|
||||||
// Create HTTP client
|
// Create HTTP client
|
||||||
let info = "Creating HTTP Client".to_string();
|
let info = "Creating HTTP Client".to_string();
|
||||||
|
@ -271,8 +349,8 @@ impl Ping {
|
||||||
// Random User Agent
|
// Random User Agent
|
||||||
let rand_user_agent = crate::Pkg::get_user_agent();
|
let rand_user_agent = crate::Pkg::get_user_agent();
|
||||||
// Handle vector
|
// Handle vector
|
||||||
let mut handles = Vec::with_capacity(NODE_IPS.len());
|
let mut handles = Vec::with_capacity(COMMUNITY_NODE_LENGTH);
|
||||||
let node_vec = Arc::new(Mutex::new(Vec::with_capacity(NODE_IPS.len())));
|
let node_vec = Arc::new(Mutex::new(Vec::with_capacity(COMMUNITY_NODE_LENGTH)));
|
||||||
|
|
||||||
for ip in NODE_IPS {
|
for ip in NODE_IPS {
|
||||||
let client = client.clone();
|
let client = client.clone();
|
||||||
|
@ -300,7 +378,6 @@ impl Ping {
|
||||||
let mut ping = ping.lock().unwrap();
|
let mut ping = ping.lock().unwrap();
|
||||||
ping.fastest = node_vec[0].id;
|
ping.fastest = node_vec[0].id;
|
||||||
ping.nodes = node_vec;
|
ping.nodes = node_vec;
|
||||||
ping.prog = 100.0;
|
|
||||||
ping.msg = info;
|
ping.msg = info;
|
||||||
drop(ping);
|
drop(ping);
|
||||||
Ok(fastest_info)
|
Ok(fastest_info)
|
||||||
|
|
|
@ -164,17 +164,40 @@ impl P2pool {
|
||||||
|
|
||||||
debug!("P2Pool Tab | Rendering [Select fastest ... Ping] buttons");
|
debug!("P2Pool Tab | Rendering [Select fastest ... Ping] buttons");
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
let width = (width/2.0)-4.0;
|
let width = (width/5.0)-6.0;
|
||||||
// [Select fastest node]
|
// [Select random node]
|
||||||
if ui.add_sized([width, height], Button::new("Select fastest node")).on_hover_text(P2POOL_SELECT_FASTEST).clicked() && ping.lock().unwrap().pinged {
|
if ui.add_sized([width, height], Button::new("Select random node")).on_hover_text(P2POOL_SELECT_RANDOM).clicked() {
|
||||||
self.node = ping.lock().unwrap().fastest;
|
self.node = NodeEnum::get_random(&self.node);
|
||||||
}
|
}
|
||||||
|
// [Select fastest node]
|
||||||
// [Ping Button]
|
if ui.add_sized([width, height], Button::new("Select fastest node")).on_hover_text(P2POOL_SELECT_FASTEST).clicked() && ping.lock().unwrap().pinged {
|
||||||
ui.set_enabled(!ping.lock().unwrap().pinging);
|
self.node = ping.lock().unwrap().fastest;
|
||||||
if ui.add_sized([width, height], Button::new("Ping community nodes")).on_hover_text(P2POOL_PING).clicked() {
|
}
|
||||||
Ping::spawn_thread(ping);
|
// [Ping Button]
|
||||||
}});
|
ui.add_enabled_ui(!ping.lock().unwrap().pinging, |ui| {
|
||||||
|
if ui.add_sized([width, height], Button::new("Ping community nodes")).on_hover_text(P2POOL_PING).clicked() {
|
||||||
|
Ping::spawn_thread(ping);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// [Last <-]
|
||||||
|
if ui.add_sized([width, height], Button::new("⬅ Last")).on_hover_text(P2POOL_SELECT_LAST).clicked() {
|
||||||
|
let ping = ping.lock().unwrap();
|
||||||
|
match ping.pinged {
|
||||||
|
true => self.node = NodeEnum::get_last_from_ping(&self.node, &ping.nodes),
|
||||||
|
false => self.node = NodeEnum::get_last(&self.node),
|
||||||
|
}
|
||||||
|
drop(ping);
|
||||||
|
}
|
||||||
|
// [Next ->]
|
||||||
|
if ui.add_sized([width, height], Button::new("Next ➡")).on_hover_text(P2POOL_SELECT_NEXT).clicked() {
|
||||||
|
let ping = ping.lock().unwrap();
|
||||||
|
match ping.pinged {
|
||||||
|
true => self.node = NodeEnum::get_next_from_ping(&self.node, &ping.nodes),
|
||||||
|
false => self.node = NodeEnum::get_next(&self.node),
|
||||||
|
}
|
||||||
|
drop(ping);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
ui.vertical(|ui| {
|
ui.vertical(|ui| {
|
||||||
let height = height / 2.0;
|
let height = height / 2.0;
|
||||||
|
|
Loading…
Reference in a new issue