]> kaliko git repositories - sid.git/blobdiff - sid/sid.py
Keep track of MUC participant in the sid.MUCBot
[sid.git] / sid / sid.py
index d74eaf89a7250d2b06e5ac7a3183e5913e0d1987..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 "‽"