diff options
| author | seth <[email protected]> | 2023-11-30 22:18:51 -0500 |
|---|---|---|
| committer | seth <[email protected]> | 2023-12-01 07:12:49 -0500 |
| commit | 76c0f94e6d7aa108424b34826eb7d8514b026287 (patch) | |
| tree | 7315bd6dfe52c158041bed64ba39781718a69335 /src/handlers/event/reactboard.rs | |
| parent | db52e639b85d79bed870020aec7a045851ca5ee3 (diff) | |
feat: use eyre, better logging, & refactor
small commits be damned
Diffstat (limited to 'src/handlers/event/reactboard.rs')
| -rw-r--r-- | src/handlers/event/reactboard.rs | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/handlers/event/reactboard.rs b/src/handlers/event/reactboard.rs new file mode 100644 index 0000000..3972931 --- /dev/null +++ b/src/handlers/event/reactboard.rs @@ -0,0 +1,64 @@ +use crate::{settings::Settings, utils}; + +use color_eyre::eyre::{eyre, Context as _, Result}; +use log::*; +use poise::serenity_prelude::{Context, Message, MessageReaction, Reaction}; + +pub async fn handle(ctx: &Context, reaction: &Reaction, settings: &Settings) -> Result<()> { + let msg = reaction + .message(&ctx.http) + .await + .wrap_err("couldn't get reaction from message!")?; + + let matched = msg + .clone() + .reactions + .into_iter() + .find(|r| r.reaction_type == reaction.emoji) + .ok_or_else(|| { + eyre!( + "couldn't find any matching reactions for {} in message {}!", + reaction.emoji.as_data(), + msg.id + ) + })?; + + send_to_reactboard(ctx, &matched, &msg, settings).await?; + + Ok(()) +} + +async fn send_to_reactboard( + ctx: &Context, + reaction: &MessageReaction, + msg: &Message, + settings: &Settings, +) -> Result<()> { + if !settings.can_use_reaction(reaction) { + info!("reaction {} can't be used!", reaction.reaction_type); + return Ok(()); + } + + if reaction.count == settings.reactboard_requirement.unwrap_or(5) { + let embed = utils::resolve_message_to_embed(ctx, msg).await; + + settings + .reactboard_target + .send_message(&ctx.http, |m| { + m.allowed_mentions(|am| am.empty_parse()) + .content(format!( + "{} **#{}**", + reaction.reaction_type, reaction.count + )) + .set_embed(embed) + }) + .await?; + } else { + info!( + "not putting message {} on reactboard, not enough reactions", + msg.id + ) + } + + Ok(()) +} |
