X-Git-Url: https://git.kaliko.me/?p=sid.git;a=blobdiff_plain;f=sid%2Fsid.py;h=1f8cd07d32331b7135f895459bfa1c9a72382ca0;hp=53fd5696976f4a60d2d01ec7ec75dfaeb4066aaf;hb=c42c7531be1c512846ab8795f331e676ab53f003;hpb=40a4cb2e7caa70e009736ead303ce016ddac3a71 diff --git a/sid/sid.py b/sid/sid.py index 53fd569..1f8cd07 100644 --- a/sid/sid.py +++ b/sid/sid.py @@ -55,6 +55,7 @@ class MUCBot(sleekxmpp.ClientXMPP): self.room = room self.nick = nick self.__set_logger(log_file, log_level) + self.__seen = dict() self.register_plugin('xep_0030') # Service Discovery self.register_plugin('xep_0045') # Multi-User Chat self.register_plugin('xep_0199') # self Ping @@ -64,10 +65,11 @@ class MUCBot(sleekxmpp.ClientXMPP): # and the XML streams are ready for use. We want to # listen for this event so that we we can initialize # our roster. - self.add_event_handler("session_start", self.start) + self.add_event_handler('session_start', self.start) # Handles MUC message and dispatch - self.add_event_handler("groupchat_message", self.muc_message) + self.add_event_handler('message', self.message) + self.add_event_handler('got_online', self._view) # Discover bot internal command (ie. help) for name, value in inspect.getmembers(self): @@ -87,14 +89,19 @@ class MUCBot(sleekxmpp.ClientXMPP): self.log.setLevel(log_level) self.log.debug('set logger, log level : %s' % log_level) - def muc_message(self, msg): - # ignore message from self - body = msg['body'].strip() - mucfrom = msg['mucnic'] + def message(self, msg): + if msg['type'] not in ('groupchat', 'chat'): + self.log.warning('Unhandled message') + return if msg['mucnick'] == self.nick: return + body = msg['body'].strip() if not body.startswith(MUCBot.prefix): return + if msg['from'] not in self.__seen: + self.log.warning('Will not handle message ' + 'from unseen jid: %s' % msg['from']) + #return args = body[1:].split() cmd = args.pop(0) if cmd not in self.commands: @@ -107,9 +114,14 @@ class MUCBot(sleekxmpp.ClientXMPP): except Exception as err: reply = ''.join(traceback.format_exc()) self.log.exception('An error occurred processing: {0}: {1}'.format(body, reply)) - if self.log.level < 20 and reply: + if self.log.level < 10 and reply: self.send_message(mto=msg['from'].bare, mbody=reply, mtype='groupchat') + def _view(self, pres): + nick = pres['from'] + status = (pres['type'], pres['status']) + self.__seen.update({nick: status}) + def start(self, event): """ Process the session_start event. @@ -180,4 +192,8 @@ class MUCBot(sleekxmpp.ClientXMPP): text = self.commands[args[0]].__doc__.strip() or 'undocumented' else: text = 'That command is not defined.' - self.send_message(mto=message['from'].bare, mbody=text, mtype='groupchat') + if message['type'] == 'groupchat': + to = message['from'].bare + else: + to = message['from'] + self.send_message(mto=to, mbody=text, mtype=message['type'])