From c5b844c9d280b87fd204ecd4d989c9937b1380c7 Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Mon, 2 Jan 2023 09:23:41 +1300 Subject: [PATCH] Include recommended relay url in replies --- src/db/relay.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++- src/overlord/mod.rs | 2 +- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/db/relay.rs b/src/db/relay.rs index 22fb58b6..225a35cd 100644 --- a/src/db/relay.rs +++ b/src/db/relay.rs @@ -1,6 +1,6 @@ use crate::error::Error; use crate::globals::GLOBALS; -use nostr_types::Url; +use nostr_types::{Id, Url}; use serde::{Deserialize, Serialize}; use tokio::task::spawn_blocking; @@ -235,4 +235,48 @@ impl DbRelay { Ok(()) } + + pub async fn recommended_relay_for_reply(reply_to: Id) -> Result, Error> { + // Try to find a relay where the event was seen AND that I post to which + // has a rank>1 + let sql = "SELECT url FROM relay INNER JOIN event_seen ON relay.url=event_seen.relay \ + WHERE event_seen.event=? AND relay.post=1 AND relay.rank>1"; + let output: Option = spawn_blocking(move || { + let maybe_db = GLOBALS.db.blocking_lock(); + let db = maybe_db.as_ref().unwrap(); + let mut stmt = db.prepare(sql)?; + let mut query_result = stmt.query([reply_to.as_hex_string()])?; + if let Some(row) = query_result.next()? { + let s: String = row.get(0)?; + let url = Url::new(&s); + Ok::, Error>(Some(url)) + } else { + Ok::, Error>(None) + } + }) + .await??; + + if output.is_some() { + return Ok(output); + } + + // Fallback to finding any relay where the event was seen + let sql = "SELECT relay FROM event_seen WHERE event=?"; + let output: Option = spawn_blocking(move || { + let maybe_db = GLOBALS.db.blocking_lock(); + let db = maybe_db.as_ref().unwrap(); + let mut stmt = db.prepare(sql)?; + let mut query_result = stmt.query([reply_to.as_hex_string()])?; + if let Some(row) = query_result.next()? { + let s: String = row.get(0)?; + let url = Url::new(&s); + Ok::, Error>(Some(url)) + } else { + Ok::, Error>(None) + } + }) + .await??; + + Ok(output) + } } diff --git a/src/overlord/mod.rs b/src/overlord/mod.rs index a733a8e2..c242a0d4 100644 --- a/src/overlord/mod.rs +++ b/src/overlord/mod.rs @@ -795,7 +795,7 @@ impl Overlord { kind: EventKind::TextNote, tags: vec![Tag::Event { id: reply_to, - recommended_relay_url: None, // FIXME - we should pick a URL shared by who I am replying to and myself + recommended_relay_url: DbRelay::recommended_relay_for_reply(reply_to).await?, marker: Some("reply".to_string()), }], content,