bot: GC expired recent hooks at each call of the method

Signed-off-by: pep <pep@bouah.net>
This commit is contained in:
pep 2026-01-08 14:09:31 +01:00
commit 284aa7dfd1
No known key found for this signature in database
GPG key ID: DEDA74AEECA9D0F2

View file

@ -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<usize> = 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);