diff options
-rw-r--r-- | src/main.rs | 63 |
1 files changed, 36 insertions, 27 deletions
diff --git a/src/main.rs b/src/main.rs index 01657a6..9984791 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ use std::{ + collections::HashMap, fs::{remove_file, File}, io::{stdin, BufReader, Write}, net::IpAddr, @@ -307,33 +308,42 @@ fn get_https_connected_ips() -> Result<Vec<IpAddr>> { async fn update_count(client: &Client, filters: &[Filter], count: u64) -> Result<()> { let events = get_relevant_events(client, filters).await?; - if events.is_empty() { - warn!("no live events") - } else { - let new_events = get_updated_events(events, client, count).await; + warn!("no live events"); + return Ok(()); + } - if new_events.is_empty() { - warn!("no events to update") - } else { - info!("broadcasting {} updated events", new_events.len()); - client - .batch_event(new_events, RelaySendOptions::new()) - .await?; - info!("updated events broadcasted"); - } + let new_events = get_updated_events(events, client, count).await; + if new_events.is_empty() { + return Ok(()); } + + info!("broadcasting {} updated events", new_events.len()); + client + .batch_event(new_events, RelaySendOptions::new()) + .await?; Ok(()) } async fn get_relevant_events(client: &Client, filters: &[Filter]) -> Result<Vec<Event>> { - let events = client - .get_events_of(filters.to_vec(), None) - .await? - .into_iter() + let events = client.get_events_of(filters.to_vec(), None).await?; + + let mut events_by_naddr: HashMap<String, Event> = Default::default(); + for event in events { + let naddr = get_naddr(&event).to_string(); + if let Some(dup_event) = events_by_naddr.get_mut(&naddr) { + if event.created_at() > dup_event.created_at() { + *dup_event = event; + } + } else { + events_by_naddr.insert(naddr, event); + } + } + + Ok(events_by_naddr + .into_values() .filter(|e| e.tags().iter().any(is_live_event_live)) - .collect::<Vec<_>>(); - Ok(events) + .collect()) } fn is_live_event_live(t: &Tag) -> bool { @@ -362,20 +372,15 @@ async fn get_updated_events(events: Vec<Event>, client: &Client, count: u64) -> } async fn get_event_with_updated_count(event: &Event, client: &Client, count: u64) -> Result<Event> { + let naddr = get_naddr(event).to_bech32()?; let new_event = client .sign_event_builder(get_event_builder_with_updated_count(event, count)) .await - .context(format!( - "cannot sign {}", - get_ellipsed(&event.id().to_bech32()?) - ))?; + .context(format!("cannot sign {naddr}"))?; + info!("updating {naddr}"); Ok(new_event) } -fn get_ellipsed(input: &str) -> String { - format!("{}...{}", &input[..6], &input[input.len() - 6..]) -} - fn get_event_builder_with_updated_count(event: &Event, count: u64) -> EventBuilder { let mut tags: Vec<Tag> = event .clone() @@ -386,3 +391,7 @@ fn get_event_builder_with_updated_count(event: &Event, count: u64) -> EventBuild let event_builder = EventBuilder::new(event.kind(), event.content(), tags); event_builder } + +fn get_naddr(event: &Event) -> Coordinate { + Coordinate::new(event.kind(), event.pubkey).identifier(event.identifier().unwrap_or_default()) +} |