]> kaliko git repositories - sid.git/blobdiff - sid/sid.py
Now handles private msg in MUC
[sid.git] / sid / sid.py
index 1d3383c9b3c7f87d131f0939bf37ed44f1655b2d..1f8cd07d32331b7135f895459bfa1c9a72382ca0 100644 (file)
@@ -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:
@@ -110,6 +117,11 @@ class MUCBot(sleekxmpp.ClientXMPP):
             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'])