diff options
Diffstat (limited to 'src/handlers/event')
| -rw-r--r-- | src/handlers/event/guild.rs | 32 | ||||
| -rw-r--r-- | src/handlers/event/message.rs | 4 | ||||
| -rw-r--r-- | src/handlers/event/mod.rs | 14 | ||||
| -rw-r--r-- | src/handlers/event/pinboard.rs | 8 | ||||
| -rw-r--r-- | src/handlers/event/reactboard.rs | 57 |
5 files changed, 52 insertions, 63 deletions
diff --git a/src/handlers/event/guild.rs b/src/handlers/event/guild.rs index b7a4028..3473276 100644 --- a/src/handlers/event/guild.rs +++ b/src/handlers/event/guild.rs @@ -2,25 +2,33 @@ use color_eyre::eyre::Result; use log::*; use poise::serenity_prelude::{Guild, UnavailableGuild}; -use crate::{Data, Settings}; +use crate::{storage, Data}; +use storage::settings::Settings; +use storage::Storage; -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); +pub async fn handle_create(guild: &Guild, _is_new: &bool, data: &Data) -> Result<()> { + let storage = &data.storage; + let key = Storage::format_settings_key(guild.id); + + if storage.key_exists(&key).await? { + debug!("Not recreating settings key for {}", guild.id); return Ok(()); } - info!("Creating new Redis key for {}", guild.id); - Settings::new_redis(&data.redis, &guild.id).await?; + let settings = Settings { + guild_id: guild.id, + optional_commands_enabled: false, + ..Default::default() + }; + + warn!("Creating new settings key {key}:\n{settings:#?}"); + storage.create_settings_key(settings).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?; - + let key = Storage::format_settings_key(guild.id); + data.storage.delete_key(&key).await?; Ok(()) } diff --git a/src/handlers/event/message.rs b/src/handlers/event/message.rs index dab2047..4fd1323 100644 --- a/src/handlers/event/message.rs +++ b/src/handlers/event/message.rs @@ -1,4 +1,4 @@ -use crate::{consts, Data, Settings}; +use crate::{consts, Data}; use color_eyre::eyre::{eyre, Report, Result}; use log::*; @@ -27,7 +27,7 @@ async fn should_echo(ctx: &Context, msg: &Message, data: &Data) -> Result<bool> 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?; + let settings = data.storage.get_guild_settings(&gid).await?; if !settings.optional_commands_enabled { debug!("Not echoing in guild {gid}"); diff --git a/src/handlers/event/mod.rs b/src/handlers/event/mod.rs index 6dd5fe4..6b1fc9b 100644 --- a/src/handlers/event/mod.rs +++ b/src/handlers/event/mod.rs @@ -1,6 +1,8 @@ +use crate::storage::{ReactBoardInfo, REACT_BOARD_KEY}; use crate::Data; use color_eyre::eyre::{Report, Result}; +use log::*; use poise::serenity_prelude as serenity; use poise::{Event, FrameworkContext}; @@ -17,7 +19,17 @@ pub async fn handle( ) -> Result<()> { match event { Event::Ready { data_about_bot } => { - log::info!("Logged in as {}!", data_about_bot.user.name) + info!("Logged in as {}!", data_about_bot.user.name); + + // make sure react board is setup + let storage = &data.storage; + if !storage.key_exists(REACT_BOARD_KEY).await? { + warn!("Creating new ReactBoardInfo key {REACT_BOARD_KEY}"); + + storage + .create_reactboard_info_key(ReactBoardInfo::default()) + .await?; + } } Event::Message { new_message } => { diff --git a/src/handlers/event/pinboard.rs b/src/handlers/event/pinboard.rs index 21e8170..d95cfee 100644 --- a/src/handlers/event/pinboard.rs +++ b/src/handlers/event/pinboard.rs @@ -1,4 +1,4 @@ -use crate::{utils, Data, Settings}; +use crate::{utils, Data}; use color_eyre::eyre::{eyre, Context as _, Result}; use log::*; @@ -7,9 +7,9 @@ use poise::serenity_prelude::Context; pub async fn handle(ctx: &Context, pin: &ChannelPinsUpdateEvent, data: &Data) -> Result<()> { let gid = pin.guild_id.unwrap_or_default(); - let settings = Settings::from_redis(&data.redis, &gid).await?; + let settings = data.storage.get_guild_settings(&gid).await?; - let target = if let Some(target) = settings.reactboard_channel { + let target = if let Some(target) = settings.pinboard_channel { target } else { debug!("PinBoard is disabled in {gid}, ignoring"); @@ -94,7 +94,7 @@ async fn guess_pinner(ctx: &Context, pin: &ChannelPinsUpdateEvent) -> Option<Use .map(|first| first.user_id) } else { // TODO: mayyyyybe we can guess who pinned something in a DM...? - warn!("couldn't figure out who pinned in {}!", pin.channel_id); + warn!("Couldn't figure out who pinned in {}!", pin.channel_id); None } } diff --git a/src/handlers/event/reactboard.rs b/src/handlers/event/reactboard.rs index 2435976..53b51a7 100644 --- a/src/handlers/event/reactboard.rs +++ b/src/handlers/event/reactboard.rs @@ -1,26 +1,9 @@ -use crate::{utils, Data, Settings}; +use crate::{storage, utils, Data}; +use storage::{ReactBoardEntry, REACT_BOARD_KEY}; use color_eyre::eyre::{eyre, Context as _, Result}; use log::*; -use poise::serenity_prelude::{ChannelId, Context, Message, MessageId, MessageReaction, Reaction}; -use redis::AsyncCommands as _; -use redis_macros::{FromRedisValue, ToRedisArgs}; -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, Serialize, Deserialize, FromRedisValue, ToRedisArgs)] -struct ReactBoardEntry { - original_id: MessageId, - reaction_count: u64, - channel_id: ChannelId, - message_id: MessageId, -} - -#[derive(Default, Serialize, Deserialize, FromRedisValue, ToRedisArgs)] -struct ReactBoardInfo { - reactions: Vec<ReactBoardEntry>, -} - -const REACT_BOARD_KEY: &str = "reactboard-v1"; +use poise::serenity_prelude::{Context, Message, MessageReaction, Reaction}; pub async fn handle(ctx: &Context, reaction: &Reaction, data: &Data) -> Result<()> { let msg = reaction @@ -52,8 +35,9 @@ async fn send_to_reactboard( msg: &Message, data: &Data, ) -> Result<()> { + let storage = &data.storage; let gid = msg.guild_id.unwrap_or_default(); - let settings = Settings::from_redis(&data.redis, &gid).await?; + let settings = storage.get_guild_settings(&gid).await?; // make sure everything is in order... let target = if let Some(target) = settings.reactboard_channel { @@ -76,22 +60,7 @@ async fn send_to_reactboard( return Ok(()); } - let mut con = data.redis.get_async_connection().await?; - let req = con.get(REACT_BOARD_KEY).await; - - let mut reactboard: ReactBoardInfo = if let Err(why) = req { - // set the value to the default if the key is uninitialized - match why.kind() { - redis::ErrorKind::TypeError => { - warn!("Initializing {REACT_BOARD_KEY} key in Redis..."); - con.set(REACT_BOARD_KEY, ReactBoardInfo::default()).await?; - con.get(REACT_BOARD_KEY).await? - } - _ => return Err(why.into()), - } - } else { - req? - }; + let mut reactboard = storage.get_reactboard_info().await?; // try to find previous reactboard entry by the id of the original message let old_index = reactboard @@ -107,11 +76,11 @@ async fn send_to_reactboard( // bail if we don't need to edit anything if old_entry.reaction_count >= reaction.count { - info!("Message {} doesn't need updating", msg.id); + debug!("Message {} doesn't need updating", msg.id); return Ok(()); } - info!( + debug!( "Bumping {} reaction count from {} to {}", msg.id, old_entry.reaction_count, reaction.count ); @@ -138,11 +107,11 @@ async fn send_to_reactboard( reactboard.reactions.remove(old_index); reactboard.reactions.push(new_entry.clone()); - info!( - "Updating ReactBoard entry {} in {REACT_BOARD_KEY}\nOld:\n{old_entry:#?}\nNew:\n{new_entry:#?}", + debug!( + "Updating ReactBoard entry {}\nOld entry:\n{old_entry:#?}\n\nNew:\n{new_entry:#?}\n", msg.id ); - con.set(REACT_BOARD_KEY, reactboard).await?; + storage.create_reactboard_info_key(reactboard).await?; // make new message and add entry to redis otherwise } else { let embed = utils::resolve_message_to_embed(ctx, msg).await; @@ -164,11 +133,11 @@ async fn send_to_reactboard( reactboard.reactions.push(entry.clone()); - info!( + debug!( "Creating new ReactBoard entry {} in {REACT_BOARD_KEY}:\n{:#?}", msg.id, entry ); - con.set(REACT_BOARD_KEY, reactboard).await?; + storage.create_reactboard_info_key(reactboard).await?; } Ok(()) |
