while I'm doing that, standardize the usage of raising exceptions when parsing goes wrong
75 lines
2.4 KiB
Python
75 lines
2.4 KiB
Python
"""Roll dice when asked, intended for RPGs."""
|
||
import logging
|
||
import re
|
||
import random
|
||
|
||
from irc.client import NickMask
|
||
|
||
from dice.roller import DiceRoller
|
||
from ircbot.lib import Plugin
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
class Dice(Plugin):
|
||
"""Roll simple or complex dice strings."""
|
||
|
||
def __init__(self):
|
||
"""Set up the plugin."""
|
||
super(Dice, self).__init__()
|
||
self.roller = DiceRoller()
|
||
|
||
def start(self):
|
||
"""Set up the handlers."""
|
||
self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!roll\s+(.*)$',
|
||
self.handle_roll, -20)
|
||
self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!random\s+(.*)$',
|
||
self.handle_random, -20)
|
||
|
||
super(Dice, self).start()
|
||
|
||
def stop(self):
|
||
"""Tear down handlers."""
|
||
self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.handle_roll)
|
||
self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.handle_random)
|
||
|
||
super(Dice, self).stop()
|
||
|
||
def handle_random(self, connection, event, match):
|
||
"""Handle the !random command which picks an item from a list."""
|
||
|
||
nick = NickMask(event.source).nick
|
||
choices = match.group(1)
|
||
|
||
choices_list = choices.split(' ')
|
||
choice = random.choice(choices_list)
|
||
|
||
logger.debug(event.recursing)
|
||
if event.recursing:
|
||
reply = "{0:s}".format(choice)
|
||
else:
|
||
reply = "{0:s}: {1:s}".format(nick, choice)
|
||
return self.bot.reply(event, reply)
|
||
|
||
def handle_roll(self, connection, event, match):
|
||
"""Handle the !roll command which covers most common dice stuff."""
|
||
|
||
nick = NickMask(event.source).nick
|
||
dicestr = match.group(1)
|
||
|
||
logger.debug(event.recursing)
|
||
try:
|
||
reply_str = self.roller.do_roll(dicestr)
|
||
except AssertionError as aex:
|
||
reply_str = f"Could not roll dice: {aex}"
|
||
except ValueError:
|
||
reply_str = "Unable to parse roll"
|
||
|
||
if event.recursing:
|
||
reply = "{0:s}".format(reply_str)
|
||
else:
|
||
reply = "{0:s}: {1:s}".format(nick, reply_str)
|
||
return self.bot.reply(event, re.sub(r'(\d+)(.*?\s+)(\(.*?\))', r'\1\214\3', reply))
|
||
|
||
plugin = Dice
|