diff --git a/src/core/sat_main.py b/src/core/sat_main.py index 88e76a60..401a4b73 100644 --- a/src/core/sat_main.py +++ b/src/core/sat_main.py @@ -490,6 +490,7 @@ class SAT(service.Service): "type": mess_type, "options": options, } + treatments = defer.Deferred() # XXX: plugin can add their treatments to this deferred if mess_data["type"] == "auto": # we try to guess the type @@ -512,38 +513,39 @@ class SAT(service.Service): mess_data["type"] == "chat" if mess_data["subject"] else "normal" if not no_trigger: - if not self.trigger.point("sendMessage", mess_data, profile): + if not self.trigger.point("sendMessage", mess_data, treatments, profile): return debug(_("Sending jabber message of type [%(type)s] to %(to)s...") % {"type": mess_data["type"], "to": to_jid.full()}) - message = domish.Element((None, 'message')) - message["to"] = mess_data["to"].full() - message["from"] = current_jid.full() - message["type"] = mess_data["type"] + mess_data['xml'] = domish.Element((None, 'message')) + mess_data['xml']["to"] = mess_data["to"].full() + mess_data['xml']["from"] = current_jid.full() + mess_data['xml']["type"] = mess_data["type"] if mess_data["subject"]: - message.addElement("subject", None, subject) + mess_data['xml'].addElement("subject", None, subject) # message without body are used to send chat states if mess_data["message"]: - message.addElement("body", None, mess_data["message"]) - if not no_trigger: - if not self.trigger.point("sendMessageXml", message, - mess_data, profile): - return - client.xmlstream.send(message) - if mess_data["type"] != "groupchat": - # we don't add groupchat message to history, as we get them back - # and they will be added then - self.memory.addToHistory(current_jid, mess_data['to'], - unicode(mess_data["message"]), - unicode(mess_data["type"]), - profile=profile) - # We send back the message, so all clients are aware of it - if mess_data["message"]: - self.bridge.newMessage(message['from'], - unicode(mess_data["message"]), - mess_type=mess_data["type"], - to_jid=message['to'], extra={}, - profile=profile) + mess_data['xml'].addElement("body", None, mess_data["message"]) + + def sendAndStore(mess_data): + client.xmlstream.send(mess_data['xml']) + if mess_data["type"] != "groupchat": + # we don't add groupchat message to history, as we get them back + # and they will be added then + self.memory.addToHistory(current_jid, mess_data['to'], + unicode(mess_data["message"]), + unicode(mess_data["type"]), + profile=profile) + # We send back the message, so all clients are aware of it + if mess_data["message"]: + self.bridge.newMessage(mess_data['xml']['from'], + unicode(mess_data["message"]), + mess_type=mess_data["type"], + to_jid=mess_data['xml']['to'], extra={}, + profile=profile) + + treatments.addCallback(sendAndStore) + treatments.callback(mess_data) def setPresence(self, to="", show="", priority=0, statuses={}, profile_key='@DEFAULT@'): """Send our presence information""" diff --git a/src/core/xmpp.py b/src/core/xmpp.py index eb6bdb67..098c9f67 100644 --- a/src/core/xmpp.py +++ b/src/core/xmpp.py @@ -112,7 +112,7 @@ class SatMessageProtocol(xmppim.MessageProtocol): def onMessage(self, message): debug(_(u"got message from: %s"), message["from"]) - post_treat = defer.Deferred() # XXX: plugin can add there treatments to this deferred + post_treat = defer.Deferred() # XXX: plugin can add their treatments to this deferred if not self.host.trigger.point("MessageReceived", message, post_treat, profile=self.parent.profile): return diff --git a/src/plugins/plugin_exp_parrot.py b/src/plugins/plugin_exp_parrot.py index 69fa5c4b..ced47637 100755 --- a/src/plugins/plugin_exp_parrot.py +++ b/src/plugins/plugin_exp_parrot.py @@ -48,7 +48,7 @@ class Exp_Parrot(object): host.trigger.add("MessageReceived", self.MessageReceivedTrigger, priority=100) #host.trigger.add("sendMessage", self.sendMessageTrigger, priority=100) - #def sendMessageTrigger(self, mess_data, profile): + #def sendMessageTrigger(self, mess_data, treatments, profile): # """ Deactivate other triggers if recipient is in parrot links """ # client = self.host.getClient(profile) # try: diff --git a/src/plugins/plugin_misc_text_commands.py b/src/plugins/plugin_misc_text_commands.py index 162d6944..af78b646 100755 --- a/src/plugins/plugin_misc_text_commands.py +++ b/src/plugins/plugin_misc_text_commands.py @@ -42,7 +42,7 @@ class TextCommands(object): self.host = host host.trigger.add("sendMessage", self.sendMessageTrigger) - def sendMessageTrigger(self, mess_data, profile): + def sendMessageTrigger(self, mess_data, treatments, profile): """ Check text commands in message, and react consequently """ msg = mess_data["message"] if msg: diff --git a/src/plugins/plugin_xep_0085.py b/src/plugins/plugin_xep_0085.py index 5f4d47bf..ebb09f39 100755 --- a/src/plugins/plugin_xep_0085.py +++ b/src/plugins/plugin_xep_0085.py @@ -97,7 +97,7 @@ class XEP_0085(object): # triggers from core host.trigger.add("MessageReceived", self.messageReceivedTrigger) - host.trigger.add("sendMessageXml", self.sendMessageXmlTrigger) + host.trigger.add("sendMessage", self.sendMessageTrigger) host.trigger.add("paramUpdateTrigger", self.paramUpdateTrigger) # TODO: handle profile disconnection (free memory in entity data) @@ -168,25 +168,30 @@ class XEP_0085(object): break return True - def sendMessageXmlTrigger(self, message, mess_data, profile): + def sendMessageTrigger(self, mess_data, treatments, profile): """ Eventually add the chat state to the message and initiate the state machine when sending an "active" state. """ - to_jid = JID(message.getAttribute("to")) - if not self.__checkActivation(to_jid, forceEntityData=True, profile=profile): - return True - try: - # message with a body always mean active state - domish.generateElementsNamed(message.elements(), name="body").next() - message.addElement('active', NS_CHAT_STATES) - # launch the chat state machine (init the timer) - self.__chatStateActive(to_jid, mess_data["type"], profile) - except StopIteration: - if "chat_state" in mess_data["options"]: - state = mess_data["options"]["chat_state"] - assert(state in CHAT_STATES) - message.addElement(state, NS_CHAT_STATES) + def treatment(mess_data): + message = mess_data['xml'] + to_jid = JID(message.getAttribute("to")) + if not self.__checkActivation(to_jid, forceEntityData=True, profile=profile): + return True + try: + # message with a body always mean active state + domish.generateElementsNamed(message.elements(), name="body").next() + message.addElement('active', NS_CHAT_STATES) + # launch the chat state machine (init the timer) + self.__chatStateActive(to_jid, mess_data["type"], profile) + except StopIteration: + if "chat_state" in mess_data["options"]: + state = mess_data["options"]["chat_state"] + assert(state in CHAT_STATES) + message.addElement(state, NS_CHAT_STATES) + return mess_data + + treatments.addCallback(treatment) return True def __checkActivation(self, to_jid, forceEntityData, profile):