diff --git a/telethon/client/telegrambaseclient.py b/telethon/client/telegrambaseclient.py index 53d8a4e3..700054f4 100644 --- a/telethon/client/telegrambaseclient.py +++ b/telethon/client/telegrambaseclient.py @@ -1,5 +1,6 @@ import abc import asyncio +import collections import inspect import logging import platform @@ -258,6 +259,11 @@ class TelegramBaseClient(abc.ABC): self._events_pending_resolve = [] self._event_resolve_lock = asyncio.Lock() + # Keep track of how many event builders there are for + # each type {type: count}. If there's at least one then + # the event will be built, and the same event be reused. + self._event_builders_count = collections.defaultdict(int) + # Default parse mode self._parse_mode = markdown diff --git a/telethon/client/updates.py b/telethon/client/updates.py index 32e39eac..644e8d39 100644 --- a/telethon/client/updates.py +++ b/telethon/client/updates.py @@ -90,6 +90,7 @@ class UpdateMethods(UserMethods): event = events.Raw() self._events_pending_resolve.append(event) + self._event_builders_count[type(event)] += 1 self._event_builders.append((event, callback)) def remove_event_handler(self, callback, event=None): @@ -108,6 +109,11 @@ class UpdateMethods(UserMethods): i -= 1 ev, cb = self._event_builders[i] if cb == callback and (not event or isinstance(ev, event)): + type_ev = type(ev) + self._event_builders_count[type_ev] -= 1 + if not self._event_builders_count[type_ev]: + del self._event_builders_count[type_ev] + del self._event_builders[i] found += 1