# HG changeset patch # User Goffi # Date 1448986629 -3600 # Node ID 7226280e70da1c907fc1548b171a371d936b117c # Parent c47ba491a85a5b2bed03b55c6648c36573fee786 plugin XEP-0054: use full jid to manage the card/avatar if the bare jid correspond to a MUC room diff -r c47ba491a85a -r 7226280e70da src/plugins/plugin_xep_0054.py --- a/src/plugins/plugin_xep_0054.py Tue Dec 01 13:55:48 2015 +0100 +++ b/src/plugins/plugin_xep_0054.py Tue Dec 01 17:17:09 2015 +0100 @@ -67,6 +67,7 @@ "type": "XEP", "protocols": ["XEP-0054", "XEP-0153"], "dependencies": [], + "recommendations": ["XEP-0045"], "main": "XEP_0054", "handler": "yes", "description": _("""Implementation of vcard-temp""") @@ -108,6 +109,17 @@ return True + def isInRoom(self, entity_jid, profile): + """Tell if an full jid is a member of a room + + @param entity_jid(jid.JID): full jid of the entity + @return (bool): True if the bare jid of the entity is a room jid + """ + try: + return self.host.plugins['XEP-0045'].isRoom(entity_jid.userhostJID(), profile_key=profile) + except KeyError: + return False + def _fillCachedValues(self, profile): #FIXME: this is really suboptimal, need to be reworked # the current naive approach keeps a map between all jids of all profiles @@ -140,7 +152,12 @@ @param value(unicode): new value of the item @param profile(unicode): profile which received the update """ - assert not jid_.resource # VCard are retrieved with bare jid + if jid_.resource: + if not self.isInRoom(jid_, profile): + # VCard are retrieved with bare jid + # but MUC room is a special case + jid_ = jid.userhostJID() + self.host.memory.updateEntityData(jid_, name, value, profile_key=profile) if name in CACHED_DATA: jid_s = jid_.userhost() @@ -154,7 +171,11 @@ @param name: name of the value ('nick' or 'avatar') @param profile: %(doc_profile)s @return: wanted value or None""" - assert not entity_jid.resource # VCard are retrieved with bare jid + if entity_jid.resource: + if not self.isInRoom(entity_jid, profile): + # VCard are retrieved with bare jid + # but MUC room is a special case + entity_jid = jid.userhostJID() try: data = self.host.memory.getEntityData(entity_jid, [name], profile) except exceptions.UnknownEntityError: @@ -363,8 +384,9 @@ Check for avatar information, and get VCard if needed @param presend(domish.Element): stanza """ - # FIXME: doesn't manage MUC correctly - from_jid = jid.JID(presence['from']).userhostJID() + from_jid = jid.JID(presence['from']) + if from_jid.resource and not self.plugin_parent.isInRoom(from_jid, self.parent.profile): + from_jid = from_jid.userhostJID() #FIXME: wokkel's data_form should be used here try: x_elt = presence.elements(NS_VCARD_UPDATE, 'x').next()