From 341fb38136418c9ba616b70103618be390d9d1cb Mon Sep 17 00:00:00 2001 From: Lonami Exo Date: Sat, 3 Feb 2018 15:39:37 +0100 Subject: [PATCH] Invoke getState after the server kicks us idling for updates For some reason, the server seems to kick us after 1024 items from the network are received. Tested with the following code, 1022 updates were received, after BadServerSalt, NewSessionCreated and MsgsAck: client = TelegramClient(..., spawn_read_thread=False) client.connect(_sync_updates=False) sender = client._sender client = None while True: try: sender.receive(None) except TimeoutError: pass except ConnectionResetError: sender.connect() If one were to run this code after being kicked no further items will be retrieved and it will always timeout. Invoking a ping has no effect either. Invoking some "high level" request like getState seems to do the trick. --- telethon/telegram_bare_client.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/telethon/telegram_bare_client.py b/telethon/telegram_bare_client.py index bff6c1d3..5984bb2e 100644 --- a/telethon/telegram_bare_client.py +++ b/telethon/telegram_bare_client.py @@ -664,6 +664,14 @@ class TelegramBareClient: with self._reconnect_lock: while self._user_connected and not self._reconnect(): sleep(0.1) # Retry forever, this is instant messaging + + if self.is_connected(): + # Telegram seems to kick us every 1024 items received + # from the network not considering things like bad salt. + # We must execute some *high level* request (that's not + # a ping) if we want to receive updates again. + # TODO Test if getDifference works too (better alternative) + self._sender.send(GetStateRequest()) except: self._idling.clear() raise