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
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)
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 "‽"
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)