diff options
Diffstat (limited to 'src/handlers')
| -rw-r--r-- | src/handlers/error.rs | 6 | ||||
| -rw-r--r-- | src/handlers/event/guild.rs | 26 | ||||
| -rw-r--r-- | src/handlers/event/message.rs | 35 | ||||
| -rw-r--r-- | src/handlers/event/mod.rs | 7 | ||||
| -rw-r--r-- | src/handlers/event/pinboard.rs | 22 | ||||
| -rw-r--r-- | src/handlers/event/reactboard.rs | 24 |
6 files changed, 89 insertions, 31 deletions
diff --git a/src/handlers/error.rs b/src/handlers/error.rs index e256bcf..b5b259d 100644 --- a/src/handlers/error.rs +++ b/src/handlers/error.rs @@ -8,7 +8,7 @@ use poise::FrameworkError; pub async fn handle(error: poise::FrameworkError<'_, Data, Report>) { match error { - FrameworkError::Setup { error, .. } => error!("error setting up client! {error:#?}"), + FrameworkError::Setup { error, .. } => error!("Error setting up client!\n{error:#?}"), FrameworkError::Command { error, ctx } => { error!("Error in command {}:\n{error:?}", ctx.command().name); @@ -27,10 +27,10 @@ pub async fn handle(error: poise::FrameworkError<'_, Data, Report>) { FrameworkError::EventHandler { error, ctx: _, - event: _, + event, framework: _, } => { - error!("Error while handling event:\n{error:#?}"); + error!("Error while handling event {}:\n{error:?}", event.name()); } error => { diff --git a/src/handlers/event/guild.rs b/src/handlers/event/guild.rs new file mode 100644 index 0000000..b7a4028 --- /dev/null +++ b/src/handlers/event/guild.rs @@ -0,0 +1,26 @@ +use color_eyre::eyre::Result; +use log::*; +use poise::serenity_prelude::{Guild, UnavailableGuild}; + +use crate::{Data, Settings}; + +pub async fn handle_create(guild: &Guild, is_new: &bool, data: &Data) -> Result<()> { + if !is_new && Settings::from_redis(&data.redis, &guild.id).await.is_ok() { + debug!("Not recreating Redis key for {}", guild.id); + return Ok(()); + } + + info!("Creating new Redis key for {}", guild.id); + Settings::new_redis(&data.redis, &guild.id).await?; + Ok(()) +} + +pub async fn handle_delete(guild: &UnavailableGuild, data: &Data) -> Result<()> { + let redis = &data.redis; + + info!("Deleting redis key for {}", guild.id); + let settings = Settings::from_redis(redis, &guild.id).await?; + settings.delete(redis).await?; + + Ok(()) +} diff --git a/src/handlers/event/message.rs b/src/handlers/event/message.rs index cf619c5..0004caf 100644 --- a/src/handlers/event/message.rs +++ b/src/handlers/event/message.rs @@ -1,8 +1,7 @@ -use crate::Settings; -use crate::{consts, Data}; +use crate::{consts, Data, Settings}; -use color_eyre::eyre::{Report, Result}; -use log::info; +use color_eyre::eyre::{eyre, Report, Result}; +use log::*; use poise::serenity_prelude::{Context, Message}; use poise::FrameworkContext; @@ -12,35 +11,39 @@ pub async fn handle( msg: &Message, data: &Data, ) -> Result<()> { - if should_echo(framework, msg, &data.settings) { + if should_echo(framework, msg, data).await? { msg.reply(ctx, &msg.content).await?; } Ok(()) } -fn should_echo( +async fn should_echo( _framework: FrameworkContext<'_, Data, Report>, msg: &Message, - settings: &Settings, -) -> bool { - let gid = msg.guild_id.unwrap_or_default(); + data: &Data, +) -> Result<bool> { if msg.author.bot && msg.webhook_id.is_none() { - info!("Not repeating another bot"); - return false; + debug!("Not repeating another bot"); + return Ok(false); } - if !settings.is_guild_allowed(gid) { - info!("Not echoing in guild {gid}"); - return false; + let gid = msg + .guild_id + .ok_or_else(|| eyre!("Couldn't get GuildId from {}!", msg.id))?; + let settings = Settings::from_redis(&data.redis, &gid).await?; + + if !settings.optional_commands_enabled { + debug!("Not echoing in guild {gid}"); + return Ok(false); } let content = &msg.content; - content == "🗿" + Ok(content == "🗿" || consts::TEAMOJIS.contains(&content.as_str()) || content.to_ascii_lowercase() == "moyai" || content .to_ascii_lowercase() - .contains("twitter's recommendation algorithm") + .contains("twitter's recommendation algorithm")) } diff --git a/src/handlers/event/mod.rs b/src/handlers/event/mod.rs index a587c77..6dd5fe4 100644 --- a/src/handlers/event/mod.rs +++ b/src/handlers/event/mod.rs @@ -4,6 +4,7 @@ use color_eyre::eyre::{Report, Result}; use poise::serenity_prelude as serenity; use poise::{Event, FrameworkContext}; +mod guild; mod message; mod pinboard; mod reactboard; @@ -27,6 +28,12 @@ pub async fn handle( Event::ReactionAdd { add_reaction } => reactboard::handle(ctx, add_reaction, data).await?, + Event::GuildCreate { guild, is_new } => guild::handle_create(guild, is_new, data).await?, + Event::GuildDelete { + incomplete, + full: _, + } => guild::handle_delete(incomplete, data).await?, + _ => {} } diff --git a/src/handlers/event/pinboard.rs b/src/handlers/event/pinboard.rs index 33d2680..21e8170 100644 --- a/src/handlers/event/pinboard.rs +++ b/src/handlers/event/pinboard.rs @@ -1,4 +1,4 @@ -use crate::{utils, Data}; +use crate::{utils, Data, Settings}; use color_eyre::eyre::{eyre, Context as _, Result}; use log::*; @@ -6,9 +6,23 @@ use poise::serenity_prelude::model::prelude::*; use poise::serenity_prelude::Context; pub async fn handle(ctx: &Context, pin: &ChannelPinsUpdateEvent, data: &Data) -> Result<()> { - if let Some(sources) = &data.settings.pinboard_sources { + let gid = pin.guild_id.unwrap_or_default(); + let settings = Settings::from_redis(&data.redis, &gid).await?; + + let target = if let Some(target) = settings.reactboard_channel { + target + } else { + debug!("PinBoard is disabled in {gid}, ignoring"); + return Ok(()); + }; + + if let Some(sources) = settings.pinboard_watch { if !sources.contains(&pin.channel_id) { - warn!("Can't access source of pin!"); + debug!( + "{} not listed in PinBoard settings for {gid}, ignoring", + &pin.channel_id + ); + return Ok(()); } } @@ -22,7 +36,7 @@ pub async fn handle(ctx: &Context, pin: &ChannelPinsUpdateEvent, data: &Data) -> for pin in pins { // We call `take` because it's supposed to be just for the latest message. - redirect(ctx, &pin, pinner.take(), data.settings.pinboard_target).await?; + redirect(ctx, &pin, pinner.take(), target).await?; pin.unpin(&ctx).await?; } diff --git a/src/handlers/event/reactboard.rs b/src/handlers/event/reactboard.rs index 2a417da..2435976 100644 --- a/src/handlers/event/reactboard.rs +++ b/src/handlers/event/reactboard.rs @@ -1,4 +1,4 @@ -use crate::{utils, Data}; +use crate::{utils, Data, Settings}; use color_eyre::eyre::{eyre, Context as _, Result}; use log::*; @@ -52,14 +52,24 @@ async fn send_to_reactboard( msg: &Message, data: &Data, ) -> Result<()> { + let gid = msg.guild_id.unwrap_or_default(); + let settings = Settings::from_redis(&data.redis, &gid).await?; + // make sure everything is in order... - if !data.settings.can_use_reaction(reaction) { - info!("Reaction {} can't be used!", reaction.reaction_type); + let target = if let Some(target) = settings.reactboard_channel { + target + } else { + debug!("Reactboard is disabled in {gid}, ignoring"); + return Ok(()); + }; + + if !settings.can_use_reaction(&reaction.reaction_type) { + debug!("Reaction {} can't be used!", reaction.reaction_type); return Ok(()); } - if reaction.count < data.settings.reactboard_requirement.unwrap_or(5) { - info!( + if reaction.count < settings.reactboard_requirement.unwrap_or(5) { + debug!( "Ignoring message {} on reactboard, not enough reactions", msg.id ); @@ -137,9 +147,7 @@ async fn send_to_reactboard( } else { let embed = utils::resolve_message_to_embed(ctx, msg).await; - let resp = data - .settings - .reactboard_target + let resp = target .send_message(ctx, |m| { m.allowed_mentions(|am| am.empty_parse()) .content(content) |
