summaryrefslogtreecommitdiff
path: root/src/handlers/event/reactboard.rs
diff options
context:
space:
mode:
authorseth <[email protected]>2023-11-30 22:18:51 -0500
committerseth <[email protected]>2023-12-01 07:12:49 -0500
commit76c0f94e6d7aa108424b34826eb7d8514b026287 (patch)
tree7315bd6dfe52c158041bed64ba39781718a69335 /src/handlers/event/reactboard.rs
parentdb52e639b85d79bed870020aec7a045851ca5ee3 (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.rs64
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(())
+}