changeset 513:8ee9113d307b

core, quick_frontend, primitivus, wixi, bridge: fixed delayed message timestamp: - new "extra" parameter in newMessage signal
author Goffi <goffi@goffi.org>
date Sat, 20 Oct 2012 17:23:56 +0200
parents 862c0d6ab974
children fe79a724e6fa
files frontends/src/primitivus/primitivus frontends/src/quick_frontend/quick_app.py frontends/src/quick_frontend/quick_chat.py frontends/src/wix/main_window.py src/bridge/DBus.py src/bridge/bridge_constructor/bridge_template.ini src/core/sat_main.py src/core/xmpp.py
diffstat 8 files changed, 39 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/frontends/src/primitivus/primitivus	Wed Oct 17 00:35:48 2012 +0200
+++ b/frontends/src/primitivus/primitivus	Sat Oct 20 17:23:56 2012 +0200
@@ -303,8 +303,8 @@
                 self.notify(_("Error while sending message"))
             editBar.set_edit_text('')
 
-    def newMessage(self, from_jid, to_jid, msg, _type, profile):
-        QuickApp.newMessage(self, from_jid, to_jid, msg, _type, profile)
+    def newMessage(self, from_jid, to_jid, msg, _type, extra, profile):
+        QuickApp.newMessage(self, from_jid, to_jid, msg, _type, extra, profile)
         
         if not from_jid in self.contact_list and from_jid.short != self.profiles[profile]['whoami'].short:
             #XXX: needed to show entities which haven't sent any
--- a/frontends/src/quick_frontend/quick_app.py	Wed Oct 17 00:35:48 2012 +0200
+++ b/frontends/src/quick_frontend/quick_app.py	Sat Oct 20 17:23:56 2012 +0200
@@ -235,7 +235,7 @@
         _groups = list(groups)
         self.contact_list.replace(entity, _groups, attributes)
 
-    def _newMessage(self, from_jid_s, msg, _type, to_jid_s, profile):
+    def _newMessage(self, from_jid_s, msg, _type, to_jid_s, extra, profile):
         """newMessage premanagement: a dirty hack to manage private messages
         if a private MUC message is detected, from_jid or to_jid is prefixed and resource is escaped"""
         if not self.check_profile(profile):
@@ -259,16 +259,17 @@
             if new_jid not in self.contact_list:
                 self.contact_list.add(new_jid)
 
-        self.newMessage(from_jid, to_jid, msg, _type, profile)
+        self.newMessage(from_jid, to_jid, msg, _type, extra, profile)
     
-    def newMessage(self, from_jid, to_jid, msg, _type, profile):
+    def newMessage(self, from_jid, to_jid, msg, _type, extra, profile):
         from_me = from_jid.short == self.profiles[profile]['whoami'].short
         win = to_jid if from_me else from_jid
         
         self.current_action_ids = set()
         self.current_action_ids_cb = {}
 
-        self.chat_wins[win.short].printMessage(from_jid, msg, profile)
+        timestamp = extra.get('archive')
+        self.chat_wins[win.short].printMessage(from_jid, msg, profile, float(timestamp) if timestamp else '')
 
     def sendMessage(self, to_jid, message, subject='', mess_type="auto", profile_key="@DEFAULT@"):
         if to_jid.startswith(const_PRIVATE_PREFIX):
--- a/frontends/src/quick_frontend/quick_chat.py	Wed Oct 17 00:35:48 2012 +0200
+++ b/frontends/src/quick_frontend/quick_chat.py	Sat Oct 20 17:23:56 2012 +0200
@@ -124,7 +124,7 @@
                 return unescaped.resource
         return jid.resource if self.type == "group" else (self.host.contact_list.getCache(jid,'nick') or self.host.contact_list.getCache(jid,'name') or jid.node)
     
-    def printMessage(self, from_jid, msg, profile, timestamp):
+    def printMessage(self, from_jid, msg, profile, timestamp = ''):
         """Print message in chat window. Must be implemented by child class"""
         jid=JID(from_jid)
         nick = self._get_nick(jid) 
--- a/frontends/src/wix/main_window.py	Wed Oct 17 00:35:48 2012 +0200
+++ b/frontends/src/wix/main_window.py	Sat Oct 20 17:23:56 2012 +0200
@@ -180,8 +180,8 @@
         wx.EVT_MENU(self, idFIND_GATEWAYS, self.onFindGateways)
 
 
-    def newMessage(self, from_jid, to_jid, msg, _type, profile):
-        QuickApp.newMessage(self, from_jid, to_jid, msg, _type, profile)
+    def newMessage(self, from_jid, to_jid, msg, _type, extra, profile):
+        QuickApp.newMessage(self, from_jid, to_jid, msg, _type, extra, profile)
 
     def showAlert(self, message):
         # TODO: place this in a separate class
