poezio/plugins/replace.py
mathieui d676c2ee7b Move the plugins documentation
(use automodule directive & docstrings)
2013-04-13 22:33:06 +02:00

124 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Replace some patterns in a message before sending it.
Installation
------------
You only have to load the plugin.
.. code-block:: none
/load replace
Usage
-----
Insert a pattern in the form
.. code-block:: none
%pattern%
in your message, and it will be replaced by the corresponding text.
The list of provided patterns is:
- **time**: Insert the current time
- **date**: Insert the current date
- **datetime**: Insert the current date and time
- **random_nick**: Insert a random nick from the current MUC
- **dice**: Insert a random number between 1 and 6
Add your own pattern
--------------------
You can easily edit this plugin to add your own patterns. For example if
dont want to search for an insult everytime youre angry, you can create a
curse pattern this way:
- In the init(self) method of the Plugin class, add something like
.. code-block:: python
self.patterns['curse'] = replace_curse
- then define a function (not a method of the Plugin class) at the bottom
of the file. For example:
.. code-block:: python
def replace_curse(message, tab):
return random.choice(['dumb shit', 'idiot', 'moron'])
and you can now use something like
.. code-block:: none
Shut up, %curse%!
in your everyday-conversations.
For more convenience, you can read your nice words from a file, do whatever
you want in that function, as long as it returns a string.
"""
from plugin import BasePlugin
import tabs
import datetime
import random
from sleekxmpp.xmlstream.stanzabase import JID
class Plugin(BasePlugin):
def init(self):
self.patterns = {}
self.api.add_event_handler('conversation_say', self.replace_pattern)
self.api.add_event_handler('muc_say', self.replace_pattern)
self.api.add_event_handler('private_say', self.replace_pattern)
self.patterns['time'] = replace_time
self.patterns['date'] = replace_date
self.patterns['datetime'] = replace_datetime
self.patterns['random_nick'] = replace_random_user
self.patterns['dice'] = replace_dice
def replace_pattern(self, message, tab):
"""
Look for a %*% pattern in the message and replace it by the result
of the corresponding function.
"""
body = message['body']
for pattern in self.patterns:
new = body
while True:
# we don't use a replace on all occurence, otherwise the
# result would be the same for all occurence of the pattern
# and that's not desirable in some of them (for example the
# ones that provide random results)
new = body.replace('%%%s%%' % pattern,
self.patterns[pattern](message, tab), 1)
if new == body:
break
body = new
message['body'] = body
def replace_time(message, tab):
return datetime.datetime.now().strftime("%X")
def replace_date(message, tab):
return datetime.datetime.now().strftime("%x")
def replace_datetime(message, tab):
return datetime.datetime.now().strftime("%c")
def replace_random_user(message, tab):
if isinstance(tab, tabs.MucTab):
return random.choice(tab.users).nick
elif isinstance(tab, tabs.PrivateTab):
return random.choice([JID(tab.name).resource, tab.own_nick])
else:
# that doesnt make any sense. By why use this pattern in a
# ConversationTab anyway?
return str(tab.name)
def replace_dice(message, tab):
return str(random.randrange(1, 7))