X-Git-Url: http://git.kaliko.me/?p=sid.git;a=blobdiff_plain;f=sid%2Fsid.py;fp=sid%2Fsid.py;h=9453db6a66c4fa4614e02d470eee42a9efd2dc94;hp=d74eaf89a7250d2b06e5ac7a3183e5913e0d1987;hb=6bd74a49f0c0a599423d52cb0d59b0620b00118d;hpb=fc68fb05af319202cb18fba36dd8f95d77673cda diff --git a/sid/sid.py b/sid/sid.py index d74eaf8..9453db6 100644 --- a/sid/sid.py +++ b/sid/sid.py @@ -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 "‽"