diff src/memory/memory.py @ 742:03744d9ebc13

plugin XEP-0033: implementation of the addressing feature: - frontends pass the recipients in the extra parameter of sendMessage - backend checks if the target server supports the feature (this is not done yet by prosody plugin) - features and identities are cached per profile and server - messages are duplicated in history for now (TODO: redesign the database) - echos signals are also duplicated to the sender (FIXME)
author souliane <souliane@mailoo.org>
date Wed, 11 Dec 2013 17:16:53 +0100
parents 8f50a0079769
children 5aff0beddb28
line wrap: on
line diff
--- a/src/memory/memory.py	Fri Dec 13 05:35:24 2013 +0100
+++ b/src/memory/memory.py	Wed Dec 11 17:16:53 2013 +0100
@@ -756,49 +756,63 @@
         assert profile != "@NONE@"
         return self.storage.getHistory(jid.JID(from_jid), jid.JID(to_jid), limit, between, profile)
 
-    def addServerFeature(self, feature, profile):
+    def addServerFeature(self, feature, jid_, profile):
         """Add a feature discovered from server
         @param feature: string of the feature
-        @param profile: which profile is using this server ?"""
+        @param jid_: the jid of the target server
+        @param profile: which profile is asking this server ?"""
         if profile not in self.server_features:
-            self.server_features[profile] = []
-        self.server_features[profile].append(feature)
+            self.server_features[profile] = {}
+        features = self.server_features[profile].setdefault(jid_, [])
+        features.append(feature)
 
-    def addServerIdentity(self, category, type_, entity, profile):
+    def addServerIdentity(self, category, type_, entity, jid_, profile):
         """Add an identity discovered from server
         @param feature: string of the feature
-        @param profile: which profile is using this server ?"""
+        @param jid_: the jid of the target server
+        @param profile: which profile is asking this server ?"""
         if not profile in self.server_identities:
             self.server_identities[profile] = {}
-        if (category, type_) not in self.server_identities[profile]:
-            self.server_identities[profile][(category, type_)] = set()
-        self.server_identities[profile][(category, type_)].add(entity)
+        identities = self.server_identities[profile].setdefault(jid_, {})
+        if (category, type_) not in identities:
+            identities[(category, type_)] = set()
+        identities[(category, type_)].add(entity)
 
-    def getServerServiceEntities(self, category, type_, profile):
+    def getServerServiceEntities(self, category, type_, jid_=None, profile=None):
         """Return all available entities for a service"""
-        if profile in self.server_identities:
-            return self.server_identities[profile].get((category, type_), set())
+        if jid_ is None:
+            jid_ = self.host.getClientHostJid(profile)
+        if profile in self.server_identities and jid_ in self.server_identities[profile]:
+            return self.server_identities[profile][jid_].get((category, type_), set())
         else:
             return None
 
-    def getServerServiceEntity(self, category, type_, profile):
+    def getServerServiceEntity(self, category, type_, jid_=None, profile=None):
         """Helper method to get first available entity for a service"""
-        entities = self.getServerServiceEntities(category, type_, profile)
+        if jid_ is None:
+            jid_ = self.host.getClientHostJid(profile)
+        entities = self.getServerServiceEntities(category, type_, jid_, profile)
         if entities is None:
-            warning(_("Entities (%(category)s/%(type)s) not available, maybe they haven't been asked to server yet ?") % {"category": category,
-                                                                                                                          "type": type_})
+            warning(_("Entities (%(category)s/%(type)s) of %(server)s not available, maybe they haven't been asked yet?")
+                    % {"category": category, "type": type_, "server": jid_})
             return None
         else:
             return list(entities)[0] if entities else None
 
-    def hasServerFeature(self, feature, profile_key):
+    def hasServerFeature(self, feature, jid_=None, profile_key="@NONE@"):
         """Tell if the server of the profile has the required feature"""
         profile = self.getProfileName(profile_key)
         if not profile:
             error(_('Trying find server feature for a non-existant profile'))
-            return
+            return None
         assert profile in self.server_features
-        return feature in self.server_features[profile]
+        if jid_ is None:
+            jid_ = self.host.getClientHostJid(profile)
+        if jid_ in self.server_features[profile]:
+            return feature in self.server_features[profile][jid_]
+        else:
+            warning(_("Features of %s not available, maybe they haven't been asked yet?") % jid_)
+            return None
 
     def getLastResource(self, contact, profile_key):
         """Return the last resource used by a contact