parent
43d7b029f8
commit
d55ce5b996
4 changed files with 126 additions and 0 deletions
6
doc/source/plugins/dice.rst
Normal file
6
doc/source/plugins/dice.rst
Normal file
|
@ -0,0 +1,6 @@
|
|||
.. _dice-plugin:
|
||||
|
||||
Dice
|
||||
====
|
||||
|
||||
.. automodule:: dice
|
|
@ -266,6 +266,15 @@ Plugin index
|
|||
Change the title of the terminal according to the name
|
||||
of the current tab.
|
||||
|
||||
Marquee
|
||||
:ref:`Documentation <marquee-plugin>`
|
||||
|
||||
Reproduce the behavior of the ``<marquee/>`` html tag.
|
||||
|
||||
Dice
|
||||
:ref:`Documentation <dice-plugin>`
|
||||
|
||||
Roll one or several dice using message corrections.
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
@ -309,3 +318,5 @@ Plugin index
|
|||
reorder
|
||||
cyber
|
||||
csi
|
||||
dice
|
||||
marquee
|
||||
|
|
6
doc/source/plugins/marquee.rst
Normal file
6
doc/source/plugins/marquee.rst
Normal file
|
@ -0,0 +1,6 @@
|
|||
.. _marquee-plugin:
|
||||
|
||||
Marquee
|
||||
=======
|
||||
|
||||
.. automodule:: marquee
|
103
plugins/dice.py
Normal file
103
plugins/dice.py
Normal file
|
@ -0,0 +1,103 @@
|
|||
"""
|
||||
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 = {"roll": {"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(1, 1, [''], True)
|
||||
def command_dice(self, args):
|
||||
tab = self.api.current_tab()
|
||||
duration = self.config.get('default_duration')
|
||||
try:
|
||||
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)
|
Loading…
Reference in a new issue