core: sendMessage triggers now use a treatments deferred;

- treaments deferred can be used by plugins to change XML elements before sending them, in a similar way as for newMessage
    - sendMessageXml trigger became useless, so it as been removed in favor of the new deferred
This commit is contained in:
Goffi 2013-11-13 13:57:36 +01:00
commit 60f03a623e
5 changed files with 52 additions and 45 deletions

View file

@ -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"""

View file

@ -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

View file

@ -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:

View file

@ -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:

View file

@ -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):