Mercurial > libervia-backend
diff src/core/sat_main.py @ 489:f36c705a5310
core: sendMessage refactoring:
- "auto" message type which autodetect XMPP message type according to context
- added "sendMessage" trigger so plugins can hook messages
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 17 Aug 2012 03:11:03 +0200 |
parents | 23cbdf0a0777 |
children | e9634d2e7b38 |
line wrap: on
line diff
--- a/src/core/sat_main.py Fri Aug 17 03:08:37 2012 +0200 +++ b/src/core/sat_main.py Fri Aug 17 03:11:03 2012 +0200 @@ -26,6 +26,7 @@ from twisted.application import service from twisted.internet import defer +from twisted.internet.defer import inlineCallbacks, returnValue from twisted.words.protocols.jabber import jid, xmlstream from twisted.words.xish import domish @@ -43,7 +44,7 @@ import os.path from sat.core import xmpp -from sat.core.exceptions import ProfileUnknownError +from sat.core.exceptions import ProfileUnknownError, UnknownEntityError from sat.memory.memory import Memory from sat.tools.xml_tools import tupleList2dataForm from sat.tools.misc import TriggerManager @@ -445,24 +446,53 @@ ## jabber methods ## - def sendMessage(self, to, msg, subject=None, type='chat', profile_key='@DEFAULT@'): + def sendMessage(self, to, msg, subject=None, mess_type='auto', profile_key='@DEFAULT@'): #FIXME: check validity of recipient profile = self.memory.getProfileName(profile_key) assert(profile) - current_jid = self.profiles[profile].jid - debug(_("Sending jabber message to %s..."), to) + client = self.profiles[profile] + current_jid = client.jid + mess_data = { #we put data in a dict, so trigger methods can change them + "to": jid.JID(to), + "message": msg, + "subject": subject, + "type": mess_type + } + if not self.trigger.point("sendMessage", mess_data, profile): + return + if mess_data["type"] == "auto": + #XXX: if the type has not been changed by a trigger method, + # we try to guess it + if mess_data["subject"]: + mess_data["type"] = 'normal' + elif not mess_data["to"].resource: #if to JID has a resource, the type is not 'groupchat' + #we may have a groupchat message, we check if the we know this jid + try: + entity_type = self.memory.getEntityData(mess_data["to"], ['type'], profile)["type"] + #FIXME: should entity_type manage ressources ? + except (UnknownEntityError, KeyError): + entity_type = "contact" + + if entity_type == "chatroom": + mess_data["type"] = 'groupchat' + else: + mess_data["type"] = 'chat' + else: + mess_data["type"] == 'chat' + mess_data["type"] == "chat" if mess_data["subject"] else "normal" + debug(_("Sending jabber message of type [%(type)s] to %(to)s...") % {"type": mess_data["type"], "to": to}) message = domish.Element(('jabber:client','message')) - message["to"] = jid.JID(to).full() + message["to"] = mess_data["to"].full() message["from"] = current_jid.full() - message["type"] = type - if subject: + message["type"] = mess_data["type"] + if mess_data["subject"]: message.addElement("subject", "jabber:client", subject) message.addElement("body", "jabber:client", msg) - self.profiles[profile].xmlstream.send(message) - if type!="groupchat": + client.xmlstream.send(message) + if mess_data["type"]!="groupchat": self.memory.addToHistory(current_jid, jid.JID(to), unicode(msg), profile=profile) #we don't add groupchat message to history, as we get them back - #and they will we added then - self.bridge.newMessage(message['from'], unicode(msg), mess_type=type, to_jid=message['to'], profile=profile) #We send back the message, so all clients are aware of it + #and they will be added then + self.bridge.newMessage(message['from'], unicode(msg), mess_type=mess_data["type"], to_jid=message['to'], profile=profile) #We send back the message, so all clients are aware of it def setPresence(self, to="", show="", priority = 0, statuses={}, profile_key='@DEFAULT@'):