feat: beta release 0.1.4

feat: new logo
feat: algorithm now takes Xmrig HR timeframe depending on what's average available
fix: detection of p2pool eHR
fix: private round type stats
fix: name gupax tab to gupaxx
This commit is contained in:
Cyrix126 2024-03-28 10:34:53 +01:00
parent e9e630ae09
commit 4c9425f986
9 changed files with 88 additions and 39 deletions

View file

@ -1,3 +1,20 @@
# v0.1.4
Fix release for beta version.
This version is only made for testing purposes and have feedbacks.
## Changes
new logo
algorithm wait for xmrig first value, takes 10s value at first start, 1m value at second start, 15m value at third start.
## Fixes
fix detection of p2pool eHR
fix private round type stats
fix name gupax tab to gupaxx
## Bundled Versions
* [`P2Pool v3.10`](https://github.com/SChernykh/p2pool/releases/tag/v3.10)
* [`XMRig v6.21.1`](https://github.com/xmrig/xmrig/releases/tag/v6.21.1)
# v0.1.3 # v0.1.3
Fix release for beta version. Fix release for beta version.
This version is only made for testing purposes and have feedbacks. This version is only made for testing purposes and have feedbacks.

8
Cargo.lock generated
View file

@ -2064,7 +2064,7 @@ dependencies = [
[[package]] [[package]]
name = "gupaxx" name = "gupaxx"
version = "0.1.3" version = "0.1.4"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"benri", "benri",
@ -2549,7 +2549,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"windows-targets 0.52.4", "windows-targets 0.48.5",
] ]
[[package]] [[package]]
@ -2649,9 +2649,9 @@ dependencies = [
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.7.1" version = "2.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
[[package]] [[package]]
name = "memmap2" name = "memmap2"

View file

@ -1,7 +1,7 @@
cargo-features = ["profile-rustflags"] cargo-features = ["profile-rustflags"]
[package] [package]
name = "gupaxx" name = "gupaxx"
version = "0.1.3" version = "0.1.4"
authors = ["cyrix126 <gupaxx@baermail.fr>"] authors = ["cyrix126 <gupaxx@baermail.fr>"]
description = "Fork of Gupax integrating the XMRvsBeast Raffle " description = "Fork of Gupax integrating the XMRvsBeast Raffle "
documentation = "https://github.com/cyrix126/gupaxx" documentation = "https://github.com/cyrix126/gupaxx"
@ -68,7 +68,7 @@ rand = "0.8.5"
regex = { version = "1.10.4", default-features = false, features = ["perf"] } regex = { version = "1.10.4", default-features = false, features = ["perf"] }
rfd = "0.14.1" rfd = "0.14.1"
serde = { version = "1.0.197", features = ["rc", "derive"] } serde = { version = "1.0.197", features = ["rc", "derive"] }
serde_json = "1.0.114" serde_json = "1.0.115"
sysinfo = { version = "0.30.7", default-features = false } sysinfo = { version = "0.30.7", default-features = false }
# tls-api = "0.9.0" # tls-api = "0.9.0"
tokio = { version = "1.36.0", features = ["rt", "time", "macros", "process", "rt-multi-thread"] } tokio = { version = "1.36.0", features = ["rt", "time", "macros", "process", "rt-multi-thread"] }
@ -80,7 +80,7 @@ strip-ansi-escapes = "0.2.0"
derive_more = {version="0.99.17", default-features=false, features=["display"]} derive_more = {version="0.99.17", default-features=false, features=["display"]}
serde-this-or-that = "0.4.2" serde-this-or-that = "0.4.2"
readable = "0.16" readable = "0.16"
chrono = {version="0.4.35", default-features=false, features=["clock", "std"]} chrono = {version="0.4.37", default-features=false, features=["clock", "std"]}
# Unix dependencies # Unix dependencies
[target.'cfg(unix)'.dependencies] [target.'cfg(unix)'.dependencies]
eframe = { version = "0.26.2", features = ["wgpu"] } eframe = { version = "0.26.2", features = ["wgpu"] }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 65 KiB

View file

@ -36,7 +36,7 @@ impl crate::app::App {
if ui if ui
.add_sized( .add_sized(
[width, height], [width, height],
SelectableLabel::new(self.tab == Tab::Gupax, "Gupax"), SelectableLabel::new(self.tab == Tab::Gupax, "Gupaxx"),
) )
.clicked() .clicked()
{ {

View file

@ -72,10 +72,10 @@ impl Helper {
if contains_yourhashrate(&line) { if contains_yourhashrate(&line) {
if let Some(ehr) = estimated_hr(&line) { if let Some(ehr) = estimated_hr(&line) {
debug!( debug!(
"P2pool | PTY getting current estimated HR data from status: {} share", "P2pool | PTY getting current estimated HR data from status: {} KH/s",
ehr ehr
); );
lock!(gui_api).sidechain_ehr = ehr; lock!(gui_api).sidechain_ehr = ehr * 1000.0;
} else { } else {
error!("P2pool | PTY Getting data from status: Lines contains Your shares but no value found: {}", line); error!("P2pool | PTY Getting data from status: Lines contains Your shares but no value found: {}", line);
} }
@ -895,6 +895,7 @@ impl PubP2poolApi {
tick: std::mem::take(&mut gui_api.tick), tick: std::mem::take(&mut gui_api.tick),
tick_status: std::mem::take(&mut gui_api.tick_status), tick_status: std::mem::take(&mut gui_api.tick_status),
sidechain_shares: std::mem::take(&mut gui_api.sidechain_shares), sidechain_shares: std::mem::take(&mut gui_api.sidechain_shares),
sidechain_ehr: std::mem::take(&mut gui_api.sidechain_ehr),
..pub_api.clone() ..pub_api.clone()
}; };
} }

View file

@ -683,6 +683,7 @@ pub struct PubXmrigApi {
pub accepted: String, pub accepted: String,
pub rejected: String, pub rejected: String,
pub hashrate_raw: f32, pub hashrate_raw: f32,
pub hashrate_raw_1m: f32,
pub hashrate_raw_15m: f32, pub hashrate_raw_15m: f32,
pub node: String, pub node: String,
} }
@ -705,6 +706,7 @@ impl PubXmrigApi {
accepted: UNKNOWN_DATA.to_string(), accepted: UNKNOWN_DATA.to_string(),
rejected: UNKNOWN_DATA.to_string(), rejected: UNKNOWN_DATA.to_string(),
hashrate_raw: 0.0, hashrate_raw: 0.0,
hashrate_raw_1m: 0.0,
hashrate_raw_15m: 0.0, hashrate_raw_15m: 0.0,
node: UNKNOWN_DATA.to_string(), node: UNKNOWN_DATA.to_string(),
} }
@ -766,6 +768,10 @@ impl PubXmrigApi {
Some(Some(h)) => *h, Some(Some(h)) => *h,
_ => 0.0, _ => 0.0,
}; };
let hashrate_raw_1m = match private.hashrate.total.iter().nth(1) {
Some(Some(h)) => *h,
_ => 0.0,
};
let hashrate_raw_15m = match private.hashrate.total.last() { let hashrate_raw_15m = match private.hashrate.total.last() {
Some(Some(h)) => *h, Some(Some(h)) => *h,
_ => 0.0, _ => 0.0,
@ -779,6 +785,7 @@ impl PubXmrigApi {
accepted: Unsigned::from(private.connection.accepted as usize).to_string(), accepted: Unsigned::from(private.connection.accepted as usize).to_string(),
rejected: Unsigned::from(private.connection.rejected as usize).to_string(), rejected: Unsigned::from(private.connection.rejected as usize).to_string(),
hashrate_raw, hashrate_raw,
hashrate_raw_1m,
hashrate_raw_15m, hashrate_raw_15m,
..std::mem::take(&mut *public) ..std::mem::take(&mut *public)
} }

View file

@ -5,6 +5,7 @@ use hyper::client::HttpConnector;
use hyper::{Client, Request, StatusCode}; use hyper::{Client, Request, StatusCode};
use hyper_tls::HttpsConnector; use hyper_tls::HttpsConnector;
use log::{debug, error, info, warn}; use log::{debug, error, info, warn};
use readable::num::Float;
use readable::up::Uptime; use readable::up::Uptime;
use serde::Deserialize; use serde::Deserialize;
use std::collections::VecDeque; use std::collections::VecDeque;
@ -196,6 +197,7 @@ impl Helper {
let mut last_algorithm = tokio::time::Instant::now(); let mut last_algorithm = tokio::time::Instant::now();
let mut last_request = tokio::time::Instant::now(); let mut last_request = tokio::time::Instant::now();
let mut first_loop = true; let mut first_loop = true;
let mut second_loop = false;
info!("XvB | Entering watchdog mode... woof!"); info!("XvB | Entering watchdog mode... woof!");
loop { loop {
debug!("XvB Watchdog | ----------- Start of loop -----------"); debug!("XvB Watchdog | ----------- Start of loop -----------");
@ -326,11 +328,13 @@ impl Helper {
} }
}); });
let share = lock!(gui_api_p2pool).sidechain_shares; let share = lock!(gui_api_p2pool).sidechain_shares;
debug!("XvB | Number of current shares: {}", share);
// // verify in which round type we are // // verify in which round type we are
let round = XvbPrivStats::round_type(share, &pub_api); let round = XvbPrivStats::round_type(share, &pub_api);
// refresh the round we participate // refresh the round we participate
lock!(&pub_api).stats_priv.round_participate = round; debug!("XvB | Round type: {:#?}", round);
lock!(&gui_api).stats_priv.round_participate = round;
// verify if we are the winner of the current round // verify if we are the winner of the current round
if lock!(pub_api).stats_pub.winner if lock!(pub_api).stats_pub.winner
@ -341,8 +345,10 @@ impl Helper {
// if 10 minutes passed since last check // if 10 minutes passed since last check
// the first 15 minutes, the HR of xmrig will be 0.0, so xmrig will always mine on p2pool for 15m. // the first 15 minutes, the HR of xmrig will be 0.0, so xmrig will always mine on p2pool for 15m.
if last_algorithm.elapsed() >= Duration::from_secs(XVB_TIME_ALGO.into()) // check local HR, skip this time if xmrig is not yet started
|| first_loop if (last_algorithm.elapsed() >= Duration::from_secs(XVB_TIME_ALGO.into())
|| first_loop)
&& lock!(gui_api_xmrig).hashrate_raw > 0.0
{ {
debug!("Xvb Process | Algorithm is started"); debug!("Xvb Process | Algorithm is started");
output_console( output_console(
@ -391,8 +397,16 @@ impl Helper {
&gui_api, &gui_api,
"At least one share is in current PPLNS window.", "At least one share is in current PPLNS window.",
); );
let hashrate_xmrig = if first_loop {
// check rapidly average HR for first time
lock!(gui_api_xmrig).hashrate_raw
} else if second_loop {
lock!(gui_api_xmrig).hashrate_raw_1m
} else {
lock!(gui_api_xmrig).hashrate_raw_15m
};
let time_donated = XvbPrivStats::calcul_donated_time( let time_donated = XvbPrivStats::calcul_donated_time(
&gui_api_xmrig, hashrate_xmrig,
&gui_api_p2pool, &gui_api_p2pool,
&gui_api, &gui_api,
&state_p2pool, &state_p2pool,
@ -406,7 +420,7 @@ impl Helper {
XVB_TIME_ALGO - time_donated, time_donated XVB_TIME_ALGO - time_donated, time_donated
), ),
); );
let hashrate_xmrig = lock!(gui_api_xmrig).hashrate_raw_15m;
debug!("Xvb Process | Local HR is {}H/s ", hashrate_xmrig); debug!("Xvb Process | Local HR is {}H/s ", hashrate_xmrig);
lock!(gui_api).p2pool_sent_last_hour_samples.pop_back(); lock!(gui_api).p2pool_sent_last_hour_samples.pop_back();
lock!(gui_api).p2pool_sent_last_hour_samples.push_front( lock!(gui_api).p2pool_sent_last_hour_samples.push_front(
@ -454,6 +468,17 @@ impl Helper {
lock!(gui_api).p2pool_sent_last_hour_samples.push_front(0.0); lock!(gui_api).p2pool_sent_last_hour_samples.push_front(0.0);
lock!(gui_api).p2pool_sent_last_hour_samples.pop_back(); lock!(gui_api).p2pool_sent_last_hour_samples.pop_back();
} }
if second_loop {
second_loop = false;
}
if first_loop {
first_loop = false;
second_loop = true;
}
} else {
// if xmrig is still at 0 HR but is alive and algorithm is skipped, recheck first 10s of xmrig inside algorithm next time
first_loop = true;
second_loop = false;
} }
} }
} }
@ -461,9 +486,6 @@ impl Helper {
// Reset stats before loop // Reset stats before loop
// Sleep (only if 900ms hasn't passed) // Sleep (only if 900ms hasn't passed)
if first_loop {
first_loop = false;
}
let elapsed = start_loop.elapsed().as_millis(); let elapsed = start_loop.elapsed().as_millis();
// Since logic goes off if less than 1000, casting should be safe // Since logic goes off if less than 1000, casting should be safe
if elapsed < 900 { if elapsed < 900 {
@ -676,13 +698,12 @@ impl XvbPrivStats {
} }
} }
fn calcul_donated_time( fn calcul_donated_time(
gui_api_xmrig: &Arc<Mutex<PubXmrigApi>>, lhr: f32,
gui_api_p2pool: &Arc<Mutex<PubP2poolApi>>, gui_api_p2pool: &Arc<Mutex<PubP2poolApi>>,
gui_api_xvb: &Arc<Mutex<PubXvbApi>>, gui_api_xvb: &Arc<Mutex<PubXvbApi>>,
state_p2pool: &crate::disk::state::P2pool, state_p2pool: &crate::disk::state::P2pool,
state_xvb: &crate::disk::state::Xvb, state_xvb: &crate::disk::state::Xvb,
) -> u32 { ) -> u32 {
let lhr = lock!(gui_api_xmrig).hashrate_raw_15m;
let p2pool_ehr = lock!(gui_api_p2pool).sidechain_ehr; let p2pool_ehr = lock!(gui_api_p2pool).sidechain_ehr;
// what if ehr stay still for the next ten minutes ? mHR will augment every ten minutes because it thinks that oHR is decreasing. // what if ehr stay still for the next ten minutes ? mHR will augment every ten minutes because it thinks that oHR is decreasing.
// //
@ -699,17 +720,15 @@ impl XvbPrivStats {
min_hr = 0.0; min_hr = 0.0;
} }
debug!("Xvb Process | hr {}, min_hr: {} ", lhr, min_hr); debug!("Xvb Process | hr {}, min_hr: {} ", lhr, min_hr);
output_console( let msg = format!("local HR from Xmrig is {} kH/s, minimum required HR to keep a share in PPLNS window is {} k/s, there was {} kH/s estimated sent for your address on p2pool", Float::from_3(lhr.into()), Float::from_3(min_hr.into()), Float::from_3(p2pool_ehr.into()));
&gui_api_xvb, output_console(&gui_api_xvb, &msg);
&format!("The average 15 minutes HR from Xmrig is {:.0} H/s, minimum required HR to keep a share in PPLNS window is {:.0} H/s, there was {} H/s estimated sent for your address on p2pool", lhr, min_hr, p2pool_ohr),
);
// calculate how much time can be spared // calculate how much time can be spared
let mut spared_time = Helper::time_that_could_be_spared(lhr, min_hr); let mut spared_time = Helper::time_that_could_be_spared(lhr, min_hr);
if spared_time > 0 { if spared_time > 0 {
// if not hero option // if not hero option
if !state_xvb.hero { if !state_xvb.hero {
let xvb_chr = lock!(gui_api_xvb).stats_priv.donor_1hr_avg; let xvb_chr = lock!(gui_api_xvb).stats_priv.donor_1hr_avg * 1000.0;
let shr = Helper::calc_last_hour_avg_hash_rate( let shr = Helper::calc_last_hour_avg_hash_rate(
&lock!(gui_api_xvb).xvb_sent_last_hour_samples, &lock!(gui_api_xvb).xvb_sent_last_hour_samples,
); );
@ -923,8 +942,13 @@ impl PubXvbApi {
if !buf.is_empty() { if !buf.is_empty() {
output.push_str(&buf); output.push_str(&buf);
} }
let round_participate = std::mem::take(&mut gui_api.stats_priv.round_participate);
*gui_api = Self { *gui_api = Self {
output, output,
stats_priv: XvbPrivStats {
round_participate,
..pub_api.stats_priv.clone()
},
..pub_api.clone() ..pub_api.clone()
}; };
} }
@ -1085,7 +1109,7 @@ mod test {
lock!(gui_api_xmrig).hashrate_raw_15m = 5500.0; lock!(gui_api_xmrig).hashrate_raw_15m = 5500.0;
state_xvb.hero = false; state_xvb.hero = false;
let given_time = XvbPrivStats::calcul_donated_time( let given_time = XvbPrivStats::calcul_donated_time(
&gui_api_xmrig, lock!(gui_api_xmrig).hashrate_raw_15m,
&gui_api_p2pool, &gui_api_p2pool,
&gui_api_xvb, &gui_api_xvb,
&state_p2pool, &state_p2pool,
@ -1107,7 +1131,7 @@ mod test {
// verify that hero mode will give x seconds // verify that hero mode will give x seconds
state_xvb.hero = true; state_xvb.hero = true;
let given_time = XvbPrivStats::calcul_donated_time( let given_time = XvbPrivStats::calcul_donated_time(
&gui_api_xmrig, lock!(gui_api_xmrig).hashrate_raw_15m,
&gui_api_p2pool, &gui_api_p2pool,
&gui_api_xvb, &gui_api_xvb,
&state_p2pool, &state_p2pool,
@ -1128,7 +1152,7 @@ mod test {
lock!(gui_api_xmrig).hashrate_raw_15m = 7000.0; lock!(gui_api_xmrig).hashrate_raw_15m = 7000.0;
state_xvb.hero = false; state_xvb.hero = false;
let given_time = XvbPrivStats::calcul_donated_time( let given_time = XvbPrivStats::calcul_donated_time(
&gui_api_xmrig, lock!(gui_api_xmrig).hashrate_raw_15m,
&gui_api_p2pool, &gui_api_p2pool,
&gui_api_xvb, &gui_api_xvb,
&state_p2pool, &state_p2pool,
@ -1150,7 +1174,7 @@ mod test {
// verify that hero mode will give x seconds // verify that hero mode will give x seconds
state_xvb.hero = true; state_xvb.hero = true;
let given_time = XvbPrivStats::calcul_donated_time( let given_time = XvbPrivStats::calcul_donated_time(
&gui_api_xmrig, lock!(gui_api_xmrig).hashrate_raw_15m,
&gui_api_p2pool, &gui_api_p2pool,
&gui_api_xvb, &gui_api_xvb,
&state_p2pool, &state_p2pool,
@ -1171,7 +1195,7 @@ mod test {
lock!(gui_api_xmrig).hashrate_raw_15m = 18000.0; lock!(gui_api_xmrig).hashrate_raw_15m = 18000.0;
state_xvb.hero = false; state_xvb.hero = false;
let given_time = XvbPrivStats::calcul_donated_time( let given_time = XvbPrivStats::calcul_donated_time(
&gui_api_xmrig, lock!(gui_api_xmrig).hashrate_raw_15m,
&gui_api_p2pool, &gui_api_p2pool,
&gui_api_xvb, &gui_api_xvb,
&state_p2pool, &state_p2pool,
@ -1193,7 +1217,7 @@ mod test {
// verify that hero mode will give x seconds // verify that hero mode will give x seconds
state_xvb.hero = true; state_xvb.hero = true;
let given_time = XvbPrivStats::calcul_donated_time( let given_time = XvbPrivStats::calcul_donated_time(
&gui_api_xmrig, lock!(gui_api_xmrig).hashrate_raw_15m,
&gui_api_p2pool, &gui_api_p2pool,
&gui_api_xvb, &gui_api_xvb,
&state_p2pool, &state_p2pool,
@ -1214,7 +1238,7 @@ mod test {
lock!(gui_api_xmrig).hashrate_raw_15m = 105000.0; lock!(gui_api_xmrig).hashrate_raw_15m = 105000.0;
state_xvb.hero = false; state_xvb.hero = false;
let given_time = XvbPrivStats::calcul_donated_time( let given_time = XvbPrivStats::calcul_donated_time(
&gui_api_xmrig, lock!(gui_api_xmrig).hashrate_raw_15m,
&gui_api_p2pool, &gui_api_p2pool,
&gui_api_xvb, &gui_api_xvb,
&state_p2pool, &state_p2pool,
@ -1236,7 +1260,7 @@ mod test {
// verify that hero mode will give x seconds // verify that hero mode will give x seconds
state_xvb.hero = true; state_xvb.hero = true;
let given_time = XvbPrivStats::calcul_donated_time( let given_time = XvbPrivStats::calcul_donated_time(
&gui_api_xmrig, lock!(gui_api_xmrig).hashrate_raw_15m,
&gui_api_p2pool, &gui_api_p2pool,
&gui_api_xvb, &gui_api_xvb,
&state_p2pool, &state_p2pool,
@ -1257,7 +1281,7 @@ mod test {
lock!(gui_api_xmrig).hashrate_raw_15m = 1205000.0; lock!(gui_api_xmrig).hashrate_raw_15m = 1205000.0;
state_xvb.hero = false; state_xvb.hero = false;
let given_time = XvbPrivStats::calcul_donated_time( let given_time = XvbPrivStats::calcul_donated_time(
&gui_api_xmrig, lock!(gui_api_xmrig).hashrate_raw_15m,
&gui_api_p2pool, &gui_api_p2pool,
&gui_api_xvb, &gui_api_xvb,
&state_p2pool, &state_p2pool,
@ -1279,7 +1303,7 @@ mod test {
// verify that hero mode will give x seconds // verify that hero mode will give x seconds
state_xvb.hero = true; state_xvb.hero = true;
let given_time = XvbPrivStats::calcul_donated_time( let given_time = XvbPrivStats::calcul_donated_time(
&gui_api_xmrig, lock!(gui_api_xmrig).hashrate_raw_15m,
&gui_api_p2pool, &gui_api_p2pool,
&gui_api_xvb, &gui_api_xvb,
&state_p2pool, &state_p2pool,
@ -1301,7 +1325,7 @@ mod test {
lock!(gui_api_xvb).stats_priv.donor_1hr_avg = 5000.0; lock!(gui_api_xvb).stats_priv.donor_1hr_avg = 5000.0;
state_xvb.hero = false; state_xvb.hero = false;
let given_time = XvbPrivStats::calcul_donated_time( let given_time = XvbPrivStats::calcul_donated_time(
&gui_api_xmrig, lock!(gui_api_xmrig).hashrate_raw_15m,
&gui_api_p2pool, &gui_api_p2pool,
&gui_api_xvb, &gui_api_xvb,
&state_p2pool, &state_p2pool,
@ -1326,7 +1350,7 @@ mod test {
lock!(gui_api_xvb).stats_priv.donor_1hr_avg = 5000.0; lock!(gui_api_xvb).stats_priv.donor_1hr_avg = 5000.0;
state_xvb.hero = true; state_xvb.hero = true;
let given_time = XvbPrivStats::calcul_donated_time( let given_time = XvbPrivStats::calcul_donated_time(
&gui_api_xmrig, lock!(gui_api_xmrig).hashrate_raw_15m,
&gui_api_p2pool, &gui_api_p2pool,
&gui_api_xvb, &gui_api_xvb,
&state_p2pool, &state_p2pool,

View file

@ -150,7 +150,7 @@ pub fn nb_current_shares(s: &str) -> Option<u32> {
} }
pub fn estimated_hr(s: &str) -> Option<f32> { pub fn estimated_hr(s: &str) -> Option<f32> {
static CURRENT_SHARE: Lazy<Regex> = static CURRENT_SHARE: Lazy<Regex> =
Lazy::new(|| Regex::new(r"Your hashrate (pool-side) = (?P<nb>.*) KH/s").unwrap()); Lazy::new(|| Regex::new(r"(?P<nb>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)").unwrap());
if let Some(c) = CURRENT_SHARE.captures(s) { if let Some(c) = CURRENT_SHARE.captures(s) {
if let Some(m) = c.name("nb") { if let Some(m) = c.name("nb") {
return Some( return Some(
@ -177,7 +177,7 @@ pub fn contains_yourshare(l: &str) -> bool {
} }
pub fn contains_yourhashrate(l: &str) -> bool { pub fn contains_yourhashrate(l: &str) -> bool {
static LINE_SHARE: Lazy<Regex> = static LINE_SHARE: Lazy<Regex> =
Lazy::new(|| Regex::new(r"^Your hashrate (pool-side)").unwrap()); Lazy::new(|| Regex::new(r"^Your hashrate \(pool-side\) = ").unwrap());
LINE_SHARE.is_match(l) LINE_SHARE.is_match(l)
} }
pub fn contains_end_status(l: &str) -> bool { pub fn contains_end_status(l: &str) -> bool {