Add support for deleting messages on call

This commit is contained in:
2025-08-15 01:43:36 -03:00
parent 12948dcc15
commit e472936c51
3 changed files with 73 additions and 11 deletions
+67 -2
View File
@@ -3,7 +3,7 @@ use std::{error::Error, sync::Arc};
use async_trait::async_trait;
use itertools::Itertools;
use twilight_model::{
gateway::payload::incoming::{MessageCreate, MessageUpdate},
gateway::payload::incoming::{MessageCreate, MessageDelete, MessageUpdate},
id::Id,
};
@@ -11,7 +11,9 @@ use crate::{
database::models::{Call, Channel, Message, User, UserIncident},
discord::sanitizing::SanitizeDiscordMarkdown,
framework::{
events::traits::{EventResult, OnMessageEditHandler, OnMessageHandler},
events::traits::{
EventResult, OnMessageDeleteHandler, OnMessageEditHandler, OnMessageHandler,
},
interactions::components::ActionRow,
runtime::Runtime,
},
@@ -345,3 +347,66 @@ impl OnMessageEditHandler<State> for CallMessageEditHandler {
Ok(())
}
}
#[derive(Debug)]
pub struct CallMessageDeleteHandler;
#[async_trait]
impl OnMessageDeleteHandler<State> for CallMessageDeleteHandler {
async fn on_message_delete(
&self,
event: &MessageDelete,
rt: Arc<Runtime<State>>,
) -> EventResult {
let Some(channel) = Channel::get_by_id(event.channel_id.get(), &rt.state.db).await? else {
return Ok(());
};
let call = if let Some(call_id) = channel.call_id {
if let Some(call) = Call::get_by_id(call_id, &rt.state.db).await? {
if !call.is_active() {
return Ok(());
}
call
} else {
return Ok(());
}
} else {
return Ok(());
};
let Some(mut message) =
Message::get_by_call_and_message_id(call.id, event.id.get(), &rt.state.db).await?
else {
return Ok(());
};
let opposite_channel_id = call.other_party_channel_id(event.channel_id.get());
let Some(opposite_channel) = Channel::get_by_id(opposite_channel_id, &rt.state.db).await?
else {
return Ok(());
};
if let Some(propagation_message_id) = message.data.propagation_message_id {
if let Some((webhook_id, webhook_token)) = opposite_channel
.webhook_id
.zip(opposite_channel.webhook_token)
{
rt.http
.delete_webhook_message(
Id::new(webhook_id),
&webhook_token,
Id::new(i64_to_u64(propagation_message_id)),
)
.await?;
message.data.is_deleted = true;
message.insert(&rt.state.db).await?;
}
}
Ok(())
}
}