|
|
|
@ -1,3 +1,4 @@ |
|
|
|
|
use std::collections::VecDeque; |
|
|
|
|
use std::sync::Arc; |
|
|
|
|
use std::time::{Duration, Instant}; |
|
|
|
|
|
|
|
|
@ -29,6 +30,20 @@ pub struct GroupHandle { |
|
|
|
|
pub client: FediClient, |
|
|
|
|
pub config: GroupConfig, |
|
|
|
|
pub cc: Arc<CommonConfig>, |
|
|
|
|
pub internal: GroupInternal, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[derive(Debug)] |
|
|
|
|
pub struct GroupInternal { |
|
|
|
|
recently_seen_notif_statuses: VecDeque<String>, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl Default for GroupInternal { |
|
|
|
|
fn default() -> Self { |
|
|
|
|
Self { |
|
|
|
|
recently_seen_notif_statuses: VecDeque::new() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TODO move other options to common_config!
|
|
|
|
@ -57,7 +72,6 @@ macro_rules! grp_info { |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[allow(unused)] |
|
|
|
|
macro_rules! grp_trace { |
|
|
|
|
($self:ident, $f:expr) => { |
|
|
|
|
::log::trace!(concat!("(@{}) ", $f), $self.config.get_acct()); |
|
|
|
@ -234,7 +248,13 @@ impl GroupHandle { |
|
|
|
|
|
|
|
|
|
async fn handle_notification(&mut self, n: Notification) -> Result<(), GroupError> { |
|
|
|
|
grp_debug!(self, "Handling notif #{}", n.id); |
|
|
|
|
grp_trace!(self, "{:?}", n); |
|
|
|
|
|
|
|
|
|
let ts = n.timestamp_millis(); |
|
|
|
|
if ts < self.config.get_last_notif() { |
|
|
|
|
grp_debug!(self, "Notif is too old, discard"); |
|
|
|
|
return Ok(()); |
|
|
|
|
} |
|
|
|
|
self.config.set_last_notif(ts); |
|
|
|
|
|
|
|
|
|
let group_acct = self.config.get_acct().to_string(); |
|
|
|
@ -254,7 +274,16 @@ impl GroupHandle { |
|
|
|
|
match n.notification_type { |
|
|
|
|
NotificationType::Mention => { |
|
|
|
|
if let Some(status) = n.status { |
|
|
|
|
self.handle_mention_status(status).await?; |
|
|
|
|
if self.internal.recently_seen_notif_statuses.contains(&status.id) { |
|
|
|
|
grp_debug!(self, "Already saw this notif, discard"); |
|
|
|
|
} else { |
|
|
|
|
self.internal.recently_seen_notif_statuses.push_front(status.id.clone()); |
|
|
|
|
while self.internal.recently_seen_notif_statuses.len() > 64 { |
|
|
|
|
let _ = self.internal.recently_seen_notif_statuses.pop_back(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
self.handle_mention_status(status).await?; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
NotificationType::Follow => { |
|
|
|
@ -273,6 +302,8 @@ impl GroupHandle { |
|
|
|
|
/// Handle a non-mention status for tags
|
|
|
|
|
async fn handle_status(&mut self, s: Status) -> Result<(), GroupError> { |
|
|
|
|
grp_debug!(self, "Handling status #{}", s.id); |
|
|
|
|
grp_trace!(self, "{:?}", s); |
|
|
|
|
|
|
|
|
|
let ts = s.timestamp_millis(); |
|
|
|
|
self.config.set_last_status(ts); |
|
|
|
|
|
|
|
|
@ -396,6 +427,7 @@ impl GroupHandle { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
grp_debug!(self, "Inspecting notif {}", NotificationDisplay(&n)); |
|
|
|
|
grp_trace!(self, "{:?}", n); |
|
|
|
|
notifs_to_handle.push(n); |
|
|
|
|
num += 1; |
|
|
|
|
if num > self.cc.max_catchup_notifs { |
|
|
|
@ -449,6 +481,7 @@ impl GroupHandle { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
grp_debug!(self, "Inspecting status {}", StatusDisplay(&s)); |
|
|
|
|
grp_trace!(self, "{:?}", s); |
|
|
|
|
|
|
|
|
|
if newest_status.is_none() { |
|
|
|
|
newest_status = Some(ts); |
|
|
|
|