From ec2be10acaacaffb72c6850d420f43c611b3182f Mon Sep 17 00:00:00 2001 From: "Brian S. Stephan" Date: Sun, 25 Jul 2010 17:39:22 -0500 Subject: [PATCH] dice roller, fairly sophisticated already, for normal rolls --- dr.botzo.py | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/dr.botzo.py b/dr.botzo.py index 4174dff..dbba129 100755 --- a/dr.botzo.py +++ b/dr.botzo.py @@ -3,6 +3,7 @@ from ConfigParser import ConfigParser, NoSectionError, NoOptionError from datetime import datetime import os +import random import re import sys @@ -182,6 +183,74 @@ def sub_countdown(connection, event, nick, userhost, replypath, what, admin_unlo connection.privmsg(replypath, relstr) except NoOptionError: pass +##### +# sub_dice +# roll dice, primarily for roleplaying games +##### + +def sub_dice(connection, event, nick, userhost, replypath, what, admin_unlocked): + pattern = '^(?:(\d+)#)?(?:(\d+)/)?(\d+)?d(\d+)(?:(\+|\-)(\d+))?(?:\s+(.*))?' + regex = re.compile(pattern) + roll = what + matches = regex.search(roll) + + if matches is not None: + # set variables including defaults for unspecified stuff + faces = int(matches.group(4)) + comment = matches.group(7) + + if matches.group(1) is None: + times = 1 + else: + times = int(matches.group(1)) + + if matches.group(3) is None: + dice = 1 + else: + dice = int(matches.group(3)) + + if matches.group(2) is None: + top = dice + else: + top = int(matches.group(2)) + + if matches.group(5) is None or matches.group(6) is None: + modifier = 0 + else: + if str(matches.group(5)) == '-': + modifier = -1 * int(matches.group(6)) + else: + modifier = int(matches.group(6)) + + result = '' + if comment is not None: + result += comment + ': ' + + for t in range(times): + ressubstr = "" + rolls = [] + for d in range(dice): + rolls.append(str(random.randint(1, faces))) + rolls.sort() + rolls.reverse() + ressubstr = ','.join(rolls[0:top]) + sum = 0 + for r in rolls[0:top]: + sum += int(r) + sumplus = sum + modifier + result += str(sumplus) + ' [' + ressubstr + if modifier != 0: + if modifier > 0: + result += ' + ' + str(modifier) + else: + result += ' - ' + str(-1 * modifier) + result += ']' + + if t != times-1: + result += ', ' + + connection.privmsg(replypath, result) + ##### # on_connect # handler for when the bot has connected to IRC @@ -231,6 +300,7 @@ def on_privmsg(connection, event): # standard commands sub_report_seen(connection, event, nick, userhost, replypath, what, admin_unlocked) sub_countdown(connection, event, nick, userhost, replypath, what, admin_unlocked) + sub_dice(connection, event, nick, userhost, replypath, what, admin_unlocked) ##### # on_pubmsg @@ -272,6 +342,7 @@ def on_pubmsg(connection, event): # standard commands sub_report_seen(connection, event, nick, userhost, replypath, what, admin_unlocked) sub_countdown(connection, event, nick, userhost, replypath, what, admin_unlocked) + sub_dice(connection, event, nick, userhost, replypath, what, admin_unlocked) ##### # init