From 61597e841b8f9e0630b584565429b41de8167a25 Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Mon, 2 Jan 2023 16:09:32 +1300 Subject: [PATCH] Feed: track get_my_event_ids(), get_followed_event_ids() --- src/feed.rs | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/feed.rs b/src/feed.rs index 062a0f47..436cb24e 100644 --- a/src/feed.rs +++ b/src/feed.rs @@ -8,6 +8,10 @@ pub struct Feed { // We only recompute the feed at specified intervals interval_ms: u32, last_computed: Instant, + + // We track these to update subscriptions on them + my_event_ids: Vec, + followed_event_ids: Vec, } impl Feed { @@ -16,6 +20,8 @@ impl Feed { feed: Vec::new(), interval_ms: 1000, // Every second, until we load from settings last_computed: Instant::now(), + my_event_ids: Vec::new(), + followed_event_ids: Vec::new(), } } @@ -29,16 +35,57 @@ impl Feed { self.feed.clone() } + #[allow(dead_code)] + pub fn get_my_event_ids(&self) -> Vec { + // we assume the main get() happens fast enough to recompute for us. + self.my_event_ids.clone() + } + + #[allow(dead_code)] + pub fn get_followed_event_ids(&self) -> Vec { + // we assume the main get() happens fast enough to recompute for us. + self.followed_event_ids.clone() + } + fn recompute(&mut self) { let settings = GLOBALS.settings.blocking_read().clone(); self.interval_ms = settings.feed_recompute_interval_ms; - let mut events: Vec = GLOBALS + let events: Vec = GLOBALS .events .blocking_read() .iter() .map(|(_, e)| e) .filter(|e| e.kind == EventKind::TextNote) + .map(|e| e.to_owned()) + .collect(); + + // My event ids + if let Some(pubkey) = GLOBALS.signer.blocking_read().public_key() { + self.my_event_ids = events + .iter() + .filter_map(|e| if e.pubkey == pubkey { Some(e.id) } else { None }) + .collect(); + } else { + self.my_event_ids = vec![]; + } + + // Followed event ids + let followed_pubkeys = GLOBALS.people.blocking_read().get_followed_pubkeys(); + self.followed_event_ids = events + .iter() + .filter_map(|e| { + if followed_pubkeys.contains(&e.pubkey.into()) { + Some(e.id) + } else { + None + } + }) + .collect(); + + // Filter further for the feed + let mut events: Vec = events + .iter() .filter(|e| !GLOBALS.dismissed.blocking_read().contains(&e.id)) .filter(|e| { if settings.view_threaded {