Files
notedeck/crates/notedeck_ui/src/contacts.rs
2025-06-02 12:36:42 -03:00

63 lines
1.3 KiB
Rust

use nostrdb::{Filter, Ndb, Note, Transaction};
fn pk1_is_following_pk2(
ndb: &Ndb,
txn: &Transaction,
pk1: &[u8; 32],
pk2: &[u8; 32],
) -> Option<bool> {
let note = get_contacts_note(ndb, txn, pk1)?;
Some(note_follows(note, pk2))
}
pub fn trust_media_from_pk2(
ndb: &Ndb,
txn: &Transaction,
pk1: Option<&[u8; 32]>,
pk2: &[u8; 32],
) -> bool {
pk1.map(|pk| pk == pk2 || pk1_is_following_pk2(ndb, txn, pk, pk2).unwrap_or(false))
.unwrap_or(false)
}
fn get_contacts_note<'a>(ndb: &'a Ndb, txn: &'a Transaction, user: &[u8; 32]) -> Option<Note<'a>> {
Some(
ndb.query(txn, &[contacts_filter(user)], 1)
.ok()?
.first()?
.note
.clone(),
)
}
pub fn contacts_filter(pk: &[u8; 32]) -> Filter {
Filter::new().authors([pk]).kinds([3]).limit(1).build()
}
fn note_follows(contacts_note: Note<'_>, pk: &[u8; 32]) -> bool {
for tag in contacts_note.tags() {
if tag.count() < 2 {
continue;
}
let Some(t) = tag.get_str(0) else {
continue;
};
if t != "p" {
continue;
}
let Some(author) = tag.get_id(1) else {
continue;
};
if *pk == *author {
return true;
}
}
false
}