Messaging
=========
Returning multiple responses
----------------------------
Often, with commands that take a long time to run, you may want to
be able to send some feedback to the user that the command is
progressing. Instead of using a single `return` statement you can
use `yield` statements for every line of output you wish to send to
the user.
In the following example, the output will be "Going to
sleep", followed by a 10 second wait period and "Waking up" in the end.
.. code-block:: python
from errbot import BotPlugin, botcmd
from time import sleep
class PluginExample(BotPlugin):
@botcmd
def longcompute(self, mess, args):
yield "Going to sleep"
sleep(10)
yield "Waking up"
Sending a message to a specific user or room
--------------------------------------------
Sometimes, you may wish to send a message to a specific user or a
groupchat, for example from pollers or on webhook events. You can do
this with :func:`~errbot.botplugin.BotPlugin.send`:
.. code-block:: python
self.send(
self.build_identifier("user@host.tld/resource"),
"Boo! Bet you weren't expecting me, were you?",
)
:func:`~errbot.botplugin.BotPlugin.send` requires a valid
:class:`~errbot.backends.base.Identifier` instance to send to.
:func:`~errbot.botplugin.BotPlugin.build_identifier`
can be used to build such an identifier.
The format(s) supported by `build_identifier` will differ depending on which backend you are using.
For example, on Slack it may support `#channel` and `@user`,
for XMPP it includes `user@host.tld/resource`, etc.
Templating
----------
It's possible to send `Markdown
`_ responses using `Jinja2
`_ templates.
To do this, first create a directory called *templates* in the
directory that also holds your plugin's *.plug* file.
Inside this directory, you can place Markdown templates (with a
*.md* extension) in place of the content you wish to show. For
example this *hello.md*:
.. code-block:: jinja
Hello, {{name}}!
.. note::
See the Jinja2 `Template Designer Documentation
`_ for more information on
the available template syntax.
Next, tell Errbot which template to use by specifying the `template`
parameter to :func:`~errbot.decorators.botcmd` (leaving off the
*.md* suffix).
Finally, instead of returning a string, return a dictionary where
the keys refer to the variables you're substituting inside the
template (`{{name}}` in the above template example):
.. code-block:: python
from errbot import BotPlugin, botcmd
class Hello(BotPlugin):
@botcmd(template="hello")
def hello(self, msg, args):
"""Say hello to someone"""
return {'name': args}
It's also possible to use templates when using `self.send()`, but in
this case you will have to do the template rendering step yourself,
like so:
.. code-block:: python
from errbot import BotPlugin, botcmd
from errbot.templating import tenv
class Hello(BotPlugin):
@botcmd(template="hello")
def hello(self, msg, args):
"""Say hello to someone"""
response = tenv().get_template('hello.md').render(name=args)
self.send(msg.frm, response)
Cards
-----
Errbot cards are a canned format for notifications. It is possible to use this format to map to some native format in
backends like Slack (Attachment).
Similar to a `self.send()` you can use :func:`~errbot.botplugin.BotPlugin.send_card` to send a card.
The following code demonstrate the various available fields.
.. code-block:: python
from errbot import BotPlugin, botcmd
class Travel(BotPlugin):
@botcmd
def hello_card(self, msg, args):
"""Say a card in the chatroom."""
self.send_card(title='Title + Body',
body='text body to put in the card',
thumbnail='https://raw.githubusercontent.com/errbotio/errbot/master/docs/_static/errbot.png',
image='https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png',
link='http://www.google.com',
fields=(('First Key','Value1'), ('Second Key','Value2')),
color='red',
in_reply_to=msg)
Trigger a callback with every message received
----------------------------------------------
It's possible to add a callback that will be called on every message
sent either directly to the bot, or to a chatroom that the bot is
in:
.. code-block:: python
from errbot import BotPlugin
class PluginExample(BotPlugin):
def callback_message(self, mess):
if mess.body.find('cookie') != -1:
self.send(
mess.frm,
"What what somebody said cookie!?",
)