From a151d2495198dcbd73a6681d43fcf1698f3d5600 Mon Sep 17 00:00:00 2001 From: Lonami Exo Date: Mon, 22 Apr 2019 12:24:45 +0200 Subject: [PATCH] Fix StateCache accessing None to_id and add logging (#1160) --- telethon/client/telegrambaseclient.py | 3 ++- telethon/client/updates.py | 2 +- telethon/statecache.py | 17 +++++++++++------ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/telethon/client/telegrambaseclient.py b/telethon/client/telegrambaseclient.py index 90ffe813..b15d8b50 100644 --- a/telethon/client/telegrambaseclient.py +++ b/telethon/client/telegrambaseclient.py @@ -308,7 +308,8 @@ class TelegramBaseClient(abc.ABC): # Update state (for catching up after a disconnection) # TODO Get state from channels too - self._state_cache = StateCache(self.session.get_update_state(0)) + self._state_cache = StateCache( + self.session.get_update_state(0), self._log) # Some further state for subclasses self._event_builders = [] diff --git a/telethon/client/updates.py b/telethon/client/updates.py index 3e606ecc..10e97167 100644 --- a/telethon/client/updates.py +++ b/telethon/client/updates.py @@ -213,7 +213,7 @@ class UpdateMethods(UserMethods): self._state_cache.update(update) def _process_update(self, update, entities=None): - update._channel_id = StateCache.get_channel_id(update) + update._channel_id = self._state_cache.get_channel_id(update) update._pts_date = self._state_cache[update._channel_id] update._entities = entities or {} if self._updates_queue is None: diff --git a/telethon/statecache.py b/telethon/statecache.py index 406ee80b..27ba7d1e 100644 --- a/telethon/statecache.py +++ b/telethon/statecache.py @@ -7,10 +7,11 @@ class StateCache: """ In-memory update state cache, defaultdict-like behaviour. """ - def __init__(self, initial): + def __init__(self, initial, loggers): # We only care about the pts and the date. By using a tuple which # is lightweight and immutable we can easily copy them around to # each update in case they need to fetch missing entities. + self._logger = loggers[__name__] if initial: self._pts_date = initial.pts, initial.date else: @@ -82,12 +83,13 @@ class StateCache: channel_id = self.get_channel_id(update) if channel_id is None: - pass # TODO log, but shouldn't happen + self._logger.info( + 'Failed to retrieve channel_id from %s', update) else: self.__dict__[channel_id] = update.pts - @staticmethod def get_channel_id( + self, update, has_channel_id=( types.UpdateChannelTooLong, @@ -103,9 +105,12 @@ class StateCache: if isinstance(update, has_channel_id): return update.channel_id elif isinstance(update, has_message): - return update.message.to_id.channel_id - else: - return None + if update.message.to_id is None: + self._logger.info('Update has None to_id %s', update) + else: + return update.message.to_id.channel_id + + return None def __getitem__(self, item): """