diff --git a/src/nostr.rs b/src/nostr.rs index bc6a37f..fb53bf7 100644 --- a/src/nostr.rs +++ b/src/nostr.rs @@ -107,17 +107,16 @@ impl WebSocketService { { let mut events: Vec = Vec::new(); for filter in filters.iter() { - let mut filter_events = GLOBALS + let screen = |event: &Event| { + let event_flags = event_flags(event, &user); + screen_outgoing_event(event, event_flags, authorized_user) + }; + let filter_events = GLOBALS .store .get() .unwrap() - .find_events(filter.as_filter()?)?; - for event in filter_events.drain(..) { - let event_flags = event_flags(&event, &user); - if screen_outgoing_event(&event, event_flags, authorized_user) { - events.push(event); - } - } + .find_events(filter.as_filter()?, screen)?; + events.extend(filter_events); } // sort diff --git a/src/store/mod.rs b/src/store/mod.rs index 9e51c7a..349c352 100644 --- a/src/store/mod.rs +++ b/src/store/mod.rs @@ -226,7 +226,10 @@ impl Store { } /// Find all events that match the filter - pub fn find_events(&self, filter: Filter) -> Result, Error> { + pub fn find_events(&self, filter: Filter, screen: F) -> Result, Error> + where + F: Fn(&Event) -> bool, + { let mut output: Vec = Vec::new(); if filter.num_ids() > 0 { @@ -234,7 +237,7 @@ impl Store { for id in filter.ids() { if let Some(event) = self.get_event_by_id(id)? { // and check each against the rest of the filter - if filter.event_matches(&event)? { + if filter.event_matches(&event)? && screen(&event) { output.push(event); } } @@ -268,7 +271,7 @@ impl Store { let (_key, offset) = result?; if let Some(event) = self.events.get_event_by_offset(offset)? { // check against the rest of the filter - if filter.event_matches(&event)? { + if filter.event_matches(&event)? && screen(&event) { output.push(event); // If kind is replaceable (and not parameterized) // then don't take any more events for this author-kind @@ -317,7 +320,7 @@ impl Store { let (_key, offset) = result?; if let Some(event) = self.events.get_event_by_offset(offset)? { // check against the rest of the filter - if filter.event_matches(&event)? { + if filter.event_matches(&event)? && screen(&event) { output.push(event); } } @@ -360,7 +363,7 @@ impl Store { let (_key, offset) = result?; if let Some(event) = self.events.get_event_by_offset(offset)? { // check against the rest of the filter - if filter.event_matches(&event)? { + if filter.event_matches(&event)? && screen(&event) { output.push(event); } } @@ -383,7 +386,7 @@ impl Store { for result in iter { let (_key, offset) = result?; if let Some(event) = self.events.get_event_by_offset(offset)? { - if filter.event_matches(&event)? { + if filter.event_matches(&event)? && screen(&event) { output.push(event); count += 1; if count >= filter.limit() {