diff --git a/Cargo.lock b/Cargo.lock index 77b4e1f..99be8f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2739,6 +2739,7 @@ dependencies = [ "toml", "tracing", "tracing-actix-web", + "tracing-error", "tracing-subscriber", ] diff --git a/Cargo.toml b/Cargo.toml index 9d66061..75e3948 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,7 @@ tokio = { version = "1.35.0", features = ["full"] } toml = "0.8.8" tracing = "0.1.40" tracing-actix-web = "0.7.10" +tracing-error = "0.2.0" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } [lints.clippy] diff --git a/src/main.rs b/src/main.rs index 91e7a22..1652611 100644 --- a/src/main.rs +++ b/src/main.rs @@ -60,6 +60,14 @@ async fn event_handler( starboard::handle(ctx, data, &message).await?; } + FullEvent::MessageDelete { + deleted_message_id, + channel_id, + .. + } => { + starboard::handle_deletion(ctx, data, deleted_message_id, channel_id).await?; + } + FullEvent::PresenceUpdate { new_data, .. } => { if new_data.guild_id.map(|g| g.to_string()) == std::env::var("GUILD_ID").ok() { let mut store = api::PRESENCE_STORE.write().unwrap(); @@ -118,6 +126,7 @@ async fn main() -> Result<()> { tracing_subscriber::registry() .with(tracing_subscriber::fmt::layer()) .with(tracing_subscriber::EnvFilter::from_default_env()) + .with(tracing_error::ErrorLayer::default()) .init(); #[cfg(debug_assertions)] diff --git a/src/starboard.rs b/src/starboard.rs index 8f94304..6dc3066 100644 --- a/src/starboard.rs +++ b/src/starboard.rs @@ -13,10 +13,10 @@ fn channel_from_env(key: &str) -> Option { .and_then(|s| s.parse::().ok()) } -#[tracing::instrument] +#[tracing::instrument(skip(http))] async fn get_starboard_channel( http: impl serenity::CacheHttp + std::fmt::Debug, - message_channel: serenity::ChannelId, + message_channel: &serenity::ChannelId, ) -> Result> { let Some(message_channel) = message_channel.to_channel(&http).await?.guild() else { return Ok(None); @@ -147,7 +147,7 @@ pub async fn handle( .as_ref() .ok_or_eyre("no storage available for starboard features")?; - if let Some(starboard) = get_starboard_channel(&ctx, message.channel_id).await? { + if let Some(starboard) = get_starboard_channel(&ctx, &message.channel_id).await? { let significant_reactions = get_significant_reactions(message); if let Some(existing_starboard_message) = storage @@ -214,3 +214,39 @@ pub async fn handle( Ok(()) } + +#[tracing::instrument(skip(ctx, data))] +pub async fn handle_deletion( + ctx: &serenity::Context, + data: &crate::Data, + deleted_message_id: &serenity::MessageId, + channel_id: &serenity::ChannelId, +) -> Result<()> { + if let Some(storage) = &data.storage { + if let Some(starboard_channel) = get_starboard_channel(&ctx, channel_id).await? { + if let Some(starboard_id) = storage + .get_starboard(&deleted_message_id.to_string()) + .await? + { + debug!( + "Deleted starboard message {} for {} (source deleted)", + starboard_id, deleted_message_id + ); + + storage + .del_starboard(&deleted_message_id.to_string()) + .await?; + + ctx.http + .delete_message( + starboard_channel, + starboard_id.parse::()?, + None, + ) + .await?; + } + } + } + + Ok(()) +} diff --git a/src/utils/serenity.rs b/src/utils/serenity.rs index fc8e2f7..c879311 100644 --- a/src/utils/serenity.rs +++ b/src/utils/serenity.rs @@ -10,7 +10,7 @@ pub fn unique_username(user: &serenity::User) -> String { ret } -#[tracing::instrument] +#[tracing::instrument(skip(ctx))] pub async fn suppress_embeds(ctx: &serenity::Context, message: &serenity::Message) -> Result<()> { use poise::futures_util::StreamExt as _; use serenity::{EditMessage, Event};