From 577de41054b84b5fc5480faab057dc6f81954f98 Mon Sep 17 00:00:00 2001 From: Awiteb Date: Wed, 7 May 2025 06:04:28 +0000 Subject: [PATCH] chore(repo-announce): Utils to creates the bech32 Signed-off-by: Awiteb --- src/cli/repo/announce.rs | 26 ++++++------------------ src/nostr_utils/mod.rs | 4 ++-- src/nostr_utils/utils.rs | 44 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 50 insertions(+), 24 deletions(-) diff --git a/src/cli/repo/announce.rs b/src/cli/repo/announce.rs index 49f1e3d..3aa4007 100644 --- a/src/cli/repo/announce.rs +++ b/src/cli/repo/announce.rs @@ -16,13 +16,9 @@ use clap::Args; use nostr::{ - event::{EventBuilder, Kind}, + event::EventBuilder, key::PublicKey, - nips::{ - nip01::Coordinate, - nip19::{Nip19Coordinate, Nip19Event, ToBech32}, - nip65::{self, RelayMetadata}, - }, + nips::nip65::{self, RelayMetadata}, types::Url, }; @@ -63,17 +59,9 @@ impl CommandRunner for AnnounceArgs { async fn run(self, options: CliOptions) -> N34Result<()> { let client = NostrClient::init(&options).await; let user_pubk = options.pubkey().await?; - let naddr = Nip19Coordinate::new( - Coordinate::new(Kind::GitRepoAnnouncement, user_pubk), - options.relays.iter().take(3), - ) - .expect("Valid relays"); let relays_list = client.user_relays_list(user_pubk).await?; - let mut write_relays = options.relays.clone(); let mut maintainers = vec![user_pubk]; - write_relays.sort_unstable(); - write_relays.dedup(); maintainers.extend(self.maintainers); if let Some(event) = relays_list.clone() { @@ -89,23 +77,21 @@ impl CommandRunner for AnnounceArgs { self.description.map(utils::str_trim), self.web, self.clone, - options.relays, + options.relays.clone(), maintainers, self.labels.into_iter().map(utils::str_trim).collect(), )? .pow(options.pow) .build(user_pubk); - let nevent = Nip19Event::new(event.id.expect("There is an id")) - .relays(write_relays.iter().take(3).cloned()) - .to_bech32()?; - + let nevent = utils::new_nevent(event.id.expect("There is an id"), &write_relays)?; + let naddr = utils::repo_naddr(user_pubk, &options.relays)?; client .send_event_to(event, relays_list.as_ref(), &write_relays) .await?; println!("Event: {nevent}",); - println!("Repo Address: {}", naddr.to_bech32()?); + println!("Repo Address: {naddr}",); Ok(()) } diff --git a/src/nostr_utils/mod.rs b/src/nostr_utils/mod.rs index 329bdcc..40d481f 100644 --- a/src/nostr_utils/mod.rs +++ b/src/nostr_utils/mod.rs @@ -22,13 +22,13 @@ pub mod utils; use std::time::Duration; use nostr::{ - event::{Event, EventId, Kind, UnsignedEvent}, + event::{Event, Kind, UnsignedEvent}, filter::Filter, key::{Keys, PublicKey}, nips::{nip19::Nip19Coordinate, nip34::GitRepositoryAnnouncement}, types::RelayUrl, }; -use nostr_sdk::{Client, pool::Output}; +use nostr_sdk::Client; use crate::{ cli::CliOptions, diff --git a/src/nostr_utils/utils.rs b/src/nostr_utils/utils.rs index 6b6b9dd..1de291d 100644 --- a/src/nostr_utils/utils.rs +++ b/src/nostr_utils/utils.rs @@ -17,12 +17,19 @@ use std::{fmt, str::FromStr}; use nostr::{ - event::{Event, TagKind, TagStandard}, + event::{Event, EventId, Kind, TagKind, TagStandard}, filter::{Alphabet, SingleLetterTag}, - nips::nip34::GitRepositoryAnnouncement, + key::PublicKey, + nips::{ + nip01::Coordinate, + nip19::{Nip19Coordinate, Nip19Event, ToBech32}, + nip34::GitRepositoryAnnouncement, + }, + types::RelayUrl, }; use super::traits::TagsExt; +use crate::error::{N34Error, N34Result}; /// Returns the value of the given tag fn tag_value(tag: &TagStandard) -> String { @@ -80,3 +87,36 @@ pub fn event_into_repo(event: Event, repo_id: impl Into) -> GitRepositor pub fn str_trim(s: String) -> String { s.trim().to_owned() } + +/// Returns a vector with duplicate elements removed. +pub fn dedup(iter: I) -> Vec +where + T: std::cmp::Ord, + I: Iterator, +{ + let mut vector: Vec = iter.collect(); + vector.sort_unstable(); + vector.dedup(); + vector +} + +/// Creates a new NIP-19 nevent string from an event ID and up to 3 unique relay +/// URLs. +pub fn new_nevent(event_id: EventId, relays: &[RelayUrl]) -> N34Result { + Nip19Event::new(event_id) + .relays(dedup(relays.iter().take(3).cloned())) + .to_bech32() + .map_err(N34Error::from) +} + +/// Creates a NIP-19 naddr string for a git repository announcement and up to 3 +/// unique relay URLs. +pub fn repo_naddr(pubk: PublicKey, relays: &[RelayUrl]) -> N34Result { + Nip19Coordinate::new( + Coordinate::new(Kind::GitRepoAnnouncement, pubk), + dedup(relays.iter().take(3)), + ) + .expect("Valid relays") + .to_bech32() + .map_err(N34Error::from) +}