ux improvements

master
lza_menace 2 years ago
parent 5dfd1628a2
commit bd4b3fb8c2

7
Cargo.lock generated

@ -1148,6 +1148,12 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "json"
version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd"
[[package]] [[package]]
name = "khronos_api" name = "khronos_api"
version = "3.1.0" version = "3.1.0"
@ -2867,6 +2873,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"eframe", "eframe",
"egui", "egui",
"json",
"libtor", "libtor",
"regex", "regex",
"reqwest", "reqwest",

@ -12,4 +12,5 @@ serde = { version = "1", features = ["derive"] }
reqwest = { version = "0.11.12", features = ["blocking", "json", "stream", "socks"] } reqwest = { version = "0.11.12", features = ["blocking", "json", "stream", "socks"] }
egui = "0.19.0" egui = "0.19.0"
rodio = "0.16.0" rodio = "0.16.0"
regex = "1.6.0" regex = "1.6.0"
json = "0.12.4"

@ -5,6 +5,7 @@ use egui::FontId;
use egui::TextStyle::*; use egui::TextStyle::*;
use crate::player::Player; use crate::player::Player;
use crate::tor::GuiTor; use crate::tor::GuiTor;
use crate::stats::Market;
use libtor::Error as libtorError; use libtor::Error as libtorError;
pub struct App { pub struct App {
@ -14,7 +15,9 @@ pub struct App {
pub tor_connected: bool, pub tor_connected: bool,
pub to_data: String, pub to_data: String,
pub show_irc: bool, pub show_irc: bool,
pub irc_message: String pub irc_message: String,
pub show_market_data: bool,
pub market: Market
} }
impl Default for App { impl Default for App {
@ -23,14 +26,20 @@ impl Default for App {
tor_started: false, tor_started: false,
tor_required: true, tor_required: true,
tor_connected: false, tor_connected: false,
show_market_data: false,
show_irc: false, show_irc: false,
to_data: "".to_owned(), to_data: "".to_owned(),
player: Player::default(), player: Player::default(),
market: Market::new(),
irc_message: "".to_owned() irc_message: "".to_owned()
} }
} }
} }
fn show_boolmoji(b: bool) -> String {
if b { return "✔".to_owned() } else { return "☠".to_owned() }
}
impl eframe::App for App { impl eframe::App for App {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
let mut style = (*ctx.style()).clone(); let mut style = (*ctx.style()).clone();
@ -54,25 +63,26 @@ impl eframe::App for App {
egui::CentralPanel::default().show(ctx, |ui| { egui::CentralPanel::default().show(ctx, |ui| {
ui.checkbox(&mut self.tor_required, "Require Tor"); ui.horizontal(|ui| {
ui.checkbox(&mut self.tor_required, "Require Tor");
if (self.tor_connected && self.tor_required) || (! self.tor_required) {
ui.checkbox(&mut self.show_market_data, "Show Market Data");
}
});
ui.separator(); ui.separator();
if self.tor_required { if self.tor_required {
if self.tor_started { if self.tor_started {
ui.label("Tor started."); ui.label(
if ui.button("Clear Tor logs").clicked() { egui::RichText::new(
let _r: std::io::Result<()> = GuiTor::clear_log(); format!(
} "Tor Started: {}\nTor Connected: {}\nProxy Up: {}",
if ui.button("Check Proxy").clicked() { show_boolmoji(self.tor_started),
if self.player.check_proxy() { show_boolmoji(self.tor_connected),
self.tor_connected = true; show_boolmoji(self.tor_connected)
} )
} )
ui.collapsing("View Tor logs:", |ui| { );
egui::ScrollArea::vertical().stick_to_bottom(true).show(ui, |ui| {
let contents = std::fs::read_to_string(crate::TOR_LOG.to_string()).unwrap();
ui.label(contents);
});
});
} else { } else {
if ui.button("Connect to the Tor network").clicked() { if ui.button("Connect to the Tor network").clicked() {
let _t: std::thread::JoinHandle<Result<u8, libtorError>> = GuiTor::start_tor(); let _t: std::thread::JoinHandle<Result<u8, libtorError>> = GuiTor::start_tor();
@ -81,6 +91,38 @@ impl eframe::App for App {
} }
} }
} }
if self.show_market_data {
if self.market.last_check_time.elapsed().unwrap() > Duration::from_secs(120) {
println!("[+] refreshing WOW market data.");
self.market.last_cg_data = self.market.get_wow_market(self.tor_required);
self.market.last_check_time = SystemTime::now();
}
let m = &self.market.last_cg_data;
let md = &m["market_data"];
ui.horizontal_wrapped(|ui| {
ui.vertical(|ui| {
ui.label("CURRENT PRICE");
ui.heading(egui::RichText::new(md["current_price"]["sats"].to_string()).strong());
ui.label("SATS");
});
ui.vertical(|ui| {
ui.label("ATH");
ui.heading(egui::RichText::new(md["ath"]["sats"].to_string()).strong());
ui.label("SATS");
});
ui.vertical(|ui| {
ui.label("ATL");
ui.heading(egui::RichText::new(md["atl"]["sats"].to_string()).strong());
ui.label("SATS");
});
ui.vertical(|ui| {
ui.label("MARKET CAP");
ui.heading(egui::RichText::new(md["market_cap"]["sats"].to_string()).strong());
ui.label("SATS");
});
});
}
}); });
// Show volume controls // Show volume controls

@ -7,6 +7,7 @@ pub use crate::app::App;
mod app; mod app;
mod player; mod player;
mod tor; mod tor;
mod stats;
// "http://wowradiod6mhb4ignjqy5ghf5l42yh2yeumgeq3yi7gn7yqy3efhe5ad.onion" // "http://wowradiod6mhb4ignjqy5ghf5l42yh2yeumgeq3yi7gn7yqy3efhe5ad.onion"
// "http://wowradiof5wx62w4avdk5fwbvcoea2z4ul2q3awffn5vmfaa3vhlgiid.onion" // "http://wowradiof5wx62w4avdk5fwbvcoea2z4ul2q3awffn5vmfaa3vhlgiid.onion"

@ -1,16 +1,49 @@
extern crate json;
extern crate reqwest;
use std::time::{SystemTime, Duration};
use json::JsonValue;
use reqwest::{blocking::ClientBuilder, Proxy};
pub struct Market {
pub last_check_time: SystemTime,
pub last_cg_data: JsonValue
}
fn get_wow_price() -> String { impl Market {
let url: &str = "https://tradeogre.com/api/v1/ticker/BTC-WOW"; pub fn new() -> Self {
let client: reqwest::blocking::Client = reqwest::blocking::ClientBuilder::new() Self {
.timeout(std::time::Duration::from_secs(10)) last_check_time: SystemTime::now() - Duration::from_secs(600),
.build() last_cg_data: json::object!{}
.unwrap(); }
let res: String = client.get(url) }
.send()
.unwrap() fn get_client(&self, tor_required: bool) -> ClientBuilder {
.json() let mut client_builder = ClientBuilder::new();
.unwrap(); if tor_required {
return res let proxy = Proxy::all("socks5://127.0.0.1:19050").unwrap();
} client_builder = client_builder.proxy(proxy);
}
return client_builder;
}
pub fn get_wow_market(&self, tor_required: bool) -> JsonValue {
let url = "https://api.coingecko.com/api/v3/coins/wownero?community_data=false&developer_data=false";
let client = self.get_client(tor_required);
let res: String = client
.build()
.unwrap()
.get(url)
.send()
.unwrap()
.text()
.unwrap();
let j = json::parse(res.as_str());
if j.is_ok() {
return j.unwrap();
} else {
return json::object!{};
}
}
}