summaryrefslogtreecommitdiff
path: root/src/commands/optional
diff options
context:
space:
mode:
authorseth <[email protected]>2024-04-20 02:31:40 +0000
committerGitHub <[email protected]>2024-04-19 22:31:40 -0400
commit3d07413690c551d9f034c93af85ae8da5a495e14 (patch)
tree517d2e053ebdeb9a3be0ffce6dec36cbc4ce316e /src/commands/optional
parent1b92b254bc64b356f5c59657d2f0acc767bb2964 (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/commands/optional')
-rw-r--r--src/commands/optional/copypasta.rs94
-rw-r--r--src/commands/optional/mod.rs19
-rw-r--r--src/commands/optional/teawiespam.rs26
-rw-r--r--src/commands/optional/uwurandom.rs24
4 files changed, 79 insertions, 84 deletions
diff --git a/src/commands/optional/copypasta.rs b/src/commands/optional/copypasta.rs
index 15171f8..06440b1 100644
--- a/src/commands/optional/copypasta.rs
+++ b/src/commands/optional/copypasta.rs
@@ -1,18 +1,14 @@
-use crate::Context;
+use crate::{Context, Error};
-use std::collections::HashMap;
-
-use eyre::{eyre, OptionExt, Result};
use include_dir::{include_dir, Dir};
use log::debug;
-const FILES: Dir = include_dir!("src/copypastas");
+const COPYPASTAS: Dir = include_dir!("src/copypastas");
-#[allow(clippy::upper_case_acronyms)]
#[derive(Debug, poise::ChoiceParameter)]
-pub enum Copypastas {
+pub enum Copypasta {
Astral,
- DVD,
+ Dvd,
Egrill,
HappyMeal,
Sus,
@@ -20,43 +16,27 @@ pub enum Copypastas {
Twitter,
}
-impl Copypastas {
- fn as_str(&self) -> &str {
- match self {
- Copypastas::Astral => "astral",
- Copypastas::DVD => "dvd",
- Copypastas::Egrill => "egrill",
- Copypastas::HappyMeal => "happymeal",
- Copypastas::Sus => "sus",
- Copypastas::TickTock => "ticktock",
- Copypastas::Twitter => "twitter",
- }
+impl ToString for Copypasta {
+ fn to_string(&self) -> String {
+ let str = match self {
+ Self::Astral => "astral",
+ Self::Dvd => "dvd",
+ Self::Egrill => "egrill",
+ Self::HappyMeal => "happymeal",
+ Self::Sus => "sus",
+ Self::TickTock => "ticktock",
+ Self::Twitter => "twitter",
+ };
+ str.to_string()
}
}
-fn get_copypasta(name: &Copypastas) -> Result<String> {
- let mut files: HashMap<&str, &str> = HashMap::new();
-
- for file in FILES.files() {
- let name = file
- .path()
- .file_stem()
- .ok_or_else(|| eyre!("Couldn't get file stem from {file:#?}"))?
- .to_str()
- .ok_or_eyre("Couldn't convert file stem to str!")?;
-
- let contents = file
- .contents_utf8()
- .ok_or_eyre("Couldnt get contents from copypasta!")?;
-
- // refer to files by their name w/o extension
- files.insert(name, contents);
- }
-
- if files.contains_key(name.as_str()) {
- Ok(files[name.as_str()].to_string())
- } else {
- Err(eyre!("Couldnt find copypasta {}!", name.as_str()))
+impl Copypasta {
+ fn contents(&self) -> Option<&str> {
+ let file_name = format!("{}.txt", self.to_string());
+ COPYPASTAS
+ .get_file(file_name)
+ .and_then(|file| file.contents_utf8())
}
}
@@ -64,18 +44,30 @@ fn get_copypasta(name: &Copypastas) -> Result<String> {
#[poise::command(slash_command)]
pub async fn copypasta(
ctx: Context<'_>,
- #[description = "the copypasta you want to send"] copypasta: Copypastas,
-) -> Result<()> {
- let gid = ctx.guild_id().unwrap_or_default();
- let settings = ctx.data().storage.get_guild_settings(&gid).await?;
+ #[description = "the copypasta you want to send"] copypasta: Copypasta,
+) -> Result<(), Error> {
+ if let Some(guild_id) = ctx.guild_id() {
+ if let Some(storage) = &ctx.data().storage {
+ let settings = storage.get_guild_settings(&guild_id).await?;
+
+ if !settings.optional_commands_enabled {
+ debug!("Not running command in {guild_id} since it's disabled");
+ ctx.reply("I'm not allowed to do that here").await?;
- if !settings.optional_commands_enabled {
- debug!("Exited copypasta command in {gid} since it's disabled");
- ctx.say("I'm not allowed to do that here").await?;
- return Ok(());
+ return Ok(());
+ }
+ } else {
+ debug!("Ignoring restrictions on command; no storage backend is attached!");
+ }
+ } else {
+ debug!("Ignoring restrictions on command; we're not in a guild");
}
- ctx.say(get_copypasta(&copypasta)?).await?;
+ if let Some(contents) = copypasta.contents() {
+ ctx.say(contents).await?;
+ } else {
+ ctx.reply("I couldn't find that copypasta :(").await?;
+ }
Ok(())
}
diff --git a/src/commands/optional/mod.rs b/src/commands/optional/mod.rs
index 39abdcb..95c39bd 100644
--- a/src/commands/optional/mod.rs
+++ b/src/commands/optional/mod.rs
@@ -1,16 +1,3 @@
-use crate::Data;
-
-use eyre::Report;
-use poise::Command;
-
-mod copypasta;
-mod teawiespam;
-mod uwurandom;
-
-pub fn to_commands() -> Vec<Command<Data, Report>> {
- vec![
- copypasta::copypasta(),
- teawiespam::teawiespam(),
- uwurandom::uwurandom(),
- ]
-}
+pub mod copypasta;
+pub mod teawiespam;
+pub mod uwurandom;
diff --git a/src/commands/optional/teawiespam.rs b/src/commands/optional/teawiespam.rs
index 7f7ba79..3a9a387 100644
--- a/src/commands/optional/teawiespam.rs
+++ b/src/commands/optional/teawiespam.rs
@@ -1,21 +1,29 @@
-use crate::Context;
+use crate::{Context, Error};
-use eyre::Result;
use log::debug;
/// teawie will spam you.
#[poise::command(slash_command)]
-pub async fn teawiespam(ctx: Context<'_>) -> Result<()> {
- let gid = ctx.guild_id().unwrap_or_default();
- let settings = ctx.data().storage.get_guild_settings(&gid).await?;
+pub async fn teawiespam(ctx: Context<'_>) -> Result<(), Error> {
+ if let Some(guild_id) = ctx.guild_id() {
+ if let Some(storage) = &ctx.data().storage {
+ let settings = storage.get_guild_settings(&guild_id).await?;
- if !settings.optional_commands_enabled {
- debug!("Not running teawiespam in {gid} since it's disabled");
- ctx.say("I'm not allowed to do that here").await?;
- return Ok(());
+ if !settings.optional_commands_enabled {
+ debug!("Not running command in {guild_id} since it's disabled");
+ ctx.say("I'm not allowed to do that here").await?;
+
+ return Ok(());
+ }
+ } else {
+ debug!("Ignoring restrictions on command; no storage backend is attached!");
+ }
+ } else {
+ debug!("Ignoring restrictions on command; we're not in a guild.");
}
let wies = "<:teawiesmile:1056438046440042546>".repeat(50);
ctx.say(wies).await?;
+
Ok(())
}
diff --git a/src/commands/optional/uwurandom.rs b/src/commands/optional/uwurandom.rs
index 312e54f..e717d5e 100644
--- a/src/commands/optional/uwurandom.rs
+++ b/src/commands/optional/uwurandom.rs
@@ -1,4 +1,4 @@
-use crate::Context;
+use crate::{Context, Error};
use eyre::Result;
use log::debug;
@@ -12,14 +12,22 @@ pub async fn uwurandom(
#[min = 1]
#[max = 2000]
length: Option<u16>,
-) -> Result<()> {
- let gid = ctx.guild_id().unwrap_or_default();
- let settings = ctx.data().storage.get_guild_settings(&gid).await?;
+) -> Result<(), Error> {
+ if let Some(guild_id) = ctx.guild_id() {
+ if let Some(storage) = &ctx.data().storage {
+ let settings = storage.get_guild_settings(&guild_id).await?;
- if !settings.optional_commands_enabled {
- debug!("Not running uwurandom in {gid} since it's disabled");
- ctx.say("I'm not allowed to do that here").await?;
- return Ok(());
+ if !settings.optional_commands_enabled {
+ debug!("Not running command in {guild_id} since it's disabled");
+ ctx.say("I'm not allowed to do that here").await?;
+
+ return Ok(());
+ }
+ } else {
+ debug!("Ignoring restrictions on command; no storage backend is attached!");
+ }
+ } else {
+ debug!("Ignoring restrictions on command; we're not in a guild");
}
let length = length.unwrap_or(rand::thread_rng().gen_range(1..50));