diff sat/plugins/plugin_xep_0054.py @ 3279:8de63fe6b5c9

plugin XEP-0054: don't use cache anymore in `getAvatar`: caching is now handled by plugin identity.
author Goffi <goffi@goffi.org>
date Tue, 19 May 2020 18:34:06 +0200
parents cf07641b764d
children 9e1ba1e1179f
line wrap: on
line diff
--- a/sat/plugins/plugin_xep_0054.py	Tue May 19 18:34:05 2020 +0200
+++ b/sat/plugins/plugin_xep_0054.py	Tue May 19 18:34:06 2020 +0200
@@ -21,6 +21,7 @@
 from base64 import b64decode, b64encode
 from hashlib import sha1
 from pathlib import Path
+from typing import Optional
 from zope.interface import implementer
 from twisted.internet import threads, defer
 from twisted.words.protocols.jabber import jid, error
@@ -31,6 +32,7 @@
 from sat.core.i18n import _
 from sat.core.constants import Const as C
 from sat.core.log import getLogger
+from sat.core.xmpp import SatXMPPEntity
 from sat.memory import persistent
 from sat.tools import image
 
@@ -288,41 +290,33 @@
             log.debug(_("VCard found"))
             return await self.vCard2Dict(client, vcard_elt, entity_jid)
 
-    async def getAvatar(self, client, entity_jid):
-        """Get avatar full path or hash
+    async def getAvatar(
+            self,
+            client: SatXMPPEntity,
+            entity_jid: jid.JID
+        ) -> Optional[dict]:
+        """Get avatar data
 
-        if avatar is not in local cache, it will be requested to the server
-        @param entity(jid.JID): entity to get avatar from
-
+        @param entity: entity to get avatar from
+        @return: avatar metadata, or None if no avatar has been found
         """
         entity_jid = self._i.getIdentityJid(client, entity_jid)
         hashes_cache = client._xep_0054_avatar_hashes
+        vcard = await self.getCard(client, entity_jid)
+        if vcard is None:
+            return None
         try:
             avatar_hash = hashes_cache[entity_jid.full()]
         except KeyError:
-            log.debug(f"avatar for {entity_jid} is not in cache, we retrieve it")
-            vcard = await self.getCard(client, entity_jid)
-            if vcard is None:
-                return None
-            try:
-                avatar_hash = hashes_cache[entity_jid.full()]
-            except KeyError:
-                if 'avatar' in vcard:
-                    raise exceptions.InternalError(
-                        "No avatar hash while avatar is found in vcard")
-                return None
+            if 'avatar' in vcard:
+                raise exceptions.InternalError(
+                    "No avatar hash while avatar is found in vcard")
+            return None
 
         if not avatar_hash:
             return None
 
         avatar_cache = self.host.common_cache.getMetadata(avatar_hash)
-        if avatar_cache is None:
-            log.debug("avatar is no more in cache, we re-download it")
-            vcard = await self.getCard(client, entity_jid)
-            if vcard is None:
-                return None
-            avatar_cache = self.host.common_cache.getMetadata(avatar_hash)
-
         return self._i.avatarBuildMetadata(
                 avatar_cache['path'], avatar_cache['mime_type'], avatar_hash)