--- a/src/bridge/DBus.py	Wed Oct 17 00:35:48 2012 +0200
+++ b/src/bridge/DBus.py	Sat Oct 20 17:23:56 2012 +0200
@@ -155,8 +155,8 @@
         pass
 
     @dbus.service.signal(const_INT_PREFIX+const_CORE_SUFFIX,
-                         signature='sssss')
-    def newMessage(self, from_jid, message, mess_type, to_jid, profile):
+                         signature='ssssa{ss}s')
+    def newMessage(self, from_jid, message, mess_type, to_jid, extra, profile):
         pass
 
     @dbus.service.signal(const_INT_PREFIX+const_CORE_SUFFIX,
@@ -533,8 +533,8 @@
     def newContact(self, contact_jid, attributes, groups, profile):
         self.dbus_bridge.newContact(contact_jid, attributes, groups, profile)
 
-    def newMessage(self, from_jid, message, mess_type, to_jid, profile):
-        self.dbus_bridge.newMessage(from_jid, message, mess_type, to_jid, profile)
+    def newMessage(self, from_jid, message, mess_type, to_jid, extra, profile):
+        self.dbus_bridge.newMessage(from_jid, message, mess_type, to_jid, extra, profile)
 
     def paramUpdate(self, name, value, category, profile):
         self.dbus_bridge.paramUpdate(name, value, category, profile)
--- a/src/bridge/bridge_constructor/bridge_template.ini	Wed Oct 17 00:35:48 2012 +0200
+++ b/src/bridge/bridge_constructor/bridge_template.ini	Sat Oct 20 17:23:56 2012 +0200
@@ -44,13 +44,14 @@
 [newMessage]
 type=signal
 category=core
-sig_in=sssss
+sig_in=ssssa{ss}s
 doc=A message has been received
 doc_param_0=from_jid: JID where the message is comming from
 doc_param_1=message: Message itself
 doc_param_2=mess_type: Type of the message (cf RFC 3921 #2.1.1)
 doc_param_3=to_jid: JID where the message must be sent
-doc_param_4=%(doc_profile)s
+doc_param_4=extra: extra message information
+doc_param_5=%(doc_profile)s
 
 [newAlert]
 type=signal
--- a/src/core/sat_main.py	Wed Oct 17 00:35:48 2012 +0200
+++ b/src/core/sat_main.py	Sat Oct 20 17:23:56 2012 +0200
@@ -501,7 +501,7 @@
         if mess_data["type"]!="groupchat":
             self.memory.addToHistory(current_jid, jid.JID(to), unicode(mess_data["message"]), unicode(mess_data["type"]), profile=profile) #we don't add groupchat message to history, as we get them back
                                                                                               #and they will be added then
-            self.bridge.newMessage(message['from'], unicode(mess_data["message"]), mess_type=mess_data["type"], to_jid=message['to'], profile=profile) #We send back the message, so all clients are aware of it
+            self.bridge.newMessage(message['from'], unicode(mess_data["message"]), mess_type=mess_data["type"], to_jid=message['to'], extra={}, 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@'):
--- a/src/core/xmpp.py	Wed Oct 17 00:35:48 2012 +0200
+++ b/src/core/xmpp.py	Sat Oct 20 17:23:56 2012 +0200
@@ -21,9 +21,10 @@
 
 from twisted.internet import task, defer
 from twisted.words.protocols.jabber import jid, xmlstream
-from wokkel import client, disco, xmppim, generic, compat
+from wokkel import client, disco, xmppim, generic, compat, delay
 from logging import debug, info, error
 from sat.core import exceptions
+from calendar import timegm
 
 
 class SatXMPPClient(client.XMPPClient):
@@ -104,17 +105,25 @@
         self.host = host
 
     def onMessage(self, message):
-      debug (_(u"got message from: %s"), message["from"])
-      if not self.host.trigger.point("MessageReceived",message, profile=self.parent.profile):
-          return
-      for e in message.elements():
-          if e.name == "body":
-              mess_type = message['type'] if message.hasAttribute('type') else 'normal'
-              mess_body = e.children[0] if e.children else ""
-              self.host.bridge.newMessage(message["from"], mess_body, mess_type, message['to'], profile=self.parent.profile)
-              if not u"delay" in [elem.name for elem in message.elements()]: #we don't save delayed messages in history
-                  self.host.memory.addToHistory(jid.JID(message["from"]), jid.JID(message["to"]), mess_body, mess_type, profile=self.parent.profile)
-              break
+        debug (_(u"got message from: %s"), message["from"])
+        if not self.host.trigger.point("MessageReceived",message, profile=self.parent.profile):
+            return
+        for e in message.elements():
+            if e.name == "body":
+                mess_type = message['type'] if message.hasAttribute('type') else 'normal'
+                mess_body = e.children[0] if e.children else ""
+                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)
+                break
     
 class SatRosterProtocol(xmppim.RosterClientProtocol):