]> kaliko git repositories - sid.git/blob - sid/echo.py
Switch to SPDX headers
[sid.git] / sid / echo.py
1 # -*- coding: utf-8 -*-
2 # SPDX-FileCopyrightText: 2007-2012 Thomas Perl <thp.io/about>
3 # SPDX-FileCopyrightText: 2014, 2020 kaliko <kaliko@azylum.org>
4 # SPDX-License-Identifier: GPL-3.0-or-later
5
6 from .plugin import Plugin, botcmd
7
8
9 class Echo(Plugin):
10     """Drops a message to be sent when someone gets online.
11     """
12
13     def __init__(self, bot):
14         Plugin.__init__(self, bot)
15         self.inbox = dict()
16         self.presence = dict()
17         # The groupchat_presence event is triggered whenever a
18         # presence stanza is received from any chat room, including
19         # any presences you send yourself. To limit event handling
20         # to a single room, use the events muc::room@server::presence,
21         # muc::room@server::got_online, or muc::room@server::got_offline.
22         bot.add_event_handler("muc::%s::presence" %
23                               self.bot.room, self.log_presence)
24
25     def log_presence(self, pres):
26         """Handler method registering MUC participants presence"""
27         self.log.debug('%s: %s', pres['muc']['nick'], pres['type'])
28         nick = pres['muc']['nick']
29         self.presence.update({nick: (pres['muc']['role'], pres['type'])})
30         self.log.debug(self.presence)
31         if pres['type'] == 'available':
32             while self.inbox.get(nick, []):
33                 self.send(self.bot.room,
34                           self.inbox.get(nick).pop(),
35                           mtype='groupchat')
36                 self.inbox.pop(nick)
37
38     @botcmd
39     def tell(self, message, args):
40         """Drops a message to be sent when someone gets online.
41
42         * ``!tell queue``       : messages in queue
43         * ``!tell <nick> <msg>``: append <msg> to <nick> in queue"""
44         if not len(args):
45             msg = 'Missing arguments:\n{}'.format(self.tell.__doc__)
46             self.reply(message, msg)
47             return
48         if len(args) == 1:
49             if args[0] == 'queue':
50                 msg = '\n'.join(['{0}:\n\t{1}'.format(k, '\n'.join(v))
51                                  for k, v in self.inbox.items()])
52                 self.reply(message, msg)
53                 return
54             if args[0] == 'purge':
55                 sender = message['from'].resource
56                 if self.presence[sender][0] == 'moderator':
57                     self.inbox = dict()
58                 return
59         if len(args) < 2:
60             msg = 'Please provide a message:\n{}'.format(self.tell.__doc__)
61             self.reply(message, msg)
62             return
63         self._handle_msg(message)
64
65     def _handle_msg(self, message):
66         """Format and drop message in the inbox"""
67         sender = message['from'].resource
68         recipient = message['body'].split()[1]
69         tell_msg = ' '.join(message['body'].split()[2:])
70         self.log.debug('%s: %s', recipient, tell_msg)
71         letter = '{0}, {1} wanted you to know: {2}'.format(recipient, sender, tell_msg)
72         if (self.presence.get(recipient) and
73                 self.presence[recipient][1] == 'available'):
74             return
75         if recipient in self.inbox.keys():
76             self.inbox[recipient].append(letter)
77         else:
78             self.inbox[recipient] = [letter]
79
80
81 # VIM MODLINE
82 # vim: ai ts=4 sw=4 sts=4 expandtab