diff options
| author | seth <[email protected]> | 2024-04-20 02:31:40 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-04-19 22:31:40 -0400 |
| commit | 3d07413690c551d9f034c93af85ae8da5a495e14 (patch) | |
| tree | 517d2e053ebdeb9a3be0ffce6dec36cbc4ce316e /src/handlers/event/reactboard.rs | |
| parent | 1b92b254bc64b356f5c59657d2f0acc767bb2964 (diff) | |
spring cleaning (#165)
* treewide: lightly refactor everything
* once_cell -> std::sync
* remove build.rs
we can get our target at runtime
* commands::copypasta: refactor selection
* drop owo_colors
* reactboard: always remove author from count
* commands: better handle behavior outside of guilds
* ci: garnix -> gha
* nix: drop flake-parts & pre-commit-hooks
* nix: fix rust flags in derivation
* add gha badge to readme
* ci: fail when format changes are made
* ci: only run on push to main
* nix: fix nil script
* nix: add libiconv to darwin deps
* ci: disable fail-fast
* nix: fix actionlint & static checks
* ci: add release gates
* nix: fix nil check again
* ci: give release gates unique names
* ci: only build static packages in docker workflow
* nix: move dev outputs to subflake
* fix some typos
* nix: cleanup checks & dev shell
* add editorconfig
Diffstat (limited to 'src/handlers/event/reactboard.rs')
| -rw-r--r-- | src/handlers/event/reactboard.rs | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/src/handlers/event/reactboard.rs b/src/handlers/event/reactboard.rs index 4316633..75fc858 100644 --- a/src/handlers/event/reactboard.rs +++ b/src/handlers/event/reactboard.rs @@ -1,13 +1,14 @@ use crate::{storage, utils, Data}; -use storage::ReactBoardEntry; +use storage::reactboard::ReactBoardEntry; use eyre::{eyre, Context as _, Result}; -use log::debug; +use log::{debug, warn}; use poise::serenity_prelude::{ Context, CreateMessage, EditMessage, GuildId, Message, MessageReaction, Reaction, }; pub async fn handle(ctx: &Context, reaction: &Reaction, data: &Data) -> Result<()> { + // TODO @getchoo: don't do anything if this message is old let msg = reaction .message(&ctx.http) .await @@ -45,7 +46,11 @@ async fn send_to_reactboard( guild_id: &GuildId, data: &Data, ) -> Result<()> { - let storage = &data.storage; + let Some(storage) = &data.storage else { + warn!("Can't make ReactBoard entry; no storage backend found!"); + return Ok(()); + }; + let settings = storage.get_guild_settings(guild_id).await?; // make sure everything is in order... @@ -64,7 +69,17 @@ async fn send_to_reactboard( return Ok(()); } - if reaction.count < settings.reactboard_requirement.unwrap_or(5) { + let count = if msg + .reaction_users(ctx, reaction.reaction_type.clone(), None, None) + .await? + .contains(&msg.author) + { + reaction.count - 1 + } else { + reaction.count + }; + + if count < settings.reactboard_requirement.unwrap_or(5) { debug!( "Ignoring message {} on ReactBoard, not enough reactions", msg.id @@ -72,60 +87,57 @@ async fn send_to_reactboard( return Ok(()); } - let content = format!("{} **#{}**", reaction.reaction_type, reaction.count); + let content = format!("{} **#{}**", reaction.reaction_type, count); - // bump reaction count if previous entry exists - if storage.reactboard_entry_exists(guild_id, &msg.id).await? { - let old_entry = storage.get_reactboard_entry(guild_id, &msg.id).await?; + let entry = if storage.reactboard_entry_exists(guild_id, &msg.id).await? { + // bump reaction count if previous entry exists + let mut entry = storage.get_reactboard_entry(guild_id, &msg.id).await?; // bail if we don't need to edit anything - if old_entry.reaction_count >= reaction.count { + if entry.reaction_count >= count { debug!("Message {} doesn't need updating", msg.id); return Ok(()); } debug!( "Bumping {} reaction count from {} to {}", - msg.id, old_entry.reaction_count, reaction.count + msg.id, entry.reaction_count, count ); let edited = EditMessage::new().content(content); ctx.http - .get_message(old_entry.posted_channel_id, old_entry.posted_message_id) + .get_message(entry.posted_channel_id, entry.posted_message_id) .await .wrap_err_with(|| { format!( "Couldn't get previous message from ReactBoardEntry {} in Redis DB!", - old_entry.original_message_id + entry.original_message_id ) })? .edit(ctx, edited) .await?; // update reaction count in redis - let mut new_entry = old_entry.clone(); - new_entry.reaction_count = reaction.count; - - debug!("Updating ReactBoard entry\nOld entry:\n{old_entry:#?}\n\nNew:\n{new_entry:#?}\n",); - storage.create_reactboard_entry(guild_id, new_entry).await?; - // make new message and add entry to redis otherwise + entry.reaction_count = count; + entry } else { + // make new message and add entry to redis otherwise let embed = utils::resolve_message_to_embed(ctx, msg).await; let message = CreateMessage::default().content(content).embed(embed); let resp = target.send_message(ctx, message).await?; - let entry = ReactBoardEntry { + ReactBoardEntry { original_message_id: msg.id, - reaction_count: reaction.count, + reaction_count: count, posted_channel_id: resp.channel_id, posted_message_id: resp.id, - }; + } + }; - debug!("Creating new ReactBoard entry:\n{entry:#?}"); - storage.create_reactboard_entry(guild_id, entry).await?; - } + debug!("Creating new ReactBoard entry:\n{entry:#?}"); + storage.create_reactboard_entry(guild_id, entry).await?; Ok(()) } |
