summaryrefslogtreecommitdiff
path: root/src/commands
diff options
context:
space:
mode:
authorseth <[email protected]>2023-12-02 07:00:24 -0500
committerseth <[email protected]>2023-12-15 16:41:13 -0500
commit0025ad5ea8d412aacc3184d18063fd5ff3de0175 (patch)
tree1d2b5ac5c04a092756180722358d929feeae50aa /src/commands
parentac32ec2a0ba37deb0ad82b4f2ee9c1e1b359cc88 (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.rs11
-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.rs27
-rw-r--r--src/commands/moderation/config.rs140
-rw-r--r--src/commands/moderation/mod.rs3
-rw-r--r--src/commands/optional/copypasta.rs (renamed from src/commands/copypasta.rs)11
-rw-r--r--src/commands/optional/mod.rs5
-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(());
}