mirror of
https://github.com/mikedilger/gossip.git
synced 2024-09-29 16:31:18 +00:00
Rework the relays tables
This commit is contained in:
parent
cd4c35c0ae
commit
246844eb79
@ -35,6 +35,18 @@ impl DbRelay {
|
||||
})
|
||||
}
|
||||
|
||||
pub fn attempts(&self) -> u64 {
|
||||
self.success_count + self.failure_count
|
||||
}
|
||||
|
||||
pub fn success_rate(&self) -> f32 {
|
||||
let attempts = self.success_count + self.failure_count;
|
||||
if attempts == 0 {
|
||||
return 0.5;
|
||||
} // unknown, so we put it in the middle
|
||||
self.success_count as f32 / attempts as f32
|
||||
}
|
||||
|
||||
pub async fn fetch(criteria: Option<&str>) -> Result<Vec<DbRelay>, Error> {
|
||||
let sql = "SELECT url, success_count, failure_count, rank, last_connected_at, \
|
||||
last_general_eose_at, post FROM relay"
|
||||
|
@ -84,8 +84,7 @@ impl RelayPicker {
|
||||
for i in 0..self.relays.len() {
|
||||
// Here we compute a relay rank based on .rank
|
||||
// but also on success rate
|
||||
let success_rate: f32 = self.relays[i].success_count as f32
|
||||
/ (self.relays[i].success_count as f32 + self.relays[i].failure_count as f32);
|
||||
let success_rate: f32 = self.relays[i].success_rate();
|
||||
let rank = (self.relays[i].rank.unwrap_or(3) as f32 * (1.3 * success_rate)) as u64;
|
||||
scoreboard[i] *= rank;
|
||||
}
|
||||
|
@ -3,7 +3,8 @@ use crate::comms::ToOverlordMessage;
|
||||
use crate::db::DbRelay;
|
||||
use crate::globals::GLOBALS;
|
||||
use eframe::egui;
|
||||
use egui::{Align, Context, Layout, RichText, ScrollArea, TextEdit, Ui};
|
||||
use egui::{Align, Context, Layout, TextEdit, Ui};
|
||||
use egui_extras::{Column, TableBuilder};
|
||||
use nostr_types::Url;
|
||||
|
||||
pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Frame, ui: &mut Ui) {
|
||||
@ -44,7 +45,7 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr
|
||||
let mut relays: Vec<DbRelay> = relays.drain().map(|(_, relay)| relay).collect();
|
||||
relays.sort_by(|a, b| a.url.cmp(&b.url));
|
||||
|
||||
let postrelays: Vec<DbRelay> = relays
|
||||
let mut postrelays: Vec<DbRelay> = relays
|
||||
.iter()
|
||||
.filter(|r| r.post)
|
||||
.map(|r| r.to_owned())
|
||||
@ -66,12 +67,7 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr
|
||||
|
||||
ui.with_layout(Layout::top_down(Align::Min), |ui| {
|
||||
ui.heading("Writing to:");
|
||||
for relay in postrelays.iter() {
|
||||
render_relay(ui, relay, true);
|
||||
ui.add_space(3.0);
|
||||
ui.separator();
|
||||
ui.add_space(3.0);
|
||||
}
|
||||
relay_table(ui, &mut postrelays, "postrelays");
|
||||
});
|
||||
});
|
||||
|
||||
@ -80,19 +76,9 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr
|
||||
let _ = GLOBALS.to_overlord.send(ToOverlordMessage::SaveRelays);
|
||||
}
|
||||
|
||||
ui.with_layout(Layout::top_down(Align::Center), |ui| {
|
||||
ui.with_layout(Layout::top_down(Align::Min), |ui| {
|
||||
ui.heading("Other Known Relays:");
|
||||
|
||||
ScrollArea::vertical().show(ui, |ui| {
|
||||
for relay in relays.iter_mut() {
|
||||
if !relay.post {
|
||||
render_relay(ui, relay, false);
|
||||
ui.add_space(3.0);
|
||||
ui.separator();
|
||||
ui.add_space(3.0);
|
||||
}
|
||||
}
|
||||
});
|
||||
relay_table(ui, &mut relays, "otherrelays");
|
||||
});
|
||||
});
|
||||
|
||||
@ -101,28 +87,53 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr
|
||||
ui.add_space(10.0);
|
||||
}
|
||||
|
||||
fn render_relay(ui: &mut Ui, relay: &DbRelay, bold: bool) {
|
||||
ui.horizontal(|ui| {
|
||||
let mut rt = RichText::new(&relay.url);
|
||||
if bold { rt = rt.strong(); }
|
||||
ui.label(rt);
|
||||
|
||||
ui.label(&format!("Success={} Failure={}", relay.success_count, relay.failure_count));
|
||||
|
||||
ui.with_layout(Layout::right_to_left(Align::Center), |ui| {
|
||||
|
||||
let mut post = relay.post; // checkbox needs a mutable state variable.
|
||||
|
||||
let url = Url::new(&relay.url);
|
||||
if url.is_valid_relay_url() && ui.checkbox(&mut post, "Post Here")
|
||||
.on_hover_text("If selected, posts you create will be sent to this relay. But you have to press [SAVE CHANGES] at the bottom of this page.")
|
||||
.clicked()
|
||||
{
|
||||
if let Some(relay) = GLOBALS.relays.blocking_write().get_mut(&url) {
|
||||
relay.post = post;
|
||||
relay.dirty = true;
|
||||
fn relay_table(ui: &mut Ui, relays: &mut [DbRelay], id: &'static str) {
|
||||
ui.push_id(id, |ui| {
|
||||
TableBuilder::new(ui)
|
||||
.column(Column::auto_with_initial_suggestion(100.0).resizable(true))
|
||||
.column(Column::auto().resizable(true))
|
||||
.column(Column::auto().resizable(true))
|
||||
.column(Column::remainder())
|
||||
.header(20.0, |mut header| {
|
||||
header.col(|ui| {
|
||||
ui.heading("Relay URL");
|
||||
});
|
||||
header.col(|ui| {
|
||||
ui.heading("Success Rate (%)");
|
||||
});
|
||||
header.col(|ui| {
|
||||
ui.heading("Attempts");
|
||||
});
|
||||
header.col(|ui| {
|
||||
ui.heading("Post Here");
|
||||
});
|
||||
}).body(|mut body| {
|
||||
for relay in relays.iter_mut() {
|
||||
body.row(30.0, |mut row| {
|
||||
row.col(|ui| {
|
||||
ui.label(&relay.url);
|
||||
});
|
||||
row.col(|ui| {
|
||||
ui.label(&format!("{}", (relay.success_rate() * 100.0) as u32));
|
||||
});
|
||||
row.col(|ui| {
|
||||
ui.label(&format!("{}", relay.attempts()));
|
||||
});
|
||||
row.col(|ui| {
|
||||
let mut post = relay.post; // checkbox needs a mutable state variable.
|
||||
let url = Url::new(&relay.url);
|
||||
if url.is_valid_relay_url() && ui.checkbox(&mut post, "Post Here")
|
||||
.on_hover_text("If selected, posts you create will be sent to this relay. But you have to press [SAVE CHANGES] at the bottom of this page.")
|
||||
.clicked()
|
||||
{
|
||||
if let Some(relay) = GLOBALS.relays.blocking_write().get_mut(&url) {
|
||||
relay.post = post;
|
||||
relay.dirty = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user