]> kaliko git repositories - sid.git/blobdiff - sid/sid.py
Bump version
[sid.git] / sid / sid.py
index 19ba57fdc2b2b38b2531fcdef62649b585e8656d..9453db6a66c4fa4614e02d470eee42a9efd2dc94 100644 (file)
@@ -62,6 +62,8 @@ class MUCBot(slixmpp.ClientXMPP):
         self.commands = dict()
         self.room = room
         self.nick = nick
+        #: Keep track of MUC presences: {'nick': presence}
+        self.muc_presences = {}
         self.__set_logger(log_level)
         self.__seen = dict()
         self.register_plugin('xep_0030')  # Service Discovery
@@ -80,6 +82,11 @@ class MUCBot(slixmpp.ClientXMPP):
         self.add_event_handler('message', self.message)
         self.add_event_handler('got_online', self._view)
 
+        # keep track of join/parts
+        self.add_event_handler(f'muc::{self.room}::got_offline', self._muc_got_offline)
+        self.add_event_handler(f'muc::{self.room}::got_online', self._muc_got_online)
+        self.add_event_handler(f'muc::{self.room}::presence', self._muc_got_presence)
+
         # Handles disconnection
         self.add_event_handler('disconnected', self.disconn)
 
@@ -96,6 +103,39 @@ class MUCBot(slixmpp.ClientXMPP):
         log.setLevel(log_level)
         log.debug('set logger, log level : %s', log_level)
 
+    def _muc_got_online(self, pres):
+        """Keep track of MUC participants"""
+        fjid = pres['muc']['jid']
+        nick = pres['muc']['nick']
+        role = pres['muc']['role']
+        affi = pres['muc']['affiliation']
+        user = fjid if fjid.full else nick
+        self.muc_presences.update({nick: pres})
+        log.debug('Participants: + %s:%s/%s (len:%s)',
+                   user, role, affi,len(self.muc_presences))
+
+    def _muc_got_offline(self, pres):
+        """Keep track of MUC participants"""
+        fjid = pres['muc']['jid']
+        user = fjid if fjid.full else pres['muc']['nick']
+        try:
+            self.muc_presences.pop(pres['muc']['nick'])
+        except KeyError:
+            log.error('KeyError removing participant: "%s"', user)
+        log.debug('Participants: - %s got offline (len:%s)',
+                  user, len(self.muc_presences))
+
+    def _muc_got_presence(self, pres):
+        """Keep track of MUC participants"""
+        nick = pres['muc']['nick']
+        fjid = pres['muc']['jid']
+        role = pres['muc']['role']
+        affi = pres['muc']['affiliation']
+        user = fjid if fjid.full else nick
+        log.debug('Participants: u %s:%s/%s (len:%s)',
+                   user, role, affi,len(self.muc_presences))
+        self.muc_presences.update({nick: pres})
+
     def disconn(self, event):
         """disconnected handler"""
         msg = ": %s" % event if event else "‽"
@@ -176,6 +216,15 @@ class MUCBot(slixmpp.ClientXMPP):
                 log.debug('Registered command: %s', name)
                 self.commands[name] = value
 
+    def unregister_bot_plugin(self, plugin):
+        for name, value in inspect.getmembers(plugin):
+            if inspect.ismethod(value) and \
+               getattr(value, '_bot_command', False):
+                name = getattr(value, '_bot_command_name')
+                log.debug('Unegistered command: %s', name)
+                self.commands[name] = value
+        self.plugins.remove(plugin)
+
     def foreach_plugin(self, method, *args, **kwds):
         for plugin in self.plugins:
             log.debug('calling %s for %s', method, plugin)