57 lines
1.5 KiB
Rust
57 lines
1.5 KiB
Rust
use crate::{
|
|
types::dietype,
|
|
util::{junk, random, validate},
|
|
};
|
|
|
|
use serenity::builder::{CreateCommand, CreateCommandOption};
|
|
use serenity::model::application::{CommandOptionType, ResolvedOption, ResolvedValue};
|
|
|
|
pub fn run_core(input: Option<&str>) -> String {
|
|
let Some(input) = input else {
|
|
return junk::get_random_insult();
|
|
};
|
|
|
|
let split = match input.split('d').nth(1) {
|
|
Some(s) => s,
|
|
None => return junk::get_random_insult(),
|
|
};
|
|
|
|
let die_num = match validate::parse_str_into_num::<i32>(split.trim()) {
|
|
Some(d) => d,
|
|
None => return junk::get_random_insult(),
|
|
};
|
|
|
|
match dietype::DieType::from_sides(die_num) {
|
|
Some(_) => {}
|
|
None => return junk::get_random_insult(),
|
|
};
|
|
|
|
let mut rng = random::RandomGen::new();
|
|
rng.range_random_from_one(die_num).to_string()
|
|
}
|
|
|
|
pub async fn run(options: &[ResolvedOption<'_>]) -> String {
|
|
if let Some(ResolvedOption {
|
|
value: ResolvedValue::String(input),
|
|
..
|
|
}) = options.first()
|
|
{
|
|
run_core(Some(input))
|
|
} else {
|
|
junk::get_random_insult()
|
|
}
|
|
}
|
|
|
|
pub fn register() -> CreateCommand {
|
|
CreateCommand::new("roll")
|
|
.description("Roll dice")
|
|
.add_option(
|
|
CreateCommandOption::new(
|
|
CommandOptionType::String,
|
|
"input",
|
|
"The number sides for the dice roll, typically starts with \'d\' then a number",
|
|
)
|
|
.required(true),
|
|
)
|
|
}
|