From dc6c20d29ea4456eee1dbc2aa8757fe955d1afc7 Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Thu, 26 Feb 2026 12:24:40 +0000 Subject: fix: report per-relay publish results in send_events summary Change send_events() return type from Result<()> to Result> so callers can inspect which relays accepted events. Update the finish message to show "Published to X/N relays (failed: ...)" instead of the unconditional "Published ... to nostr relays". --- src/lib/client.rs | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) (limited to 'src/lib/client.rs') diff --git a/src/lib/client.rs b/src/lib/client.rs index 2a4e081..c5c38cf 100644 --- a/src/lib/client.rs +++ b/src/lib/client.rs @@ -2447,7 +2447,7 @@ pub async fn send_events( repo_read_relays: Vec, animate: bool, silent: bool, -) -> Result<()> { +) -> Result> { // Only include default relays as fallback when there are no repo relays // (bootstrapping case, e.g. new account signup). When repo relays exist, // trust the repo and user relay configuration. @@ -2614,7 +2614,7 @@ pub async fn send_events( })?; #[allow(clippy::borrow_deref_ref)] - join_all(relays.iter().map(|&relay| { + let relay_results: Vec<(String, bool)> = join_all(relays.iter().map(|&relay| { let reveal_state_clone = reveal_state.clone(); let my_write_relays = my_write_relays.clone(); let repo_read_relays = repo_read_relays.clone(); @@ -2691,6 +2691,7 @@ pub async fn send_events( pb.set_style(pb_after_style_succeeded.clone()); finish_bar(&pb, String::new(), &reveal_state_clone); } + (relay_clean.to_string(), !failed) } })) .await; @@ -2700,12 +2701,40 @@ pub async fn send_events( if let Some(handle) = timer_handle { handle.abort(); } + + let succeeded_count = relay_results.iter().filter(|(_, ok)| *ok).count(); + let total_count = relay_results.len(); + let failed_relays: Vec<&str> = relay_results + .iter() + .filter(|(_, ok)| !*ok) + .map(|(url, _)| { + url.strip_prefix("wss://") + .or_else(|| url.strip_prefix("ws://")) + .unwrap_or(url) + .trim_end_matches('/') + }) + .collect(); + + let finish_message = if succeeded_count == total_count { + format!("Published {events_description} to {total_count} relays") + } else if succeeded_count > 0 { + format!( + "Published {events_description} to {succeeded_count}/{total_count} relays (failed: {})", + failed_relays.join(" ") + ) + } else { + format!( + "failed to publish {events_description} to any relay (failed: {})", + failed_relays.join(" ") + ) + }; + if let Some((_, spinner)) = &spinner_multi { spinner.set_style(ProgressStyle::with_template("{msg}").unwrap()); - spinner.finish_with_message(format!("Published {events_description} to nostr relays")); + spinner.finish_with_message(finish_message); } - Ok(()) + Ok(relay_results) } /// Builds a human-readable description of what is being published, e.g. -- cgit v1.2.3