Spaces:
Running
Running
import asyncio | |
from typing import Callable, Awaitable, Any | |
from loguru import logger | |
import pyrogram.errors | |
# retries an async awaitable as long as it raises FloodWait, and waits for err.x time | |
def retry_on_flood(function: Callable[[Any], Awaitable]): | |
async def wrapper(*args, **kwargs): | |
while True: | |
try: | |
return await function(*args, **kwargs) | |
except pyrogram.errors.FloodWait as err: | |
logger.warning(f'FloodWait, waiting {err.x} seconds: {err.MESSAGE}') | |
await asyncio.sleep(err.x) | |
continue | |
except pyrogram.errors.RPCError as err: | |
if err.MESSAGE == 'FloodWait': | |
logger.warning(f'FloodWait, waiting {err.x} seconds: {err.MESSAGE}') | |
await asyncio.sleep(err.x) | |
continue | |
else: | |
raise err | |
except Exception as err: | |
raise err | |
return wrapper | |