mirror of
https://github.com/mikedilger/gossip.git
synced 2024-09-29 08:21:47 +00:00
Update calls into relay functions
This commit is contained in:
parent
0319bcdb00
commit
218392c21d
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user