X-Git-Url: https://git.kaliko.me/?p=sid.git;a=blobdiff_plain;f=sid%2Fsid.py;h=1f8cd07d32331b7135f895459bfa1c9a72382ca0;hp=7c3a5c7a6db9540b8fffb65dd3e4e240dbf759f1;hb=c42c7531be1c512846ab8795f331e676ab53f003;hpb=e5063f532aeb1876b012586481413723605d1fc5 diff --git a/sid/sid.py b/sid/sid.py index 7c3a5c7..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'] - 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: @@ -103,11 +110,17 @@ class MUCBot(sleekxmpp.ClientXMPP): if args: self.log.debug('arg: {0}'.format(args)) try: - reply = self.commands[cmd](msg, args) + self.commands[cmd](msg, args) except Exception as err: reply = ''.join(traceback.format_exc()) self.log.exception('An error occurred processing: {0}: {1}'.format(body, reply)) - self.send_message(mto=msg['from'].bare, mbody=reply, mtype='groupchat') + 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): """ @@ -179,4 +192,8 @@ class MUCBot(sleekxmpp.ClientXMPP): text = self.commands[args[0]].__doc__.strip() or 'undocumented' else: text = 'That command is not defined.' - return text + if message['type'] == 'groupchat': + to = message['from'].bare + else: + to = message['from'] + self.send_message(mto=to, mbody=text, mtype=message['type'])