core: Deferred in onMessage.

onMessage now use a deferred which is passed to MessageReceived trigger through the post_treat parameter. This can be used by plugins to add deferred in the callback chain.
This commit is contained in:
Goffi 2013-10-31 17:18:04 +01:00
commit 59b4505dfd

View file

@ -106,28 +106,39 @@ class SatMessageProtocol(xmppim.MessageProtocol):
def onMessage(self, message):
debug(_(u"got message from: %s"), message["from"])
if not self.host.trigger.point("MessageReceived", message, profile=self.parent.profile):
post_treat = defer.Deferred() # XXX: plugin can add there treatments to this deferred
if not self.host.trigger.point("MessageReceived", message, post_treat, profile=self.parent.profile):
return
# set message body to empty string by default, and later
# also forward message without body (chat state notification...)
mess_body = ""
data = {"from": message['from'],
"to": message['to'],
"body": "",
"extra": {}}
for e in message.elements():
if e.name == "body":
mess_body = e.children[0] if e.children else ""
data['body'] = e.children[0] if e.children else ""
break
mess_type = message['type'] if message.hasAttribute('type') else 'normal'
try:
_delay = delay.Delay.fromElement(filter(lambda elm: elm.name == 'delay', message.elements())[0])
timestamp = timegm(_delay.stamp.utctimetuple())
extra = {"archive": str(timestamp)}
if mess_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
self.host.memory.addToHistory(jid.JID(message["from"]), jid.JID(message["to"]), mess_body, mess_type, timestamp, profile=self.parent.profile)
except IndexError:
extra = {}
self.host.memory.addToHistory(jid.JID(message["from"]), jid.JID(message["to"]), mess_body, mess_type, profile=self.parent.profile)
self.host.bridge.newMessage(message["from"], mess_body, mess_type, message['to'], extra, profile=self.parent.profile)
data['type'] = message['type'] if message.hasAttribute('type') else 'normal'
def after_treatments(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)
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
self.host.memory.addToHistory(jid.JID(data['from']), jid.JID(data['to']), data['body'], data['type'], timestamp, profile=self.parent.profile)
except IndexError:
self.host.memory.addToHistory(jid.JID(data['from']), jid.JID(data['to']), data['body'], data['type'], profile=self.parent.profile)
self.host.bridge.newMessage(data['from'], data['body'], data['type'], data['to'], data['extra'], profile=self.parent.profile)
post_treat.addCallback(after_treatments)
post_treat.callback(data)
class SatRosterProtocol(xmppim.RosterClientProtocol):