diff --git a/telethon/helpers.py b/telethon/helpers.py index 985c625d..8a86745a 100644 --- a/telethon/helpers.py +++ b/telethon/helpers.py @@ -95,13 +95,16 @@ def strip_text(text, entities): return text -def retry_range(retries): +def retry_range(retries, reconnect=False): """ Generates an integer sequence starting from 1. If `retries` is not a zero or a positive integer value, the sequence will be infinite, otherwise it will end at `retries + 1`. """ + if retries == 0 and not reconnect: + yield 1 + attempt = 0 while attempt != retries: yield 1 + attempt diff --git a/telethon/network/mtprotosender.py b/telethon/network/mtprotosender.py index fee1f62b..b95304e7 100644 --- a/telethon/network/mtprotosender.py +++ b/telethon/network/mtprotosender.py @@ -358,36 +358,32 @@ class MTProtoSender: self._state.reset() retries = self._retries if self._auto_reconnect else 0 - if retries: - for attempt in retry_range(retries): - try: - await self._connect() - except (IOError, asyncio.TimeoutError) as e: - last_error = e - self._log.info('Failed reconnection attempt %d with %s', - attempt, e.__class__.__name__) - - await asyncio.sleep(self._delay) - except Exception as e: - last_error = e - self._log.exception('Unexpected exception reconnecting on ' - 'attempt %d', attempt) - - await asyncio.sleep(self._delay) - else: - self._send_queue.extend(self._pending_state.values()) - self._pending_state.clear() - - if self._auto_reconnect_callback: - asyncio.get_event_loop().create_task(self._auto_reconnect_callback()) - - break + + attempt = 0 + for attempt in retry_range(retries,reconnect=True): + try: + await self._connect() + except (IOError, asyncio.TimeoutError) as e: + last_error = e + self._log.info('Failed reconnection attempt %d with %s', + attempt, e.__class__.__name__) + await asyncio.sleep(self._delay) + except Exception as e: + last_error = e + self._log.exception('Unexpected exception reconnecting on ' + 'attempt %d', attempt) + await asyncio.sleep(self._delay) else: - self._log.error('Automatic reconnection failed %d time(s)', attempt) - await self._disconnect(error=last_error.with_traceback(None)) + self._send_queue.extend(self._pending_state.values()) + self._pending_state.clear() + if self._auto_reconnect_callback: + asyncio.get_event_loop().create_task(self._auto_reconnect_callback()) + + break else: - self._log.error('Automatic reconnection is False.') - await self._disconnect(error=last_error.with_traceback(None)) + self._log.error('Automatic reconnection failed %d time(s)', attempt) + await self._disconnect(error=last_error.with_traceback(None)) + def _start_reconnect(self, error): """Starts a reconnection in the background."""