From b2b64426724bcbe6e58f7baab6434219fc8812ed Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sun, 8 Oct 2017 15:23:51 +0100 Subject: Add a cache for 0084 avatars. --- poezio/core/handlers.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/poezio/core/handlers.py b/poezio/core/handlers.py index e5d1f244..5ecb742a 100644 --- a/poezio/core/handlers.py +++ b/poezio/core/handlers.py @@ -365,19 +365,43 @@ class HandlerCore: try: metadata = msg['pubsub_event']['items']['item']['avatar_metadata']['items'] except Exception: + log.exception('Failed getting metadata from 0084:') return + cache_dir = path.join(CACHE_DIR, 'avatars', jid) for info in metadata: + avatar_hash = info['id'] + + # First check whether we have it in cache. + cached_path = path.join(cache_dir, avatar_hash) + try: + with open(cached_path, 'rb') as avatar_file: + contact.avatar = avatar_file.read() + log.debug('Using cached avatar') + return + except OSError: + pass + + # If we didn’t have any, query the data instead. if not info['url']: try: result = yield from self.core.xmpp['xep_0084'].retrieve_avatar(jid, - info['id'], + avatar_hash, timeout=60) contact.avatar = result['pubsub']['items']['item']['avatar_data']['value'] except Exception: log.exception('Failed retrieving 0084 data from %s:', jid) - return + continue log.debug('Received %s avatar: %s', jid, info['type']) + # Now we save the data on the file system to not have to request it again. + try: + makedirs(cache_dir) + with open(cached_path, 'wb') as avatar_file: + avatar_file.write(contact.avatar) + except OSError: + pass + return + @asyncio.coroutine def on_vcard_avatar(self, pres): jid = pres['from'].bare -- cgit v1.2.3