Include recommended relay url in replies

This commit is contained in:
Mike Dilger 2023-01-02 09:23:41 +13:00
parent cf7a495ba3
commit c5b844c9d2
2 changed files with 46 additions and 2 deletions

View File

@ -1,6 +1,6 @@
use crate::error::Error; use crate::error::Error;
use crate::globals::GLOBALS; use crate::globals::GLOBALS;
use nostr_types::Url; use nostr_types::{Id, Url};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tokio::task::spawn_blocking; use tokio::task::spawn_blocking;
@ -235,4 +235,48 @@ impl DbRelay {
Ok(()) Ok(())
} }
pub async fn recommended_relay_for_reply(reply_to: Id) -> Result<Option<Url>, 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<Url> = 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::<Option<Url>, Error>(Some(url))
} else {
Ok::<Option<Url>, 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<Url> = 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::<Option<Url>, Error>(Some(url))
} else {
Ok::<Option<Url>, Error>(None)
}
})
.await??;
Ok(output)
}
} }

View File

@ -795,7 +795,7 @@ impl Overlord {
kind: EventKind::TextNote, kind: EventKind::TextNote,
tags: vec![Tag::Event { tags: vec![Tag::Event {
id: reply_to, 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()), marker: Some("reply".to_string()),
}], }],
content, content,