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:
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)
-}