Spaces:
Paused
Paused
| 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 | |