diff --git a/src/core/xmpp.py b/src/core/xmpp.py index 686a3d7a..5e02ddca 100644 --- a/src/core/xmpp.py +++ b/src/core/xmpp.py @@ -26,7 +26,6 @@ from wokkel import client, disco, xmppim, generic, delay, iwokkel from sat.core.log import getLogger log = getLogger(__name__) from sat.core import exceptions -from calendar import timegm from zope.interface import implements from twisted.words.protocols.jabber.xmlstream import XMPPHandler @@ -160,17 +159,15 @@ class SatMessageProtocol(xmppim.MessageProtocol): return data def addToHistory(data): - # set message body to empty string by default, and later - # also forward message without body (chat state notification...) try: - _delay = delay.Delay.fromElement(filter(lambda elm: elm.name == 'delay', message.elements())[0]) - timestamp = timegm(_delay.stamp.utctimetuple()) - data['extra']['archive'] = str(timestamp) + timestamp = data['extra']['timestamp'] # timestamp added by XEP-0203 + except KeyError: + self.host.memory.addToHistory(jid.JID(data['from']), jid.JID(data['to']), data['body'], data['type'], data['extra'], profile=self.parent.profile) + else: if data['type'] != 'groupchat': # XXX: we don't save delayed messages in history for groupchats #TODO: add delayed messages to history if they aren't already in it + data['extra']['archive'] = timestamp # FIXME: this "archive" is actually never used self.host.memory.addToHistory(jid.JID(data['from']), jid.JID(data['to']), data['body'], data['type'], data['extra'], timestamp, profile=self.parent.profile) - except IndexError: - self.host.memory.addToHistory(jid.JID(data['from']), jid.JID(data['to']), data['body'], data['type'], data['extra'], profile=self.parent.profile) return data def treatmentsEb(failure): diff --git a/src/plugins/plugin_xep_0203.py b/src/plugins/plugin_xep_0203.py index 43181374..6d6493b3 100644 --- a/src/plugins/plugin_xep_0203.py +++ b/src/plugins/plugin_xep_0203.py @@ -22,6 +22,7 @@ from sat.core.i18n import _ from sat.core.log import getLogger log = getLogger(__name__) +from calendar import timegm from wokkel import disco, iwokkel, delay try: from twisted.words.protocols.xmlstream import XMPPHandler @@ -48,6 +49,8 @@ class XEP_0203(object): def __init__(self, host): log.info(_("Delayed Delivery plugin initialization")) self.host = host + host.trigger.add("MessageReceived", self.messageReceivedTrigger) + def getHandler(self, profile): return XEP_0203_handler(self, profile) @@ -68,6 +71,30 @@ class XEP_0203(object): parent.addChild(elt) return elt + def messagePostTreat(self, data, timestamp): + """Set the timestamp of a received message. + + @param data (dict): data send by MessageReceived trigger through post_treat deferred + @param timestamp (int): original timestamp of a delayed message + @return: dict + """ + data['extra']['timestamp'] = unicode(timestamp) + return data + + def messageReceivedTrigger(self, message, post_treat, profile): + """Process a delay element from incoming message. + + @param message (domish.Element): message element + @param post_treat (Deferred): deferred instance to add post treatments + """ + try: + delay_ = delay.Delay.fromElement([elm for elm in message.elements() if elm.name == 'delay'][0]) + except IndexError: + return True + else: + timestamp = timegm(delay_.stamp.utctimetuple()) + post_treat.addCallback(self.messagePostTreat, timestamp) + return True class XEP_0203_handler(XMPPHandler): implements(iwokkel.IDisco)