]> kaliko git repositories - sid.git/commitdiff
Prototype of Echo plugin, yet to be renamed
authorkaliko <kaliko@azylum.org>
Sat, 15 Nov 2014 10:42:15 +0000 (11:42 +0100)
committerkaliko <kaliko@azylum.org>
Sat, 15 Nov 2014 10:42:15 +0000 (11:42 +0100)
sid/echo.py

index a9cc400ec730593941f670f98e1c14c108e8ffc9..aec0b9d9c954e65f7f6c4b3db1ef716b5e06f1b6 100644 (file)
@@ -21,62 +21,58 @@ class Echo(Plugin):
 
     def __init__(self, bot):
         Plugin.__init__(self, bot)
-        bot.add_event_handler('groupchat_message', self.muc_message)
+        self.online = set()
+        self.inbox = dict()
         # The groupchat_presence event is triggered whenever a
         # presence stanza is received from any chat room, including
         # any presences you send yourself. To limit event handling
         # to a single room, use the events muc::room@server::presence,
         # muc::room@server::got_online, or muc::room@server::got_offline.
-        #bot.add_event_handler("muc::%s::got_online" % self.bot.room, self.muc_online)
-
-    def muc_message(self, msg):
-        """
-        Process incoming message stanzas from any chat room. Be aware
-        that if you also have any handlers for the 'message' event,
-        message stanzas may be processed by both handlers, so check
-        the 'type' attribute when using a 'message' event handler.
-
-        Whenever the bot's nickname is mentioned, respond to
-        the message.
-
-        IMPORTANT: Always check that a message is not from yourself,
-                   otherwise you will create an infinite loop responding
-                   to your own messages.
-
-        This handler will reply to messages that mention
-        the bot's nickname.
-
-        Arguments:
-            msg -- The received message stanza. See the documentation
-                   for stanza objects and the Message stanza to see
-                   how it may be used.
-        """
-        if msg['mucnick'] != self.bot.nick and self.bot.nick in msg['body']:
-            self.bot.send_message(mto=msg['from'].bare,
-                              mbody='I heard that, %s.' % msg['mucnick'],
+        bot.add_event_handler("muc::%s::got_offline" % self.bot.room, self._went_offline)
+        bot.add_event_handler("muc::%s::got_online" %  self.bot.room, self._went_online)
+        bot.add_event_handler("muc::%s::presence" %    self.bot.room, self.log_presence)
+
+    def log_presence(self, pres):
+        self.log.debug('{0}: {1}'.format(pres['muc']['nick'], pres['type']))
+
+    def _went_online(self, pres):
+        nick = pres['muc']['nick']
+        self.online.add(nick)
+        while self.inbox.get(nick, []):
+            self.bot.send_message(mto=self.bot.room,
+                              mbody=self.inbox.get(nick).pop(),
                               mtype='groupchat')
+        self.inbox.pop(nick)
 
-    def muc_online(self, presence):
-        """
-        Process a presence stanza from a chat room. In this case,
-        presences from users that have just come online are
-        handled by sending a welcome message that includes
-        the user's nickname and role in the room.
-
-        Arguments:
-            presence -- The received presence stanza. See the
-                        documentation for the Presence stanza
-                        to see how else it may be used.
-        """
-        if presence['muc']['nick'] != self.bot.nick:
-            self.bot.send_message(mto=presence['from'].bare,
-                              mbody='Hello, %s %s' % (presence['muc']['role'],
-                                                      presence['muc']['nick']),
-                              mtype='groupchat')
+    def _went_offline(self, pres):
+        nick = pres['muc']['nick']
+        if nick in self.online:
+            self.online.remove(nick)
 
     @botcmd
     def tell(self, message, args):
-        pass
+        """drop a message to be delivred when someone gets online.
+        !tell queue        : messages in queue
+        !tell <nick> <msg> : append <msg> to <nick> in queue"""
+        if not len(args):
+            return 'Missing arguments:\n{}'.format(self.tell.__doc__)
+        if len(args) == 1 and args[0] == 'queue':
+            return '\n'.join(['{0}:\n\t{1}'.format(k, '\n'.join(v))
+                              for k, v in self.inbox.items()])
+        if len(args) < 2:
+            return 'Please provide a message:\n{}'.format(self.tell.__doc__)
+        sender = message['from'].resource
+        recipient = message['body'].split()[1]
+        tell_msg = ' '.join(message['body'].split()[2:])
+        self.log.debug('{0}: {1}'.format(recipient, tell_msg))
+        letter = '{0}, {1} told me to tell you: {2}'.format(recipient, sender, tell_msg)
+        if recipient in self.online:
+            return
+        if recipient in self.inbox.keys():
+           self.inbox[recipient].append(letter)
+        else:
+           self.inbox[recipient] = [letter]
+
 
 # VIM MODLINE
 # vim: ai ts=4 sw=4 sts=4 expandtab