@@ -285,17 +285,24 @@ impl ChatRegistry {
|
||||
|
||||
let signer = nostr.read(cx).signer();
|
||||
let public_key = signer.public_key().unwrap();
|
||||
let write_relays = nostr.read(cx).write_relays(&public_key, cx);
|
||||
|
||||
cx.background_spawn(async move {
|
||||
let urls = write_relays.await;
|
||||
|
||||
// Construct filter for inbox relays
|
||||
let filter = Filter::new()
|
||||
.kind(Kind::InboxRelays)
|
||||
.author(public_key)
|
||||
.limit(1);
|
||||
|
||||
// Construct target for subscription
|
||||
let target: HashMap<&RelayUrl, Filter> =
|
||||
urls.iter().map(|relay| (relay, filter.clone())).collect();
|
||||
|
||||
// Stream events from user's write relays
|
||||
let mut stream = client
|
||||
.stream_events(filter)
|
||||
.stream_events(target)
|
||||
.timeout(Duration::from_secs(TIMEOUT))
|
||||
.await?;
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ use std::collections::HashMap;
|
||||
use std::hash::{Hash, Hasher};
|
||||
use std::time::Duration;
|
||||
|
||||
use anyhow::Error;
|
||||
use anyhow::{anyhow, Error};
|
||||
use common::EventUtils;
|
||||
use gpui::{App, AppContext, Context, EventEmitter, SharedString, Task};
|
||||
use itertools::Itertools;
|
||||
@@ -323,7 +323,6 @@ impl Room {
|
||||
/// Get gossip relays for each member
|
||||
pub fn connect(&self, cx: &App) -> HashMap<PublicKey, Task<Result<(bool, bool), Error>>> {
|
||||
let nostr = NostrRegistry::global(cx);
|
||||
|
||||
let signer = nostr.read(cx).signer();
|
||||
let public_key = signer.public_key().unwrap();
|
||||
|
||||
@@ -331,18 +330,25 @@ impl Room {
|
||||
let mut tasks = HashMap::new();
|
||||
|
||||
for member in members.into_iter() {
|
||||
let client = nostr.read(cx).client();
|
||||
|
||||
// Skip if member is the current user
|
||||
if member == public_key {
|
||||
continue;
|
||||
}
|
||||
|
||||
let client = nostr.read(cx).client();
|
||||
let write_relays = nostr.read(cx).write_relays(&member, cx);
|
||||
|
||||
tasks.insert(
|
||||
member,
|
||||
cx.background_spawn(async move {
|
||||
let mut has_inbox = false;
|
||||
let mut has_announcement = false;
|
||||
let urls = write_relays.await;
|
||||
|
||||
// Return if no relays are available
|
||||
if urls.is_empty() {
|
||||
return Err(anyhow!(
|
||||
"User has not set up any relays. You cannot send messages to them."
|
||||
));
|
||||
}
|
||||
|
||||
// Construct filters for inbox
|
||||
let inbox = Filter::new()
|
||||
@@ -356,12 +362,21 @@ impl Room {
|
||||
.author(member)
|
||||
.limit(1);
|
||||
|
||||
// Create subscription targets
|
||||
let target: HashMap<RelayUrl, Vec<Filter>> = urls
|
||||
.into_iter()
|
||||
.map(|relay| (relay, vec![inbox.clone(), announcement.clone()]))
|
||||
.collect();
|
||||
|
||||
// Stream events from user's write relays
|
||||
let mut stream = client
|
||||
.stream_events(vec![inbox.clone(), announcement.clone()])
|
||||
.stream_events(target)
|
||||
.timeout(Duration::from_secs(TIMEOUT))
|
||||
.await?;
|
||||
|
||||
let mut has_inbox = false;
|
||||
let mut has_announcement = false;
|
||||
|
||||
while let Some((_url, res)) = stream.next().await {
|
||||
let event = res?;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user