notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit 03c7d11351312b479f7b5397735c82fff1d364f1
parent 11edde45f434160634e54e3b195a0e2d34ae3ade
Author: kernelkind <kernelkind@gmail.com>
Date:   Tue,  1 Jul 2025 14:36:51 -0400

move `update_relay_configuration` to account/relay.rs

Signed-off-by: kernelkind <kernelkind@gmail.com>

Diffstat:
Mcrates/notedeck/src/account/accounts.rs | 77++++++++++++++++-------------------------------------------------------------
Mcrates/notedeck/src/account/relay.rs | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 71 insertions(+), 63 deletions(-)

diff --git a/crates/notedeck/src/account/accounts.rs b/crates/notedeck/src/account/accounts.rs @@ -2,13 +2,12 @@ use tracing::{debug, info}; use crate::account::cache::AccountCache; use crate::account::mute::AccountMutedData; -use crate::account::relay::{AccountRelayData, RelayDefaults}; +use crate::account::relay::{update_relay_configuration, AccountRelayData, RelayDefaults}; use crate::storage::AccountStorageWriter; use crate::user_account::UserAccountSerializable; use crate::{AccountStorage, MuteFun, RelaySpec, SingleUnkIdAction, UnknownIds, UserAccount}; use enostr::{ClientMessage, FilledKeypair, Keypair, Pubkey, RelayPool}; use nostrdb::{Ndb, Note, Transaction}; -use std::collections::BTreeSet; // TODO: remove this use std::sync::Arc; @@ -273,59 +272,6 @@ impl Accounts { changed } - fn update_relay_configuration( - &mut self, - pool: &mut RelayPool, - wakeup: impl Fn() + Send + Sync + Clone + 'static, - ) { - debug!( - "updating relay configuration for currently selected {:?}", - self.cache.selected().key.pubkey.hex() - ); - - // If forced relays are set use them only - let mut desired_relays = self.relay_defaults.forced_relays.clone(); - - // Compose the desired relay lists from the selected account - if desired_relays.is_empty() { - let data = self.get_selected_account_data_mut(); - desired_relays.extend(data.relay.local.iter().cloned()); - desired_relays.extend(data.relay.advertised.iter().cloned()); - } - - // If no relays are specified at this point use the bootstrap list - if desired_relays.is_empty() { - desired_relays = self.relay_defaults.bootstrap_relays.clone(); - } - - debug!("current relays: {:?}", pool.urls()); - debug!("desired relays: {:?}", desired_relays); - - let pool_specs = pool - .urls() - .iter() - .map(|url| RelaySpec::new(url.clone(), false, false)) - .collect(); - let add: BTreeSet<RelaySpec> = desired_relays.difference(&pool_specs).cloned().collect(); - let mut sub: BTreeSet<RelaySpec> = - pool_specs.difference(&desired_relays).cloned().collect(); - if !add.is_empty() { - debug!("configuring added relays: {:?}", add); - let _ = pool.add_urls(add.iter().map(|r| r.url.clone()).collect(), wakeup); - } - if !sub.is_empty() { - // certain relays are persistent like the multicast relay, - // although we should probably have a way to explicitly - // disable it - sub.remove(&RelaySpec::new("multicast", false, false)); - - debug!("removing unwanted relays: {:?}", sub); - pool.remove_urls(&sub.iter().map(|r| r.url.clone()).collect()); - } - - debug!("current relays: {:?}", pool.urls()); - } - pub fn update(&mut self, ndb: &mut Ndb, pool: &mut RelayPool, ctx: &egui::Context) { // IMPORTANT - This function is called in the UI update loop, // make sure it is fast when idle @@ -333,11 +279,6 @@ impl Accounts { // On the initial update the relays need config even if nothing changes below let mut need_reconfig = self.needs_relay_config; - let ctx2 = ctx.clone(); - let wakeup = move || { - ctx2.request_repaint(); - }; - // Do we need to deactivate any existing account subs? let selected = self.cache.selected().key.pubkey; @@ -370,7 +311,14 @@ impl Accounts { // If needed, update the relay configuration if need_reconfig { - self.update_relay_configuration(pool, wakeup); + let acc = self.cache.selected(); + update_relay_configuration( + pool, + &self.relay_defaults, + &acc.key.pubkey, + &acc.data, + create_wakeup(ctx), + ); self.needs_relay_config = false; } @@ -452,6 +400,13 @@ impl<'a> AccType<'a> { } } +fn create_wakeup(ctx: &egui::Context) -> impl Fn() + Send + Sync + Clone + 'static { + let ctx = ctx.clone(); + move || { + ctx.request_repaint(); + } +} + fn add_account_from_storage( cache: &mut AccountCache, ndb: &Ndb, diff --git a/crates/notedeck/src/account/relay.rs b/crates/notedeck/src/account/relay.rs @@ -1,12 +1,12 @@ use std::collections::BTreeSet; -use enostr::RelayPool; +use enostr::{Pubkey, RelayPool}; use nostrdb::{Filter, Ndb, NoteBuilder, NoteKey, Subscription, Transaction}; use tracing::{debug, error}; use url::Url; use uuid::Uuid; -use crate::RelaySpec; +use crate::{AccountData, RelaySpec}; pub(crate) struct AccountRelayData { pub filter: Filter, @@ -178,3 +178,56 @@ impl RelayDefaults { } } } + +pub(super) fn update_relay_configuration( + pool: &mut RelayPool, + relay_defaults: &RelayDefaults, + pk: &Pubkey, + data: &AccountData, + wakeup: impl Fn() + Send + Sync + Clone + 'static, +) { + debug!( + "updating relay configuration for currently selected {:?}", + pk.hex() + ); + + // If forced relays are set use them only + let mut desired_relays = relay_defaults.forced_relays.clone(); + + // Compose the desired relay lists from the selected account + if desired_relays.is_empty() { + desired_relays.extend(data.relay.local.iter().cloned()); + desired_relays.extend(data.relay.advertised.iter().cloned()); + } + + // If no relays are specified at this point use the bootstrap list + if desired_relays.is_empty() { + desired_relays = relay_defaults.bootstrap_relays.clone(); + } + + debug!("current relays: {:?}", pool.urls()); + debug!("desired relays: {:?}", desired_relays); + + let pool_specs = pool + .urls() + .iter() + .map(|url| RelaySpec::new(url.clone(), false, false)) + .collect(); + let add: BTreeSet<RelaySpec> = desired_relays.difference(&pool_specs).cloned().collect(); + let mut sub: BTreeSet<RelaySpec> = pool_specs.difference(&desired_relays).cloned().collect(); + if !add.is_empty() { + debug!("configuring added relays: {:?}", add); + let _ = pool.add_urls(add.iter().map(|r| r.url.clone()).collect(), wakeup); + } + if !sub.is_empty() { + // certain relays are persistent like the multicast relay, + // although we should probably have a way to explicitly + // disable it + sub.remove(&RelaySpec::new("multicast", false, false)); + + debug!("removing unwanted relays: {:?}", sub); + pool.remove_urls(&sub.iter().map(|r| r.url.clone()).collect()); + } + + debug!("current relays: {:?}", pool.urls()); +}