From 7e96bced419e172afa8d18167332626f3d332bab Mon Sep 17 00:00:00 2001 From: seth Date: Thu, 7 Dec 2023 22:18:36 -0500 Subject: [PATCH] feat: add message logger --- .../{delete.rs => delete_on_reaction.rs} | 0 src/handlers/event/message_logger.rs | 79 +++++++++++++++++++ src/handlers/event/mod.rs | 24 +++++- 3 files changed, 101 insertions(+), 2 deletions(-) rename src/handlers/event/{delete.rs => delete_on_reaction.rs} (100%) create mode 100644 src/handlers/event/message_logger.rs diff --git a/src/handlers/event/delete.rs b/src/handlers/event/delete_on_reaction.rs similarity index 100% rename from src/handlers/event/delete.rs rename to src/handlers/event/delete_on_reaction.rs diff --git a/src/handlers/event/message_logger.rs b/src/handlers/event/message_logger.rs new file mode 100644 index 00000000..d4f00e41 --- /dev/null +++ b/src/handlers/event/message_logger.rs @@ -0,0 +1,79 @@ +use crate::consts::COLORS; +use crate::Data; + +use color_eyre::eyre::{eyre, Result}; +use log::debug; +use poise::serenity_prelude::{ + ChannelId, Colour, Http, Message, MessageId, MessageUpdateEvent, User, +}; + +#[allow(unused_variables)] +pub async fn log_msg(user: &User, content: String, color: T) -> Result<()> +where + T: Into, +{ + todo!() +} + +pub async fn handle_create(data: &Data, msg: &Message) -> Result<()> { + let channel_id = msg.channel_id; + let message_id = msg.id; + let content = &msg.content; + let author_id = msg.author.id; + + debug!("Logging message {message_id}"); + data.storage + .store_message(&channel_id, &message_id, content.to_string(), author_id) + .await?; + + Ok(()) +} + +pub async fn handle_update(data: &Data, event: &MessageUpdateEvent) -> Result<()> { + let stored = data + .storage + .get_message(&event.channel_id, &event.id) + .await?; + + let new_content = event.content.as_ref().ok_or_else(|| { + eyre!("Couldn't get content from event! Is the MESSAGE_CONTENT intent enabled?") + })?; + + let author = event + .author + .as_ref() + .ok_or_else(|| eyre!("Couldn't get author from message!"))?; + + if new_content != &stored.content { + log_msg(author, new_content.to_string(), COLORS["yellow"]).await?; + + debug!("Updating message {}", event.id); + data.storage + .store_message( + &event.channel_id, + &event.id, + new_content.to_string(), + author.id, + ) + .await?; + } + + Ok(()) +} + +pub async fn handle_delete( + http: impl AsRef, + data: &Data, + channel_id: &ChannelId, + message_id: &MessageId, +) -> Result<()> { + let stored = data.storage.get_message(channel_id, message_id).await?; + let user = http.as_ref().get_user(*stored.author.as_u64()).await?; + + log_msg(&user, stored.content, COLORS["red"]).await?; + + debug!("Deleting message {message_id}"); + data.storage.delete_message(channel_id, message_id).await?; + + Ok(()) +} diff --git a/src/handlers/event/mod.rs b/src/handlers/event/mod.rs index 07a82d04..bf0367ee 100644 --- a/src/handlers/event/mod.rs +++ b/src/handlers/event/mod.rs @@ -5,9 +5,10 @@ use log::*; use poise::serenity_prelude::{Activity, Context, OnlineStatus}; use poise::{Event, FrameworkContext}; -mod delete; +mod delete_on_reaction; mod eta; mod expand_link; +mod message_logger; pub mod pluralkit; mod support_onboard; @@ -46,11 +47,30 @@ pub async fn handle( return Ok(()); } + // store all new messages to monitor edits and deletes + message_logger::handle_create(data, new_message).await?; + eta::handle(ctx, new_message).await?; expand_link::handle(ctx, new_message).await?; } - Event::ReactionAdd { add_reaction } => delete::handle(ctx, add_reaction).await?, + Event::MessageDelete { + channel_id, + deleted_message_id, + guild_id: _, + } => message_logger::handle_delete(ctx, data, channel_id, deleted_message_id).await?, + + Event::MessageUpdate { + old_if_available: _, + new: _, + event, + } => { + message_logger::handle_update(data, event).await?; + } + + Event::ReactionAdd { add_reaction } => { + delete_on_reaction::handle(ctx, add_reaction).await? + } Event::ThreadCreate { thread } => support_onboard::handle(ctx, thread).await?,