lib

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

commit c5c7e8bd6894d6d0120cffc3d9eab8bcac51923b
parent ea69f478e3f6631449f3cd27f72388c7d0c62c8e
Author: triesap <tyson@radroots.org>
Date:   Sat, 23 Aug 2025 18:40:48 +0000

nostr: update `radroots-nostr` metadata events utils

Diffstat:
Acrates/nostr/src/events/metadata.rs | 41+++++++++++++++++++++++++++++++++++++++++
Mcrates/nostr/src/events/mod.rs | 3++-
Mcrates/nostr/src/lib.rs | 12+++++-------
Dcrates/nostr/src/metadata.rs | 41-----------------------------------------
4 files changed, 48 insertions(+), 49 deletions(-)

diff --git a/crates/nostr/src/events/metadata.rs b/crates/nostr/src/events/metadata.rs @@ -0,0 +1,41 @@ +use crate::error::NostrUtilsError; +use core::time::Duration; +use nostr::{ + Kind, Metadata, event::Event, event::EventBuilder, event::EventId, filter::Filter, + key::PublicKey, +}; +use nostr_sdk::{Client, prelude::Output}; + +pub fn build_metadata_event(md: &Metadata) -> EventBuilder { + EventBuilder::metadata(md) +} + +pub async fn post_metadata_event( + client: &Client, + md: &Metadata, +) -> Result<Output<EventId>, NostrUtilsError> { + let builder = build_metadata_event(md); + Ok(client.send_event_builder(builder).await?) +} + +pub async fn fetch_metadata_for_author( + client: &Client, + author: PublicKey, + timeout: Duration, +) -> Result<Option<Event>, NostrUtilsError> { + let filter = Filter::new().authors(vec![author]).kind(Kind::Metadata); + let stored = client.database().query(filter.clone()).await?; + let fetched = client.fetch_events(filter, timeout).await?; + + let mut latest: Option<Event> = None; + for ev in stored.into_iter().chain(fetched.into_iter()) { + if ev.kind != Kind::Metadata { + continue; + } + match &latest { + Some(cur) if ev.created_at <= cur.created_at => {} + _ => latest = Some(ev), + } + } + Ok(latest) +} diff --git a/crates/nostr/src/events/mod.rs b/crates/nostr/src/events/mod.rs @@ -1,4 +1,5 @@ pub mod jobs; +pub mod metadata; extern crate alloc; use alloc::{string::String, vec::Vec}; @@ -7,7 +8,7 @@ use nostr::event::{EventBuilder, Kind, Tag, TagKind}; use crate::error::NostrUtilsError; -pub fn nostr_build_events( +pub fn build_nostr_event( kind_u32: u32, content: impl Into<String>, tag_slices: Vec<Vec<String>>, diff --git a/crates/nostr/src/lib.rs b/crates/nostr/src/lib.rs @@ -8,7 +8,6 @@ pub mod client; pub mod error; pub mod events; pub mod filter; -pub mod metadata; pub mod parse; pub mod relays; pub mod tags; @@ -21,7 +20,7 @@ pub mod codec_adapters; pub mod nip11; pub mod prelude { - pub use crate::events::nostr_build_events; + pub use crate::events::build_nostr_event; #[cfg(feature = "sdk")] pub use crate::client::{nostr_fetch_event_by_id, nostr_send_event}; @@ -30,14 +29,13 @@ pub mod prelude { pub use crate::filter::{nostr_filter_kind, nostr_filter_new_events, nostr_kind}; - pub use crate::events::jobs::{nostr_build_event_job_feedback, nostr_build_event_job_result}; + pub use crate::events::{ + jobs::{nostr_build_event_job_feedback, nostr_build_event_job_result}, + metadata::{build_metadata_event, fetch_metadata_for_author, post_metadata_event}, + }; pub use crate::relays::{add_relay, connect, remove_relay}; - pub use crate::metadata::{ - build_metadata_event, fetch_latest_metadata_for_author, set_metadata, - }; - pub use crate::parse::{parse_pubkey, parse_pubkeys}; pub use crate::tags::*; diff --git a/crates/nostr/src/metadata.rs b/crates/nostr/src/metadata.rs @@ -1,41 +0,0 @@ -use crate::error::NostrUtilsError; -use core::time::Duration; -use nostr::{ - Kind, Metadata, event::Event, event::EventBuilder, event::EventId, filter::Filter, - key::PublicKey, -}; -use nostr_sdk::{Client, prelude::Output}; - -pub fn build_metadata_event(md: &Metadata) -> EventBuilder { - EventBuilder::metadata(md) -} - -pub async fn set_metadata( - client: &Client, - md: &Metadata, -) -> Result<Output<EventId>, NostrUtilsError> { - let builder = build_metadata_event(md); - Ok(client.send_event_builder(builder).await?) -} - -pub async fn fetch_latest_metadata_for_author( - client: &Client, - author: PublicKey, - timeout: Duration, -) -> Result<Option<Event>, NostrUtilsError> { - let filter = Filter::new().authors(vec![author]).kind(Kind::Metadata); - let stored = client.database().query(filter.clone()).await?; - let fetched = client.fetch_events(filter, timeout).await?; - - let mut latest: Option<Event> = None; - for ev in stored.into_iter().chain(fetched.into_iter()) { - if ev.kind != Kind::Metadata { - continue; - } - match &latest { - Some(cur) if ev.created_at <= cur.created_at => {} - _ => latest = Some(ev), - } - } - Ok(latest) -}