diff options
| author | seth <[email protected]> | 2023-12-02 07:00:24 -0500 |
|---|---|---|
| committer | seth <[email protected]> | 2023-12-15 16:41:13 -0500 |
| commit | 0025ad5ea8d412aacc3184d18063fd5ff3de0175 (patch) | |
| tree | 1d2b5ac5c04a092756180722358d929feeae50aa /src/commands | |
| parent | ac32ec2a0ba37deb0ad82b4f2ee9c1e1b359cc88 (diff) | |
feat: add per guild configuration
Diffstat (limited to 'src/commands')
| -rw-r--r-- | src/commands/general/ask.rs (renamed from src/commands/ask.rs) | 3 | ||||
| -rw-r--r-- | src/commands/general/bing.rs (renamed from src/commands/bing.rs) | 1 | ||||
| -rw-r--r-- | src/commands/general/convert.rs (renamed from src/commands/convert.rs) | 1 | ||||
| -rw-r--r-- | src/commands/general/mod.rs | 11 | ||||
| -rw-r--r-- | src/commands/general/random.rs (renamed from src/commands/random.rs) | 1 | ||||
| -rw-r--r-- | src/commands/general/version.rs (renamed from src/commands/version.rs) | 1 | ||||
| -rw-r--r-- | src/commands/mod.rs | 27 | ||||
| -rw-r--r-- | src/commands/moderation/config.rs | 140 | ||||
| -rw-r--r-- | src/commands/moderation/mod.rs | 3 | ||||
| -rw-r--r-- | src/commands/optional/copypasta.rs (renamed from src/commands/copypasta.rs) | 11 | ||||
| -rw-r--r-- | src/commands/optional/mod.rs | 5 | ||||
| -rw-r--r-- | src/commands/optional/teawiespam.rs (renamed from src/commands/teawiespam.rs) | 7 |
12 files changed, 180 insertions, 31 deletions
diff --git a/src/commands/ask.rs b/src/commands/general/ask.rs index 3589484..4bbf82e 100644 --- a/src/commands/ask.rs +++ b/src/commands/general/ask.rs @@ -1,5 +1,4 @@ use crate::{consts, utils, Context}; - use color_eyre::eyre::{Context as _, Result}; /// ask teawie a question! @@ -11,7 +10,7 @@ pub async fn ask( _question: String, ) -> Result<()> { let resp = utils::random_choice(consts::RESPONSES) - .wrap_err("couldn't choose from random responses!")?; + .wrap_err("Couldn't choose from random responses!")?; ctx.say(resp).await?; Ok(()) diff --git a/src/commands/bing.rs b/src/commands/general/bing.rs index b80ebca..fefbaf1 100644 --- a/src/commands/bing.rs +++ b/src/commands/general/bing.rs @@ -1,5 +1,4 @@ use crate::Context; - use color_eyre::eyre::Result; /// make sure the wie is alive diff --git a/src/commands/convert.rs b/src/commands/general/convert.rs index cbbf8dc..60135c4 100644 --- a/src/commands/convert.rs +++ b/src/commands/general/convert.rs @@ -1,5 +1,4 @@ use crate::Context; - use bottomify::bottom; use color_eyre::eyre::Result; diff --git a/src/commands/general/mod.rs b/src/commands/general/mod.rs new file mode 100644 index 0000000..ffb4d63 --- /dev/null +++ b/src/commands/general/mod.rs @@ -0,0 +1,11 @@ +mod ask; +mod bing; +mod convert; +mod random; +mod version; + +pub use ask::ask; +pub use bing::bing; +pub use convert::convert; +pub use random::random; +pub use version::version; diff --git a/src/commands/random.rs b/src/commands/general/random.rs index 9595d09..9aa282a 100644 --- a/src/commands/random.rs +++ b/src/commands/general/random.rs @@ -1,5 +1,4 @@ use crate::{api, consts, utils, Context}; - use color_eyre::eyre::Result; #[poise::command(slash_command, subcommands("lore", "teawie", "shiggy"))] diff --git a/src/commands/version.rs b/src/commands/general/version.rs index 8d9a1f3..8b8d1f1 100644 --- a/src/commands/version.rs +++ b/src/commands/general/version.rs @@ -1,6 +1,5 @@ use crate::colors::Colors; use crate::Context; - use color_eyre::eyre::Result; /// get version info diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 5edf0b7..8c265d3 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -1,28 +1,23 @@ -pub mod ask; -pub mod bing; -pub mod convert; -pub mod copypasta; -pub mod random; -pub mod teawiespam; -pub mod version; - use crate::Data; use color_eyre::eyre::Report; use poise::Command; +mod general; +mod moderation; +mod optional; + pub fn to_global_commands() -> Vec<Command<Data, Report>> { vec![ - ask::ask(), - bing::bing(), - convert::convert(), - random::random(), - copypasta::copypasta(), - teawiespam::teawiespam(), - version::version(), + general::ask(), + general::bing(), + general::convert(), + general::random(), + general::version(), + moderation::config(), ] } pub fn to_guild_commands() -> Vec<Command<Data, Report>> { - vec![copypasta::copypasta(), teawiespam::teawiespam()] + vec![optional::copypasta(), optional::teawiespam()] } diff --git a/src/commands/moderation/config.rs b/src/commands/moderation/config.rs new file mode 100644 index 0000000..2d1410c --- /dev/null +++ b/src/commands/moderation/config.rs @@ -0,0 +1,140 @@ +use crate::settings::{Settings, SettingsProperties}; +use crate::Context; + +use color_eyre::eyre::{eyre, Context as _, ContextCompat, Result}; +use log::*; +use poise::serenity_prelude::{GuildChannel, ReactionType}; + +#[poise::command( + slash_command, + subcommands("set", "get"), + default_member_permissions = "MANAGE_GUILD" +)] +pub async fn config(_ctx: Context<'_>) -> Result<()> { + Ok(()) +} + +#[poise::command(slash_command, ephemeral, guild_only)] +pub async fn set( + ctx: Context<'_>, + #[channel_types("Text")] + #[description = "Where to redirect pins from channels. If empty (the default), the PinBoard is disabled."] + pinboard_channel: Option<GuildChannel>, + #[channel_types("Text")] + #[description = "A channel that PinBoard will redirect pins from. This will be all channels if empty."] + pinboard_watch: Option<GuildChannel>, + #[channel_types("Text")] + #[description = "Where to post messages that made it to the ReactBoard. If left empty, ReactBoard is disabled."] + reactboard_channel: Option<GuildChannel>, + #[description = "An emoji that will get messages on the ReactBoard. If empty, ReactBoard is disabled."] + reactboard_reaction: Option<String>, + #[description = "Minimum number of reactions a message needs to make it to the ReactBoard (defaults to 5)"] + reactboard_requirement: Option<u64>, + #[description = "Enables 'extra' commands like teawiespam and copypasta. Defaults to false."] + optional_commands_enabled: Option<bool>, +) -> Result<()> { + let redis = &ctx.data().redis; + let gid = ctx.guild_id().unwrap_or_default(); + let mut settings = Settings::from_redis(redis, &gid).await?; + let previous_settings = settings.clone(); + + if let Some(channel) = pinboard_channel { + settings.pinboard_channel = Some(channel.id); + } + + if let Some(watch) = pinboard_watch { + if let Some(mut prev) = settings.pinboard_watch { + prev.push(watch.id); + settings.pinboard_watch = Some(prev); + } else { + let new = Vec::from([watch.id]); + debug!("Setting pinboard_watch to {new:#?} for {} in Redis", gid); + + settings.pinboard_watch = Some(new); + } + } + + if let Some(channel) = reactboard_channel { + debug!( + "Setting reactboard_channel to {channel} for {} in Redis", + gid + ); + + settings.reactboard_channel = Some(channel.id); + } + + if let Some(requirement) = reactboard_requirement { + debug!( + "Setting reactboard_requirement to {requirement} for {} in Redis", + gid + ); + + settings.reactboard_requirement = Some(requirement); + } + + if let Some(reaction) = reactboard_reaction { + let emoji = reaction + .parse::<ReactionType>() + .wrap_err_with(|| format!("Couldn't parse {reaction} as string!"))?; + + if let Some(mut prev) = settings.reactboard_reactions { + prev.push(emoji); + settings.reactboard_reactions = Some(prev); + } else { + let new = Vec::from([emoji]); + debug!("Setting pinboard_watch to {new:#?} for {} in Redis", gid); + + settings.reactboard_reactions = Some(new); + } + } + + if let Some(enabled) = optional_commands_enabled { + debug!( + "Setting optional_commands_enabled to {enabled} for {} in Redis", + gid + ); + + settings.optional_commands_enabled = enabled; + } + + if previous_settings != settings { + settings.save(redis).await?; + ctx.reply("Configuration updated!").await?; + } else { + ctx.reply("No changes made, so i'm not updating anything") + .await?; + } + + Ok(()) +} + +#[poise::command(slash_command, ephemeral, guild_only)] +pub async fn get( + ctx: Context<'_>, + #[description = "The setting you want to get"] setting: SettingsProperties, +) -> Result<()> { + let gid = &ctx + .guild_id() + .wrap_err_with(|| eyre!("Failed to get GuildId from context!"))?; + + let settings = Settings::from_redis(&ctx.data().redis, gid).await?; + + let value = match setting { + SettingsProperties::GuildId => settings.guild_id.to_string(), + SettingsProperties::PinBoardChannel => format!("{:#?}", settings.pinboard_channel), + SettingsProperties::PinBoardWatch => format!("{:#?}", settings.pinboard_watch), + SettingsProperties::ReactBoardChannel => format!("{:#?}", settings.reactboard_channel), + SettingsProperties::ReactBoardRequirement => { + format!("{:?}", settings.reactboard_requirement) + } + SettingsProperties::ReactBoardReactions => format!("{:?}", settings.reactboard_reactions), + SettingsProperties::OptionalCommandsEnabled => { + settings.optional_commands_enabled.to_string() + } + }; + + ctx.send(|m| m.embed(|e| e.field(setting, value, false))) + .await?; + + Ok(()) +} diff --git a/src/commands/moderation/mod.rs b/src/commands/moderation/mod.rs new file mode 100644 index 0000000..d54b3f8 --- /dev/null +++ b/src/commands/moderation/mod.rs @@ -0,0 +1,3 @@ +mod config; + +pub use config::config; diff --git a/src/commands/copypasta.rs b/src/commands/optional/copypasta.rs index 16ac562..ea23f5f 100644 --- a/src/commands/copypasta.rs +++ b/src/commands/optional/copypasta.rs @@ -1,4 +1,4 @@ -use crate::Context; +use crate::{Context, Settings}; use std::collections::HashMap; @@ -66,12 +66,11 @@ pub async fn copypasta( ctx: Context<'_>, #[description = "the copypasta you want to send"] copypasta: Copypastas, ) -> Result<()> { - let gid = ctx - .guild_id() - .ok_or_else(|| eyre!("couldnt get guild from message!"))?; + let gid = ctx.guild_id().unwrap_or_default(); + let settings = Settings::from_redis(&ctx.data().redis, &gid).await?; - if !ctx.data().settings.is_guild_allowed(gid) { - info!("not running copypasta command in {gid}"); + if !settings.optional_commands_enabled { + debug!("Not running copypasta command in {gid} since it's disabled"); return Ok(()); } diff --git a/src/commands/optional/mod.rs b/src/commands/optional/mod.rs new file mode 100644 index 0000000..451deeb --- /dev/null +++ b/src/commands/optional/mod.rs @@ -0,0 +1,5 @@ +mod copypasta; +mod teawiespam; + +pub use copypasta::copypasta; +pub use teawiespam::teawiespam; diff --git a/src/commands/teawiespam.rs b/src/commands/optional/teawiespam.rs index aeea255..c1b3b29 100644 --- a/src/commands/teawiespam.rs +++ b/src/commands/optional/teawiespam.rs @@ -1,4 +1,4 @@ -use crate::Context; +use crate::{Context, Settings}; use color_eyre::eyre::Result; use log::*; @@ -7,9 +7,10 @@ use log::*; #[poise::command(slash_command, prefix_command)] pub async fn teawiespam(ctx: Context<'_>) -> Result<()> { let gid = ctx.guild_id().unwrap_or_default(); + let settings = Settings::from_redis(&ctx.data().redis, &gid).await?; - if !ctx.data().settings.is_guild_allowed(gid) { - info!("not running teawiespam command in {gid}"); + if !settings.optional_commands_enabled { + debug!("Not running teawiespam in {gid} since it's disabled"); return Ok(()); } |
