diff src/core/xmpp.py @ 2099:ad88808591ef

plugin XEP-0280: Message Carbons first draft
author Goffi <goffi@goffi.org>
date Sun, 18 Dec 2016 20:21:31 +0100
parents 0931b5a6213c
children 85f3e12e984d
line wrap: on
line diff
--- a/src/core/xmpp.py	Sun Dec 18 16:28:51 2016 +0100
+++ b/src/core/xmpp.py	Sun Dec 18 20:21:31 2016 +0100
@@ -149,17 +149,15 @@
         xmppim.MessageProtocol.__init__(self)
         self.host = host
 
-    def onMessage(self, message_elt):
-        # TODO: handle threads
-        client = self.parent
-        if not 'from' in message_elt.attributes:
-            message_elt['from'] = client.jid.host
-        log.debug(_(u"got message from: {from_}").format(from_=message_elt['from']))
-        post_treat = defer.Deferred() # XXX: plugin can add their treatments to this deferred
+    @staticmethod
+    def parseMessage(message_elt, client=None):
+        """parse a message XML and return message_data
 
-        if not self.host.trigger.point("MessageReceived", client, message_elt, post_treat):
-            return
-
+        @param message_elt(domish.Element): raw <message> xml
+        @param client(SatXMPPClient, None): client to map message id to uid
+            if None, mapping will not be done
+        @return(dict): message data
+        """
         message = {}
         subject = {}
         extra = {}
@@ -171,12 +169,13 @@
                 "type": message_elt.getAttribute('type', 'normal'),
                 "extra": extra}
 
-        try:
-            data['stanza_id'] = message_elt['id']
-        except KeyError:
-            pass
-        else:
-            client._mess_id_uid[(data['from'], data['stanza_id'])] = data['uid']
+        if client is not None:
+            try:
+                data['stanza_id'] = message_elt['id']
+            except KeyError:
+                pass
+            else:
+                client._mess_id_uid[(data['from'], data['stanza_id'])] = data['uid']
 
         # message
         for e in message_elt.elements(C.NS_CLIENT, 'body'):
@@ -197,7 +196,20 @@
             data['received_timestamp'] = unicode(time.time())
             if parsed_delay.sender:
                 data['delay_sender'] = parsed_delay.sender.full()
+        return data
 
+    def onMessage(self, message_elt):
+        # TODO: handle threads
+        client = self.parent
+        if not 'from' in message_elt.attributes:
+            message_elt['from'] = client.jid.host
+        log.debug(_(u"got message from: {from_}").format(from_=message_elt['from']))
+        post_treat = defer.Deferred() # XXX: plugin can add their treatments to this deferred
+
+        if not self.host.trigger.point("MessageReceived", client, message_elt, post_treat):
+            return
+
+        data = self.parseMessage(message_elt, client)
 
         post_treat.addCallback(self.skipEmptyMessage)
         post_treat.addCallback(self.addToHistory, client)