From 677a42df2adb0274d1ac5c00aa71b2d9275a790b Mon Sep 17 00:00:00 2001 From: Ren Amamiya Date: Sun, 2 Aug 2026 14:08:42 +0700 Subject: [PATCH] fix get rooms --- Cargo.lock | 13 ---------- Cargo.toml | 2 +- crates/chat/src/lib.rs | 54 ++++++++++++++++-------------------------- 3 files changed, 21 insertions(+), 48 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 626fef1..182111c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3989,15 +3989,6 @@ dependencies = [ "libc", ] -[[package]] -name = "matchers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] - [[package]] name = "maybe-rayon" version = "0.1.1" @@ -7478,14 +7469,10 @@ version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ - "matchers", "nu-ansi-term", - "once_cell", - "regex-automata", "sharded-slab", "smallvec", "thread_local", - "tracing", "tracing-core", "tracing-log", ] diff --git a/Cargo.toml b/Cargo.toml index 980975d..6d6016a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,7 +42,7 @@ schemars = "1" smallvec = "1.14.0" smol = "2" webbrowser = "1.0.4" -tracing-subscriber = { version = "0.3.18", features = ["fmt", "env-filter"] } +tracing-subscriber = { version = "0.3.18", features = ["fmt"] } errno = { version = "0.3.14", default-features = false } instant = "0.1" diff --git a/crates/chat/src/lib.rs b/crates/chat/src/lib.rs index 30a7117..1003bae 100644 --- a/crates/chat/src/lib.rs +++ b/crates/chat/src/lib.rs @@ -627,13 +627,7 @@ impl ChatRegistry { /// Load all rooms from the database. pub fn get_rooms(&mut self, cx: &mut Context) { - let nostr = NostrRegistry::global(cx); - - let Some(public_key) = nostr.read(cx).current_user() else { - return; - }; - - let task = self.get_rooms_from_database(public_key, cx); + let task = self.get_rooms_task(cx); self.tasks.push(cx.spawn(async move |this, cx| { match task.await { @@ -655,61 +649,53 @@ impl ChatRegistry { } /// Create a task to load rooms from the database - fn get_rooms_from_database( - &self, - public_key: PublicKey, - cx: &App, - ) -> Task, Error>> { + fn get_rooms_task(&self, cx: &App) -> Task, Error>> { let nostr = NostrRegistry::global(cx); let client = nostr.read(cx).client(); + let signer = nostr.read(cx).signer(); cx.background_spawn(async move { + let public_key = signer.get_public_key_async().await?; let contacts = client .database() .contacts_public_keys(public_key) .await .unwrap_or_default(); - // Query all cached rumor events (works with both old and new cache formats) let filter = Filter::new() .kind(Kind::ApplicationSpecificData) .custom_tag(SingleLetterTag::lowercase(Alphabet::K), "14"); - let events = client.database().query(filter).await?; - let mut rooms: HashSet = HashSet::new(); + let events = client.database().query(filter).await?; let mut grouped: HashMap> = HashMap::new(); for raw in events.into_iter() { if let Ok(rumor) = UnsignedEvent::from_json(&raw.content) - && rumor.tags.public_keys().peekable().peek().is_some() + && rumor.tags.public_keys().next().is_some() { + if rumor.pubkey != public_key + && !rumor.tags.public_keys().any(|k| k == public_key) + { + continue; + } grouped.entry(rumor.uniq_id()).or_default().push(rumor); } } - for (_id, mut messages) in grouped.into_iter() { - messages.sort_by_key(|m| Reverse(m.created_at)); + let mut rooms = HashSet::with_capacity(grouped.len()); - // Always use the latest message - let Some(latest) = messages.first() else { - continue; - }; + for (_id, messages) in grouped.into_iter() { + let latest = messages.iter().max_by_key(|m| m.created_at).unwrap(); + let room = Room::from(latest).organize(&public_key); - // Construct the room from the latest message. - // - // Call `.organize` to ensure the current user is at the end of the list. - let mut room = Room::from(latest).organize(&public_key); - - // Check if the user has responded to the room let user_sent = messages.iter().any(|m| m.pubkey == public_key); - - // Check if public keys are from the user's contacts let is_contact = room.members.iter().any(|k| contacts.contains(k)); - // Set the room's kind based on status - if user_sent || is_contact { - room = room.kind(RoomKind::Ongoing); - } + let room = if user_sent || is_contact { + room.kind(RoomKind::Ongoing) + } else { + room + }; rooms.insert(room); }