<filename>plugins/dice.py<gh_stars>1-10
"""
Dice plugin: roll some dice

Usage of this plugin is not recommended.

Commands
--------

.. glossary::

    /roll [number of dice] [duration of the roll]
        Roll one or several unicode dice

Configuration
-------------

.. glossary::
    :sorted:

    refresh
        **Default:** ``0.5``

        Interval in seconds between each correction (the closest to 0 is the fastest)

    default_duration
        **Default:** ``5``

        Total duration of the animation.
"""

import random

from poezio import tabs
from poezio.decorators import command_args_parser
from poezio.plugin import BasePlugin

DICE = '\u2680\u2681\u2682\u2683\u2684\u2685'


class DiceRoll:
    __slots__ = [
        'duration', 'total_duration', 'dice_number', 'msgtype', 'jid',
        'last_msgid', 'increments'
    ]

    def __init__(self, total_duration, dice_number, is_muc, jid, msgid,
                 increments):
        self.duration = 0
        self.total_duration = total_duration
        self.dice_number = dice_number
        self.msgtype = "groupchat" if is_muc else "chat"
        self.jid = jid
        self.last_msgid = msgid
        self.increments = increments

    def reroll(self):
        self.duration += self.increments

    def is_finished(self):
        return self.duration >= self.total_duration


class Plugin(BasePlugin):
    default_config = {"dice": {"refresh": 0.5, "default_duration": 5}}

    def init(self):
        for tab_t in [tabs.MucTab, tabs.ConversationTab, tabs.PrivateTab]:
            self.api.add_tab_command(
                tab_t,
                'roll',
                self.command_dice,
                help='Roll a die',
                usage='[number] [duration]')

    @command_args_parser.quoted(0, 2, ['', ''], True)
    def command_dice(self, args):
        tab = self.api.current_tab()
        duration = self.config.get('default_duration')
        num_dice = 1
        try:
            if args[0]:
                num_dice = int(args[0])
                if args[1]:
                    duration = float(args[1])
        except ValueError:
            self.core.command.help("roll")
            return
        else:
            if num_dice <= 0 or duration < 0:
                self.core.command.help("roll")
                return

        firstroll = ''.join(random.choice(DICE) for _ in range(num_dice))
        tab.command_say(firstroll)
        is_muctab = isinstance(tab, tabs.MucTab)
        msg_id = tab.last_sent_message["id"]
        increment = self.config.get('refresh')
        roll = DiceRoll(duration, num_dice, is_muctab, tab.name, msg_id,
                        increment)
        event = self.api.create_delayed_event(increment, self.delayed_event,
                                              roll)
        self.api.add_timed_event(event)

    def delayed_event(self, roll):
        if roll.is_finished():
            return
        roll.reroll()
        message = self.core.xmpp.make_message(roll.jid)
        message["type"] = roll.msgtype
        message["body"] = ''.join(
            random.choice(DICE) for _ in range(roll.dice_number))
        message["replace"]["id"] = roll.last_msgid
        message.send()
        roll.last_msgid = message['id']
        event = self.api.create_delayed_event(roll.increments,
                                              self.delayed_event, roll)
        self.api.add_timed_event(event)

<filename>plugins/dice.py<gh_stars>1-10
"""
Dice plugin: roll some dice

Usage of this plugin is not recommended.

Commands
--------

.. glossary::

    /roll [number of dice] [duration of the roll]
        Roll one or several unicode dice

Configuration
-------------

.. glossary::
    :sorted:

    refresh
        **Default:** ``0.5``

        Interval in seconds between each correction (the closest to 0 is the fastest)

    default_duration
        **Default:** ``5``

        Total duration of the animation.
"""

import random

from poezio import tabs
from poezio.decorators import command_args_parser
from poezio.plugin import BasePlugin

DICE = '\u2680\u2681\u2682\u2683\u2684\u2685'


class DiceRoll:
    __slots__ = [
        'duration', 'total_duration', 'dice_number', 'msgtype', 'jid',
        'last_msgid', 'increments'
    ]

    def __init__(self, total_duration, dice_number, is_muc, jid, msgid,
                 increments):
        self.duration = 0
        self.total_duration = total_duration
        self.dice_number = dice_number
        self.msgtype = "groupchat" if is_muc else "chat"
        self.jid = jid
        self.last_msgid = msgid
        self.increments = increments

    def reroll(self):
        self.duration += self.increments

    def is_finished(self):
        return self.duration >= self.total_duration


class Plugin(BasePlugin):
    default_config = {"dice": {"refresh": 0.5, "default_duration": 5}}

    def init(self):
        for tab_t in [tabs.MucTab, tabs.ConversationTab, tabs.PrivateTab]:
            self.api.add_tab_command(
                tab_t,
                'roll',
                self.command_dice,
                help='Roll a die',
                usage='[number] [duration]')

    @command_args_parser.quoted(0, 2, ['', ''], True)
    def command_dice(self, args):
        tab = self.api.current_tab()
        duration = self.config.get('default_duration')
        num_dice = 1
        try:
            if args[0]:
                num_dice = int(args[0])
                if args[1]:
                    duration = float(args[1])
        except ValueError:
            self.core.command.help("roll")
            return
        else:
            if num_dice <= 0 or duration < 0:
                self.core.command.help("roll")
                return

        firstroll = ''.join(random.choice(DICE) for _ in range(num_dice))
        tab.command_say(firstroll)
        is_muctab = isinstance(tab, tabs.MucTab)
        msg_id = tab.last_sent_message["id"]
        increment = self.config.get('refresh')
        roll = DiceRoll(duration, num_dice, is_muctab, tab.name, msg_id,
                        increment)
        event = self.api.create_delayed_event(increment, self.delayed_event,
                                              roll)
        self.api.add_timed_event(event)

    def delayed_event(self, roll):
        if roll.is_finished():
            return
        roll.reroll()
        message = self.core.xmpp.make_message(roll.jid)
        message["type"] = roll.msgtype
        message["body"] = ''.join(
            random.choice(DICE) for _ in range(roll.dice_number))
        message["replace"]["id"] = roll.last_msgid
        message.send()
        roll.last_msgid = message['id']
        event = self.api.create_delayed_event(roll.increments,
                                              self.delayed_event, roll)
        self.api.add_timed_event(event)

Dice plugin: roll some dice  Usage of this plugin is not recommended.  Commands --------  .. glossary::      /roll [number of dice] [duration of the roll]         Roll one or several unicode dice  Configuration -------------  .. glossary::     :sorted:      refresh         **Default:** ``0.5``          Interval in seconds between each correction (the closest to 0 is the fastest)      default_duration         **Default:** ``5``          Total duration of the animation.