metadata.rs (1754B)
1 use crate::types::{RadrootsNostrEventBuilder, RadrootsNostrMetadata}; 2 3 #[cfg(feature = "client")] 4 use crate::client::RadrootsNostrClient; 5 #[cfg(feature = "client")] 6 use crate::error::RadrootsNostrError; 7 #[cfg(feature = "client")] 8 use crate::types::{ 9 RadrootsNostrEvent, RadrootsNostrEventId, RadrootsNostrFilter, RadrootsNostrKind, 10 RadrootsNostrOutput, RadrootsNostrPublicKey, 11 }; 12 #[cfg(feature = "client")] 13 use core::time::Duration; 14 15 pub fn radroots_nostr_build_metadata_event( 16 md: &RadrootsNostrMetadata, 17 ) -> RadrootsNostrEventBuilder { 18 RadrootsNostrEventBuilder::metadata(md) 19 } 20 21 #[cfg(feature = "client")] 22 pub async fn radroots_nostr_post_metadata_event( 23 client: &RadrootsNostrClient, 24 md: &RadrootsNostrMetadata, 25 ) -> Result<RadrootsNostrOutput<RadrootsNostrEventId>, RadrootsNostrError> { 26 let builder = radroots_nostr_build_metadata_event(md); 27 client.send_event_builder(builder).await 28 } 29 30 #[cfg(feature = "client")] 31 pub async fn radroots_nostr_fetch_metadata_for_author( 32 client: &RadrootsNostrClient, 33 author: RadrootsNostrPublicKey, 34 timeout: Duration, 35 ) -> Result<Option<RadrootsNostrEvent>, RadrootsNostrError> { 36 let filter = RadrootsNostrFilter::new() 37 .authors(vec![author]) 38 .kind(RadrootsNostrKind::Metadata); 39 let stored = client.database().query(filter.clone()).await?; 40 let fetched = client.fetch_events(filter, timeout).await?; 41 42 let mut latest: Option<RadrootsNostrEvent> = None; 43 for ev in stored.into_iter().chain(fetched) { 44 if ev.kind != RadrootsNostrKind::Metadata { 45 continue; 46 } 47 match &latest { 48 Some(cur) if ev.created_at <= cur.created_at => {} 49 _ => latest = Some(ev), 50 } 51 } 52 Ok(latest) 53 }