small fixes, rename

This commit is contained in:
Lilith Schier 2026-08-18 19:31:33 +02:00
parent 2c2c78114f
commit 052d8359c4
4 changed files with 54 additions and 30 deletions

34
Cargo.lock generated
View file

@ -889,23 +889,6 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "krait"
version = "0.1.0"
dependencies = [
"anyhow",
"dotenv",
"nom",
"nom-language",
"rand 0.10.2",
"rand_xoshiro",
"serenity",
"thiserror",
"tokio",
"tracing",
"tracing-subscriber",
]
[[package]] [[package]]
name = "lazy_static" name = "lazy_static"
version = "1.5.0" version = "1.5.0"
@ -988,6 +971,23 @@ dependencies = [
"windows-sys 0.61.2", "windows-sys 0.61.2",
] ]
[[package]]
name = "nat1"
version = "0.1.0"
dependencies = [
"anyhow",
"dotenv",
"nom",
"nom-language",
"rand 0.10.2",
"rand_xoshiro",
"serenity",
"thiserror",
"tokio",
"tracing",
"tracing-subscriber",
]
[[package]] [[package]]
name = "nom" name = "nom"
version = "8.0.0" version = "8.0.0"

View file

@ -1,5 +1,5 @@
[package] [package]
name = "krait" name = "nat1"
version = "0.1.0" version = "0.1.0"
edition = "2024" edition = "2024"

View file

@ -99,10 +99,20 @@ impl Expression {
bail!("Too many dice.") bail!("Too many dice.")
}; };
write!(w, "d")?; write!(w, "d")?;
let size = size_node.evaluate(rng, w, precedence)? as i64; let size = size_node.evaluate(rng, w, precedence)?;
if size < 1 { if size.is_nan() {
bail!("Invalid die size.") bail!("dNaN isn't rollable, sorry.")
} }
if size.is_infinite() {
bail!("dinf isn't rollable, sorry.")
}
if size < 1.0 {
bail!("Die size is smaller than 1!")
}
if size > i64::MAX as f64 {
bail!("Die size is too big!")
}
let size = size as i64;
let mut rolls = (0..count) let mut rolls = (0..count)
.map(|_| rng.random_range(1..=size)) .map(|_| rng.random_range(1..=size))
@ -118,9 +128,10 @@ impl Expression {
for fragment in fragments { for fragment in fragments {
comparers.push(fragment.comparer(rng, w)?); comparers.push(fragment.comparer(rng, w)?);
} }
for i in 0..DICE_POOL_LIMIT { let mut i = 0;
if i >= rolls.len() { while i < rolls.len() {
break; if i > DICE_POOL_LIMIT {
bail!("Explosion added too many dice.")
} }
if comparers.len() == 0 { if comparers.len() == 0 {
// Explode on max size dice // Explode on max size dice
@ -136,6 +147,7 @@ impl Expression {
} }
} }
} }
i += 1;
} }
} }

View file

@ -4,10 +4,7 @@ mod parsing;
use anyhow::bail; use anyhow::bail;
use dotenv::dotenv; use dotenv::dotenv;
use rand::{Rng, SeedableRng}; use rand::{Rng, SeedableRng};
use serenity::all::{ use serenity::all::{Command, CommandInteraction, CommandOptionType, CreateCommandOption, CreateComponent, FullEvent, Interaction, InteractionContext, MessageFlags, ResolvedOption, ResolvedValue};
Command, CommandInteraction, CommandOptionType, CreateCommandOption, CreateComponent,
FullEvent, Interaction, MessageFlags, ResolvedOption, ResolvedValue,
};
use serenity::builder::{ use serenity::builder::{
CreateCommand, CreateContainer, CreateContainerComponent, CreateInteractionResponse, CreateCommand, CreateContainer, CreateContainerComponent, CreateInteractionResponse,
CreateInteractionResponseFollowup, CreateInteractionResponseMessage, CreateTextDisplay, CreateInteractionResponseFollowup, CreateInteractionResponseMessage, CreateTextDisplay,
@ -96,7 +93,10 @@ impl EventHandler for Handler {
CommandOptionType::String, CommandOptionType::String,
"seed", "seed",
"Roll with a fixed seed. This bot uses xoshiro256++.", "Roll with a fixed seed. This bot uses xoshiro256++.",
)), ))
.add_context(InteractionContext::Guild)
.add_context(InteractionContext::BotDm)
.add_context(InteractionContext::PrivateChannel),
) )
.await; .await;
@ -189,7 +189,19 @@ pub async fn roll(ctx: &Context, command: &CommandInteraction) -> anyhow::Result
let seed = fixed_seed.unwrap_or_else(|| rand::rng().next_u64()); let seed = fixed_seed.unwrap_or_else(|| rand::rng().next_u64());
let mut rng = rand_xoshiro::Xoshiro256PlusPlus::seed_from_u64(seed); let mut rng = rand_xoshiro::Xoshiro256PlusPlus::seed_from_u64(seed);
let ev = (expression.average(&mut rng)? * 10.0).round() / 10.0; let average = match expression.average(&mut rng) {
Ok(res) => res,
Err(err) => {
command
.create_followup(
&ctx.http,
CreateInteractionResponseFollowup::new().content(format!("{}", err)),
)
.await?;
return Err(err);
}
};
let ev = (average * 10.0).round() / 10.0;
let mut text_components = Vec::with_capacity((repeat + 2) as usize); let mut text_components = Vec::with_capacity((repeat + 2) as usize);
if let Some(description) = description { if let Some(description) = description {