diff options
| author | Skye <[email protected]> | 2023-12-28 18:12:36 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-12-28 09:12:36 +0000 |
| commit | 67dd9a1f2613e7781fca3c309b6b3b93804dab18 (patch) | |
| tree | 0ea138463227a032084d4274cbea5eaf52e97a82 /src/commands/optional | |
| parent | a1913ad35602c54483c502f72815e4bc2c2f38c6 (diff) | |
opt-commands: add uwurandom (#112)
* opt-commands: add uwurandom
* Apply suggestions from code review
Co-authored-by: seth <[email protected]>
* opt-commands: set random default value for uwurandom
---------
Co-authored-by: seth <[email protected]>
Diffstat (limited to 'src/commands/optional')
| -rw-r--r-- | src/commands/optional/mod.rs | 7 | ||||
| -rw-r--r-- | src/commands/optional/uwurandom.rs | 41 |
2 files changed, 47 insertions, 1 deletions
diff --git a/src/commands/optional/mod.rs b/src/commands/optional/mod.rs index 2be1fef..8ef7757 100644 --- a/src/commands/optional/mod.rs +++ b/src/commands/optional/mod.rs @@ -5,7 +5,12 @@ use poise::Command; mod copypasta; mod teawiespam; +mod uwurandom; pub fn to_commands() -> Vec<Command<Data, Report>> { - vec![copypasta::copypasta(), teawiespam::teawiespam()] + vec![ + copypasta::copypasta(), + teawiespam::teawiespam(), + uwurandom::uwurandom(), + ] } diff --git a/src/commands/optional/uwurandom.rs b/src/commands/optional/uwurandom.rs new file mode 100644 index 0000000..c8405a0 --- /dev/null +++ b/src/commands/optional/uwurandom.rs @@ -0,0 +1,41 @@ +use crate::Context; + +use color_eyre::eyre::Result; +use log::debug; +use rand::Rng; + +/// Generate some amount of uwurandom +#[poise::command(slash_command)] +pub async fn uwurandom( + ctx: Context<'_>, + #[description = "The amount of uwurandom to generate"] + #[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?; + + 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(()); + } + + let length = length.unwrap_or(rand::thread_rng().gen_range(1..50)); + + let mut result = String::with_capacity(length as usize); + // ThreadRng is not Send(obviously), and rustc is slightly too paranoid about rng spilling to await point + // So calm it by constraining it to a block + { + let mut rng = rand::thread_rng(); + let mut state_machine = uwurandom_rs::StateMachine::new(&mut rng); + for _ in 0..length { + let generated; + (state_machine, generated) = state_machine.generate(&mut rng); + result.push(generated); + } + } + ctx.say(result).await?; + Ok(()) +} |
