lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

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 }