mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2025-02-03 05:04:33 +03:00
Retry up to five times before giving up on a request
This commit is contained in:
parent
880f5636be
commit
48dead76ac
|
@ -282,7 +282,7 @@ class TelegramBareClient:
|
|||
|
||||
# region Invoking Telegram requests
|
||||
|
||||
def invoke(self, request, updates=None, call_receive=True):
|
||||
def invoke(self, request, call_receive=True, retries=5):
|
||||
"""Invokes (sends) a MTProtoRequest and returns (receives) its result.
|
||||
|
||||
If 'updates' is not None, all read update object will be put
|
||||
|
@ -298,6 +298,9 @@ class TelegramBareClient:
|
|||
if not self._sender:
|
||||
raise ValueError('You must be connected to invoke requests!')
|
||||
|
||||
if retries <= 0:
|
||||
raise ValueError('Number of retries reached 0.')
|
||||
|
||||
try:
|
||||
# Ensure that we start with no previous errors (i.e. resending)
|
||||
request.confirm_received.clear()
|
||||
|
@ -314,20 +317,24 @@ class TelegramBareClient:
|
|||
while not request.confirm_received.is_set():
|
||||
self._sender.receive(update_state=self.updates)
|
||||
|
||||
if request.rpc_error:
|
||||
raise request.rpc_error
|
||||
return request.result
|
||||
|
||||
except ConnectionResetError:
|
||||
self._logger.debug('Server disconnected us. Reconnecting and '
|
||||
'resending request...')
|
||||
self.reconnect()
|
||||
return self.invoke(request)
|
||||
|
||||
except FloodWaitError:
|
||||
self.disconnect()
|
||||
raise
|
||||
|
||||
if request.rpc_error:
|
||||
raise request.rpc_error
|
||||
if request.result is None:
|
||||
return self.invoke(
|
||||
request, call_receive=call_receive, retries=(retries - 1)
|
||||
)
|
||||
else:
|
||||
return request.result
|
||||
|
||||
# Let people use client(SomeRequest()) instead client.invoke(...)
|
||||
__call__ = invoke
|
||||
|
||||
|
|
|
@ -218,8 +218,9 @@ class TelegramClient(TelegramBareClient):
|
|||
|
||||
# region Telegram requests functions
|
||||
|
||||
def invoke(self, request, *args):
|
||||
def invoke(self, request, *args, **kwargs):
|
||||
"""Invokes (sends) a MTProtoRequest and returns (receives) its result.
|
||||
An optional 'retries' parameter can be set.
|
||||
|
||||
*args will be ignored.
|
||||
"""
|
||||
|
@ -233,9 +234,9 @@ class TelegramClient(TelegramBareClient):
|
|||
# will be the one which should be reading (but is invoking the
|
||||
# request) thus not being available to read it "in the background"
|
||||
# and it's needed to call receive.
|
||||
# TODO Retry if 'result' is None?
|
||||
return super().invoke(
|
||||
request, call_receive=self._recv_thread is None
|
||||
request, call_receive=self._recv_thread is None,
|
||||
retries=kwargs.get('retries', 5)
|
||||
)
|
||||
|
||||
except (PhoneMigrateError, NetworkMigrateError, UserMigrateError) as e:
|
||||
|
|
Loading…
Reference in New Issue
Block a user