#!/usr/bin/env bash [ -f functions.sh ] && source functions.sh roll_dice() { local count=${1%[dD]*} local sides=${1#*[dD]} local i local total=0 for i in $(seq $count) ; do local die=$(($RANDOM % $sides + 1)) total=$((total + $die)) if [[ $i -le 10 ]]; then if [[ $i -lt $count ]]; then echo -n "${die}, " else if [[ $count -gt 1 ]]; then echo -n "and ${die} " else echo -n "${die} " fi fi fi done if [[ $((count - 10)) -gt 1 ]]; then echo -n "and $((count - 10)) more dice " fi if [[ $((count - 10)) -eq 1 ]]; then echo -n "and 1 more die " fi echo "for a total of ${total}." } rollString="${3##* }" # Validate roll string is provided if [[ -z "$rollString" ]]; then msg "$2" "${1}: Usage is roll #d# (e.g., 2d6, 1d20)" exit 0 fi # Validate roll string format if ! [[ "$rollString" =~ ^[1-9][0-9]*[dD][1-9][0-9]*$ ]]; then msg "$2" "${1}: Invalid format. Usage: roll #d# where # is greater than 0 (e.g., 2d6, 1d20)" exit 0 fi # Extract count and sides for validation count=${rollString%[dD]*} sides=${rollString#*[dD]} # Validate reasonable limits to prevent abuse if [[ $count -gt 1000 ]]; then msg "$2" "${1}: Maximum 1000 dice per roll." exit 0 fi if [[ $sides -gt 1000 ]]; then msg "$2" "${1}: Maximum 1000 sides per die." exit 0 fi msg "$2" "$(roll_dice ${rollString})"