From 771d76f50b539087a1e480db0d67fcf2960eaa71 Mon Sep 17 00:00:00 2001 From: reya Date: Sat, 28 Feb 2026 08:04:29 +0700 Subject: [PATCH] get contact list after relay list --- crates/chat/src/lib.rs | 38 ++++++++++++++++++++++++++++++++++++++ crates/state/src/lib.rs | 22 +++++++++------------- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/crates/chat/src/lib.rs b/crates/chat/src/lib.rs index 6cce226..d9971c5 100644 --- a/crates/chat/src/lib.rs +++ b/crates/chat/src/lib.rs @@ -118,6 +118,7 @@ impl ChatRegistry { this.reset(cx); } RelayState::Configured => { + this.get_contact_list(cx); this.ensure_messaging_relays(cx); } _ => {} @@ -257,6 +258,43 @@ impl ChatRegistry { })); } + /// Get contact list from relays + pub fn get_contact_list(&mut self, cx: &mut Context) { + let nostr = NostrRegistry::global(cx); + let client = nostr.read(cx).client(); + + let signer = nostr.read(cx).signer(); + let public_key = signer.public_key().unwrap(); + let write_relays = nostr.read(cx).write_relays(&public_key, cx); + + let task: Task> = cx.background_spawn(async move { + let id = SubscriptionId::new("contact-list"); + let opts = SubscribeAutoCloseOptions::default() + .exit_policy(ReqExitPolicy::ExitOnEOSE) + .timeout(Some(Duration::from_secs(TIMEOUT))); + + // Get user's write relays + let urls = write_relays.await; + + // Construct filter for inbox relays + let filter = Filter::new() + .kind(Kind::ContactList) + .author(public_key) + .limit(1); + + // Construct target for subscription + let target: HashMap<&RelayUrl, Filter> = + urls.iter().map(|relay| (relay, filter.clone())).collect(); + + // Subscribe + client.subscribe(target).close_on(opts).with_id(id).await?; + + Ok(()) + }); + + self.tasks.push(task); + } + /// Ensure messaging relays are set up for the current user. pub fn ensure_messaging_relays(&mut self, cx: &mut Context) { let task = self.verify_relays(cx); diff --git a/crates/state/src/lib.rs b/crates/state/src/lib.rs index 9c2f968..c05fa72 100644 --- a/crates/state/src/lib.rs +++ b/crates/state/src/lib.rs @@ -183,20 +183,16 @@ impl NostrRegistry { .. } = notification { - // Skip if the event has already been processed - if processed_events.insert(event.id) { - match event.kind { - Kind::RelayList => { - if subscription_id.as_str().contains("room-") { - get_events_for_room(&client, &event).await.ok(); - } - tx.send_async(event.into_owned()).await?; - } - Kind::InboxRelays => { - tx.send_async(event.into_owned()).await?; - } - _ => {} + if !processed_events.insert(event.id) { + // Skip if the event has already been processed + continue; + } + + if let Kind::RelayList = event.kind { + if subscription_id.as_str().contains("room-") { + get_events_for_room(&client, &event).await.ok(); } + tx.send_async(event.into_owned()).await?; } } }