Update calls into relay functions

This commit is contained in:
Mike Dilger 2024-08-01 10:13:20 +12:00
parent 0319bcdb00
commit 218392c21d
6 changed files with 49 additions and 89 deletions

View File

@ -7,7 +7,7 @@ use eframe::egui;
use egui::{Context, RichText, Ui};
use gossip_lib::comms::ToOverlordMessage;
use gossip_lib::{relay, PersonList, PersonTable, Private, Table, GLOBALS};
use nostr_types::{Profile, PublicKey, RelayUsage};
use nostr_types::{Profile, PublicKey};
pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Frame, ui: &mut Ui) {
if app.wizard_state.pubkey.is_none() && !app.wizard_state.follow_only {
@ -87,11 +87,9 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
if person.borrow().metadata().is_none() {
// We don't have metadata
if let Ok(outboxes) = relay::get_best_relays_min(
pubkey,
RelayUsage::Outbox,
0,
) {
if let Ok(outboxes) =
relay::get_some_pubkey_outboxes(pubkey)
{
if !outboxes.is_empty() {
// But we have their outboxes
if !app

View File

@ -3,9 +3,9 @@ use crate::ui::{GossipUi, Page};
use eframe::egui;
use egui::{Color32, Context, RichText, Ui};
use gossip_lib::comms::ToOverlordMessage;
use gossip_lib::Relay;
use gossip_lib::GLOBALS;
use gossip_lib::{relay, Relay};
use nostr_types::{RelayUrl, RelayUsage};
use nostr_types::RelayUrl;
use super::continue_control;
@ -82,7 +82,7 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
let mut found = false;
// If we have write relays, show those
if let Ok(urls) = relay::get_best_relays_min(pubkey, RelayUsage::Outbox, 0) {
if let Ok(urls) = Relay::choose_relay_urls(Relay::WRITE, |_| true) {
if !urls.is_empty() {
app.vert_scroll_area()
.max_width(f32::INFINITY)

View File

@ -24,7 +24,7 @@ use minion::{Minion, MinionExitReason};
use nostr_types::{
EncryptedPrivateKey, Event, EventKind, EventReference, Filter, Id, IdHex, Metadata,
MilliSatoshi, NAddr, NostrBech32, PayRequestData, PreEvent, PrivateKey, Profile, PublicKey,
RelayUrl, RelayUsage, Tag, UncheckedUrl, Unixtime,
RelayUrl, Tag, UncheckedUrl, Unixtime,
};
use std::collections::HashMap;
use std::sync::atomic::Ordering;
@ -1271,7 +1271,7 @@ impl Overlord {
let mut relay_urls: Vec<RelayUrl> = Vec::new();
{
// Get all of the relays that we write to
let write_relays = Relay::choose_relay_urls(Relay::WRITE, |_| true)?;
let write_relays = relay::relays_to_post_to(&event)?;
relay_urls.extend(write_relays);
// Get all of the relays this events were seen on
@ -1349,7 +1349,7 @@ impl Overlord {
let mut relay_urls: Vec<RelayUrl> = Vec::new();
{
// Get all of the relays that we write to
let write_relays = Relay::choose_relay_urls(Relay::WRITE, |_| true)?;
let write_relays = relay::relays_to_post_to(&event)?;
relay_urls.extend(write_relays);
// Get all of the relays this event was seen on
@ -1656,15 +1656,14 @@ impl Overlord {
}
};
let relays: Vec<Relay> = Relay::choose_relays(Relay::WRITE, |_| true)?;
// FIXME - post it to relays we have seen it on.
let relays: Vec<RelayUrl> = relay::relays_to_post_to(&event)?;
for relay in relays {
// Send it the event to post
tracing::debug!("Asking {} to post", &relay.url);
tracing::debug!("Asking {} to post", &relay);
self.engage_minion(
relay.url.clone(),
relay.clone(),
vec![RelayJob {
reason: RelayConnectionReason::PostLike,
payload: ToMinionPayload {
@ -1721,8 +1720,7 @@ impl Overlord {
}
FeedKind::Person(pubkey) => {
// Get write relays for the person
let relays: Vec<RelayUrl> =
relay::get_best_relays_fixed(pubkey, RelayUsage::Outbox)?;
let relays: Vec<RelayUrl> = relay::get_some_pubkey_outboxes(pubkey)?;
// Subscribe on each of those write relays
for relay in relays.iter() {
// Subscribe
@ -2069,7 +2067,7 @@ impl Overlord {
// Sort the people into the relays we will find their metadata at
for pubkey in &pubkeys {
for relay in relay::get_best_relays_fixed(*pubkey, RelayUsage::Outbox)?.drain(..) {
for relay in relay::get_some_pubkey_outboxes(*pubkey)?.drain(..) {
map.entry(relay)
.and_modify(|e| e.push(*pubkey))
.or_insert_with(|| vec![*pubkey]);
@ -2187,7 +2185,7 @@ impl Overlord {
let mut relay_urls: Vec<RelayUrl> = Vec::new();
{
// Get all of the relays that we write to
let write_relay_urls: Vec<RelayUrl> = Relay::choose_relay_urls(Relay::WRITE, |_| true)?;
let write_relay_urls: Vec<RelayUrl> = relay::relays_to_post_to(&event)?;
relay_urls.extend(write_relay_urls);
relay_urls.sort();
relay_urls.dedup();
@ -2373,7 +2371,7 @@ impl Overlord {
}
async fn set_person_feed(&mut self, pubkey: PublicKey, anchor: Unixtime) -> Result<(), Error> {
let relays: Vec<RelayUrl> = relay::get_best_relays_fixed(pubkey, RelayUsage::Outbox)?;
let relays: Vec<RelayUrl> = relay::get_some_pubkey_outboxes(pubkey)?;
for relay in relays.iter() {
// Subscribe
@ -2451,7 +2449,7 @@ impl Overlord {
bonus_relays.push(url);
} else {
let tagged_person_relays: Vec<RelayUrl> =
relay::get_best_relays_fixed(pk, RelayUsage::Outbox)?;
relay::get_some_pubkey_outboxes(pk)?;
bonus_relays.extend(tagged_person_relays);
}
}
@ -2483,8 +2481,7 @@ impl Overlord {
// Include the relays of the author of the referencing event
if let Some(pk) = author {
let author_relays: Vec<RelayUrl> =
relay::get_best_relays_fixed(pk, RelayUsage::Outbox)?;
let author_relays: Vec<RelayUrl> = relay::get_some_pubkey_outboxes(pk)?;
bonus_relays.extend(author_relays);
}
}
@ -2558,21 +2555,7 @@ impl Overlord {
let mut bonus_relays: Vec<RelayUrl> = Vec::new();
if let Some(event) = GLOBALS.storage.read_event(id)? {
// Include all the INBOX relays of the author of the event
bonus_relays.extend(relay::get_best_relays_min(
event.pubkey,
RelayUsage::Inbox,
0,
)?);
// Include all the relays where the event was seen
bonus_relays.extend(
GLOBALS
.storage
.get_event_seen_on_relay(id)?
.drain(..)
.map(|(url, _time)| url),
);
bonus_relays.extend(relay::relays_for_seeking_replies(&event)?);
} else {
// We don't have the event itself yet.
@ -2588,8 +2571,7 @@ impl Overlord {
// Include the inbox relays of the author of the referencing event
if let Some(pk) = author {
let author_relays: Vec<RelayUrl> =
relay::get_best_relays_min(pk, RelayUsage::Inbox, 0)?;
let author_relays: Vec<RelayUrl> = relay::get_some_pubkey_outboxes(pk)?;
bonus_relays.extend(author_relays);
}
}
@ -2825,7 +2807,7 @@ impl Overlord {
// for it's retry logic
GLOBALS.people.metadata_fetch_initiated(&[pubkey]);
let best_relays = relay::get_best_relays_fixed(pubkey, RelayUsage::Outbox)?;
let best_relays = relay::get_some_pubkey_outboxes(pubkey)?;
// we do 1 more than num_relays_per_person, which is really for main posts,
// since metadata is more important and I didn't want to bother with
@ -2862,7 +2844,7 @@ impl Overlord {
let mut map: HashMap<RelayUrl, Vec<PublicKey>> = HashMap::new();
for pubkey in pubkeys.drain(..) {
let best_relays = relay::get_best_relays_fixed(pubkey, RelayUsage::Outbox)?;
let best_relays = relay::get_some_pubkey_outboxes(pubkey)?;
for relay_url in best_relays.iter() {
map.entry(relay_url.to_owned())
.and_modify(|entry| entry.push(pubkey))
@ -3370,8 +3352,7 @@ impl Overlord {
.collect();
// Add the read relays of the target person
let target_read_relays: Vec<RelayUrl> =
relay::get_best_relays_min(target_pubkey, RelayUsage::Inbox, 0)?;
let target_read_relays: Vec<RelayUrl> = relay::get_all_pubkey_inboxes(target_pubkey)?;
relays.extend(target_read_relays);
// Add all my write relays
@ -3411,6 +3392,7 @@ impl Overlord {
};
let event = GLOBALS.identity.sign_event(pre_event)?;
let serialized_event = serde_json::to_string(&event)?;
let client = reqwest::Client::builder()

View File

@ -7,8 +7,8 @@ use crate::storage::{PersonTable, Table};
use dashmap::{DashMap, DashSet};
use image::RgbaImage;
use nostr_types::{
ContentEncryptionAlgorithm, Event, EventKind, Metadata, PreEvent, PublicKey, RelayUrl,
RelayUsage, Tag, UncheckedUrl, Unixtime, Url,
ContentEncryptionAlgorithm, Event, EventKind, Metadata, PreEvent, PublicKey, RelayUrl, Tag,
UncheckedUrl, Unixtime, Url,
};
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
@ -667,7 +667,7 @@ impl People {
// Only include recommended relay urls in public entries, and not in the mute list
let recommended_relay_url = {
if kind != EventKind::MuteList && !private.0 {
let relays = relay::get_best_relays_min(*pubkey, RelayUsage::Outbox, 1)?;
let relays = relay::get_some_pubkey_outboxes(*pubkey)?;
relays.first().map(|u| u.to_unchecked_url())
} else {
None
@ -878,7 +878,7 @@ impl People {
*self.active_person.write().await = Some(pubkey);
// Load their relays
let best_relays = relay::get_best_relays_min(pubkey, RelayUsage::Outbox, 1)?;
let best_relays = relay::get_all_pubkey_outboxes(pubkey)?;
*self.active_persons_write_relays.write().await = best_relays;
// Load their DM relays

View File

@ -1,6 +1,6 @@
use crate::error::{Error, ErrorKind};
use crate::globals::GLOBALS;
use crate::relay;
use crate::relay::{self, ScoreFactors};
use dashmap::DashMap;
pub use nostr_types::{PublicKey, RelayUrl, RelayUsage, Unixtime};
@ -35,7 +35,7 @@ impl RelayAssignment {
#[derive(Debug, Default)]
pub struct RelayPicker {
/// A ranking of relays per person.
person_relay_scores: DashMap<PublicKey, Vec<(RelayUrl, u64)>>,
person_relay_scores: DashMap<PublicKey, Vec<(RelayUrl, f32)>>,
/// All of the relays currently connected, with their assignment.
relay_assignments: DashMap<RelayUrl, RelayAssignment>,
@ -171,8 +171,11 @@ impl RelayPicker {
// Compute scores for each person_relay pairing
for pubkey in pubkeys.iter() {
let best_relays: Vec<(RelayUrl, u64)> =
relay::get_best_relays_with_score(*pubkey, RelayUsage::Outbox, 0)?;
let best_relays: Vec<(RelayUrl, f32)> = relay::get_best_relays_with_score2(
*pubkey,
RelayUsage::Outbox,
ScoreFactors::RelayScorePlusConnected,
)?;
self.person_relay_scores.insert(*pubkey, best_relays);
@ -241,9 +244,9 @@ impl RelayPicker {
return Err(ErrorKind::NoRelays.into());
}
// Keep score for each relay, start at 0
let scoreboard: DashMap<RelayUrl, u64> =
all_relays.iter().map(|x| (x.to_owned(), 0)).collect();
// Keep score for each relay, start at 0.0
let scoreboard: DashMap<RelayUrl, f32> =
all_relays.iter().map(|x| (x.to_owned(), 0.0)).collect();
// Assign scores to relays from each pubkey
for elem in self.person_relay_scores.iter() {
@ -286,35 +289,14 @@ impl RelayPicker {
}
}
// Adjust all scores based on relay rank and relay success rate
// (gossip code elided due to complex data tracking required)
// TBD to add this kind of feature back.
for mut score_entry in scoreboard.iter_mut() {
let url = score_entry.key().to_owned();
let score = score_entry.value_mut();
// adjust score
*score = match GLOBALS.storage.read_relay(&url, None) {
Err(_) => 0,
Ok(Some(relay)) => {
if relay.should_avoid() {
0
} else {
*score * (relay.score() * 10.0) as u64
}
}
Ok(None) => *score,
}
}
let winner = scoreboard
.iter()
.max_by(|x, y| x.value().cmp(y.value()))
.max_by(|x, y| x.value().partial_cmp(y.value()).unwrap())
.unwrap();
let winning_url: RelayUrl = winner.key().to_owned();
let winning_score: u64 = *winner.value();
let winning_score: f32 = *winner.value();
if winning_score == 0 {
if winning_score < 0.000000000001 {
return Err(ErrorKind::NoProgress.into());
}
@ -346,7 +328,8 @@ impl RelayPicker {
if *relay == winning_url {
// Do not assign to this relay if it's not one of their top
// three relays and its score has dropped to 5 or lower.
if *score <= 5 && i >= 3 {
// ******FIXME GINA 5.0 is probably the wrong level now ******
if *score <= 5.0 && i >= 3 {
// in this case we can skip the rest which have lower
// scores and are further down the list
break;

View File

@ -6,7 +6,7 @@ use crate::people::People;
use crate::relay;
use crate::relay::Relay;
use dashmap::DashMap;
use nostr_types::{Event, EventReference, Id, PublicKey, RelayUrl, RelayUsage, Unixtime};
use nostr_types::{Event, EventReference, Id, PublicKey, RelayUrl, Unixtime};
use std::time::Duration;
#[derive(Debug, Clone)]
@ -134,13 +134,12 @@ impl Seeker {
// Seek the relay list because it is stale, but don't let that hold us up
// using the stale data
Self::minion_seek_relay_list(author);
let relays = relay::get_best_relays_fixed(author, RelayUsage::Outbox)?;
let relays = relay::get_some_pubkey_outboxes(author)?;
Self::minion_seek_event_at_relays(id, relays);
self.events.insert(id, SeekData::new_event(climb));
}
Freshness::Fresh => {
let relays = relay::get_best_relays_fixed(author, RelayUsage::Outbox)?;
let relays = relay::get_some_pubkey_outboxes(author)?;
Self::minion_seek_event_at_relays(id, relays);
self.events.insert(id, SeekData::new_event(climb));
}
@ -171,7 +170,7 @@ impl Seeker {
if let SeekState::WaitingRelayList(author) = data.state {
if author == pubkey {
let id = *refmutmulti.key();
if let Ok(relays) = relay::get_best_relays_fixed(author, RelayUsage::Outbox) {
if let Ok(relays) = relay::get_some_pubkey_outboxes(author) {
Self::minion_seek_event_at_relays(id, relays);
updates.push((id, SeekData::new_event(data.climb)));
}
@ -236,9 +235,7 @@ impl Seeker {
// Check if we have their relays yet
match People::person_needs_relay_list(author) {
Freshness::Fresh | Freshness::Stale => {
if let Ok(relays) =
relay::get_best_relays_fixed(author, RelayUsage::Outbox)
{
if let Ok(relays) = relay::get_some_pubkey_outboxes(author) {
Self::minion_seek_event_at_relays(id, relays);
updates.push((id, Some(SeekData::new_event(data.climb))));
continue;