From 1f860eb1bbbc7c7a14906db73c71061ad8c3b73e Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 1 Oct 2020 11:45:34 +0300 Subject: [PATCH] Change raise_last to a client-wide switch --- telethon/client/telegrambaseclient.py | 9 +++++++++ telethon/client/users.py | 10 +++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/telethon/client/telegrambaseclient.py b/telethon/client/telegrambaseclient.py index ce80211b..444a4181 100644 --- a/telethon/client/telegrambaseclient.py +++ b/telethon/client/telegrambaseclient.py @@ -160,6 +160,12 @@ class TelegramBaseClient(abc.ABC): was for 21s, it would ``raise FloodWaitError`` instead. Values larger than a day (like ``float('inf')``) will be changed to a day. + raise_last_call_error (`bool`, optional): + When API calls fail in a way that causes Telethon to retry + automatically, should the RPC error of the last attempt be raised + instead of a generic ValueError. This is mostly useful for + detecting when Telegram has internal issues. + device_model (`str`, optional): "Device model" to be sent when creating the initial connection. Defaults to 'PC (n)bit' derived from ``platform.uname().machine``, or its direct value if unknown. @@ -216,6 +222,7 @@ class TelegramBaseClient(abc.ABC): auto_reconnect: bool = True, sequential_updates: bool = False, flood_sleep_threshold: int = 60, + raise_last_call_error: bool = False, device_model: str = None, system_version: str = None, app_version: str = None, @@ -306,6 +313,8 @@ class TelegramBaseClient(abc.ABC): ) ) + self._raise_last_call_error = raise_last_call_error + self._request_retries = request_retries self._connection_retries = connection_retries self._retry_delay = retry_delay or 0 diff --git a/telethon/client/users.py b/telethon/client/users.py index 0d9b357a..345fb339 100644 --- a/telethon/client/users.py +++ b/telethon/client/users.py @@ -26,10 +26,10 @@ def _fmt_flood(delay, request, *, early=False, td=datetime.timedelta): class UserMethods: - async def __call__(self: 'TelegramClient', request, ordered=False, raise_last=False): - return await self._call(self._sender, request, ordered=ordered, raise_last=raise_last) + async def __call__(self: 'TelegramClient', request, ordered=False): + return await self._call(self._sender, request, ordered=ordered) - async def _call(self: 'TelegramClient', sender, request, ordered=False, raise_last=False): + async def _call(self: 'TelegramClient', sender, request, ordered=False): requests = (request if utils.is_list_like(request) else (request,)) for r in requests: if not isinstance(r, TLRequest): @@ -52,7 +52,7 @@ class UserMethods: request_index = 0 last_error = None self._last_request = time.time() - + for attempt in retry_range(self._request_retries): try: future = sender.send(request, ordered=ordered) @@ -118,7 +118,7 @@ class UserMethods: raise await self._switch_dc(e.new_dc) - if raise_last and last_error is not None: + if self._raise_last_call_error and last_error is not None: raise last_error raise ValueError('Request was unsuccessful {} time(s)' .format(attempt))