bitbot-3.11-fork/modules/dice.py
2019-09-26 14:04:59 +01:00

44 lines
1.5 KiB
Python

#--depends-on commands
import random, re
from src import ModuleManager, utils
ERROR_FORMAT = "Incorrect format! Format must be [number]d[number], e.g. 1d20"
RE_DICE = re.compile("([1-9]\d*)d([1-9]\d*)((?:[-+]\d+)*)", re.I)
RE_MODIFIERS = re.compile("([-+]\d+)")
class Module(ModuleManager.BaseModule):
@utils.hook("received.command.roll", min_args=1)
def roll_dice(self, event):
"""
:help: Roll some dice, DND style
:usage: [1-5]d[1-20]
"""
match = RE_DICE.match(event["args_split"][0])
if match:
roll = match.group(0)
dice_count = int(match.group(1))
side_count = int(match.group(2))
modifiers = RE_MODIFIERS.findall(match.group(3))
if dice_count > 6:
raise utils.EventError("Max number of dice is 6")
if side_count > 20:
raise utils.EventError("Max number of sides is 20")
results = random.choices(range(1, side_count+1), k=dice_count)
total_n = sum(results)
for modifier in modifiers:
if modifier[0] == "+":
total_n += int(modifier[1:])
else:
total_n -= int(modifier[1:])
total = ""
if len(results) > 1:
total = " (total: %d)" % total_n
results_str = ", ".join(str(r) for r in results)
event["stdout"].write("Rolled %s and got %s%s" % (
roll, results_str, total))