comparison src/core/xmpp.py @ 2099:ad88808591ef

plugin XEP-0280: Message Carbons first draft
author Goffi <goffi@goffi.org>
date Sun, 18 Dec 2016 20:21:31 +0100
parents 0931b5a6213c
children 85f3e12e984d
comparison
equal deleted inserted replaced
2098:e0066920a661 2099:ad88808591ef
147 147
148 def __init__(self, host): 148 def __init__(self, host):
149 xmppim.MessageProtocol.__init__(self) 149 xmppim.MessageProtocol.__init__(self)
150 self.host = host 150 self.host = host
151 151
152 def onMessage(self, message_elt): 152 @staticmethod
153 # TODO: handle threads 153 def parseMessage(message_elt, client=None):
154 client = self.parent 154 """parse a message XML and return message_data
155 if not 'from' in message_elt.attributes: 155
156 message_elt['from'] = client.jid.host 156 @param message_elt(domish.Element): raw <message> xml
157 log.debug(_(u"got message from: {from_}").format(from_=message_elt['from'])) 157 @param client(SatXMPPClient, None): client to map message id to uid
158 post_treat = defer.Deferred() # XXX: plugin can add their treatments to this deferred 158 if None, mapping will not be done
159 159 @return(dict): message data
160 if not self.host.trigger.point("MessageReceived", client, message_elt, post_treat): 160 """
161 return
162
163 message = {} 161 message = {}
164 subject = {} 162 subject = {}
165 extra = {} 163 extra = {}
166 data = {"from": jid.JID(message_elt['from']), 164 data = {"from": jid.JID(message_elt['from']),
167 "to": jid.JID(message_elt['to']), 165 "to": jid.JID(message_elt['to']),
169 "message": message, 167 "message": message,
170 "subject": subject, 168 "subject": subject,
171 "type": message_elt.getAttribute('type', 'normal'), 169 "type": message_elt.getAttribute('type', 'normal'),
172 "extra": extra} 170 "extra": extra}
173 171
174 try: 172 if client is not None:
175 data['stanza_id'] = message_elt['id'] 173 try:
176 except KeyError: 174 data['stanza_id'] = message_elt['id']
177 pass 175 except KeyError:
178 else: 176 pass
179 client._mess_id_uid[(data['from'], data['stanza_id'])] = data['uid'] 177 else:
178 client._mess_id_uid[(data['from'], data['stanza_id'])] = data['uid']
180 179
181 # message 180 # message
182 for e in message_elt.elements(C.NS_CLIENT, 'body'): 181 for e in message_elt.elements(C.NS_CLIENT, 'body'):
183 message[e.getAttribute((C.NS_XML,'lang'),'')] = unicode(e) 182 message[e.getAttribute((C.NS_XML,'lang'),'')] = unicode(e)
184 183
195 parsed_delay = delay.Delay.fromElement(delay_elt) 194 parsed_delay = delay.Delay.fromElement(delay_elt)
196 data['timestamp'] = calendar.timegm(parsed_delay.stamp.utctimetuple()) 195 data['timestamp'] = calendar.timegm(parsed_delay.stamp.utctimetuple())
197 data['received_timestamp'] = unicode(time.time()) 196 data['received_timestamp'] = unicode(time.time())
198 if parsed_delay.sender: 197 if parsed_delay.sender:
199 data['delay_sender'] = parsed_delay.sender.full() 198 data['delay_sender'] = parsed_delay.sender.full()
200 199 return data
200
201 def onMessage(self, message_elt):
202 # TODO: handle threads
203 client = self.parent
204 if not 'from' in message_elt.attributes:
205 message_elt['from'] = client.jid.host
206 log.debug(_(u"got message from: {from_}").format(from_=message_elt['from']))
207 post_treat = defer.Deferred() # XXX: plugin can add their treatments to this deferred
208
209 if not self.host.trigger.point("MessageReceived", client, message_elt, post_treat):
210 return
211
212 data = self.parseMessage(message_elt, client)
201 213
202 post_treat.addCallback(self.skipEmptyMessage) 214 post_treat.addCallback(self.skipEmptyMessage)
203 post_treat.addCallback(self.addToHistory, client) 215 post_treat.addCallback(self.addToHistory, client)
204 post_treat.addErrback(self.treatmentsEb) 216 post_treat.addErrback(self.treatmentsEb)
205 post_treat.addCallback(self.bridgeSignal, client, data) 217 post_treat.addCallback(self.bridgeSignal, client, data)