diff --git a/src/bot.rs b/src/bot.rs index a505251..deec1ff 100644 --- a/src/bot.rs +++ b/src/bot.rs @@ -16,7 +16,7 @@ use crate::Error; use crate::hooks::{Hook, IssueAction, MergeRequestAction, format_hook}; -use chrono::TimeDelta; +use chrono::{TimeDelta, Utc}; use log::debug; use tokio::{signal::ctrl_c, sync::mpsc}; use xmpp::jid::{BareJid, Jid, ResourcePart}; @@ -137,6 +137,15 @@ impl XmppClient { // Do we need to remove/update the hook? let mut removal: Option = None; + let datetime = Utc::now() - TimeDelta::minutes(5); + + // Remove expired hooks (more than time delta) + self.recent_hooks.retain(|hook| match hook { + Hook::MergeRequest(hook) if hook.updated_at > datetime => false, + Hook::Issue(hook) if hook.updated_at > datetime => false, + _ => true, + }); + for (i, old_hook) in self.recent_hooks.iter().enumerate() { match (old_hook, &new_hook) { (_, &Hook::MergeRequest(ref new)) @@ -151,16 +160,13 @@ impl XmppClient { // Action is MergeRequestAction::Update, otherwise it would have matched the other branch // and the method would have returned. if old.id == new.id { - if old.author.name == new.author.name - && old.updated_at > (new.updated_at - TimeDelta::minutes(5)) - { + if old.author.name == new.author.name { // If everything matches and we're still within the time frame, let the old hook // expire, don't update it. return true; } else { // The old hook either doesn't match the new author (we want to announce messages - // from different authors), or has expired, and in both cases can be replaced by the - // new hook. + // from different authors), let it be replaced by the new hook. removal = Some(i); break; } @@ -169,9 +175,7 @@ impl XmppClient { (&Hook::Issue(ref old), &Hook::Issue(ref new)) => { // See the MergeRequest branch for comments if old.id == new.id { - if old.author.name == new.author.name - && old.updated_at > (new.updated_at - TimeDelta::minutes(5)) - { + if old.author.name == new.author.name { return true; } else { removal = Some(i);