| | from pyrogram import Client, enums |
| | from asyncio import Lock, gather |
| | from inspect import signature |
| |
|
| | from .. import LOGGER |
| | from .config_manager import Config |
| |
|
| |
|
| | class TgClient: |
| | _lock = Lock() |
| | _hlock = Lock() |
| |
|
| | bot = None |
| | user = None |
| | helper_bots = {} |
| | helper_loads = {} |
| |
|
| | BNAME = "" |
| | ID = 0 |
| | IS_PREMIUM_USER = False |
| | MAX_SPLIT_SIZE = 2097152000 |
| |
|
| | @classmethod |
| | def wztgClient(cls, *args, **kwargs): |
| | kwargs["api_id"] = Config.TELEGRAM_API |
| | kwargs["api_hash"] = Config.TELEGRAM_HASH |
| | kwargs["proxy"] = Config.TG_PROXY |
| | kwargs["parse_mode"] = enums.ParseMode.HTML |
| | kwargs["in_memory"] = True |
| | for param, value in { |
| | "max_concurrent_transmissions": 100, |
| | "skip_updates": False, |
| | }.items(): |
| | if param in signature(Client.__init__).parameters: |
| | kwargs[param] = value |
| | return Client(*args, **kwargs) |
| |
|
| | @classmethod |
| | async def start_hclient(cls, no, b_token): |
| | try: |
| | hbot = await cls.wztgClient( |
| | f"WZ-HBot{no}", |
| | bot_token=b_token, |
| | no_updates=True, |
| | ).start() |
| | LOGGER.info(f"Helper Bot [@{hbot.me.username}] Started!") |
| | cls.helper_bots[no], cls.helper_loads[no] = hbot, 0 |
| | except Exception as e: |
| | LOGGER.error(f"Failed to start helper bot {no} from HELPER_TOKENS. {e}") |
| | cls.helper_bots.pop(no, None) |
| |
|
| | @classmethod |
| | async def start_helper_bots(cls): |
| | if not Config.HELPER_TOKENS: |
| | return |
| | LOGGER.info("Generating helper client from HELPER_TOKENS") |
| | async with cls._hlock: |
| | await gather( |
| | *( |
| | cls.start_hclient(no, b_token) |
| | for no, b_token in enumerate(Config.HELPER_TOKENS.split(), start=1) |
| | ) |
| | ) |
| |
|
| | @classmethod |
| | async def start_bot(cls): |
| | LOGGER.info("Generating client from BOT_TOKEN") |
| | cls.ID = Config.BOT_TOKEN.split(":", 1)[0] |
| | cls.bot = cls.wztgClient( |
| | f"WZ-Bot{cls.ID}", |
| | bot_token=Config.BOT_TOKEN, |
| | workdir="/usr/src/app", |
| | ) |
| | await cls.bot.start() |
| | cls.BNAME = cls.bot.me.username |
| | cls.ID = Config.BOT_TOKEN.split(":", 1)[0] |
| | LOGGER.info(f"WZ Bot : [@{cls.BNAME}] Started!") |
| |
|
| | @classmethod |
| | async def start_user(cls): |
| | if Config.USER_SESSION_STRING: |
| | LOGGER.info("Generating client from USER_SESSION_STRING") |
| | try: |
| | cls.user = cls.wztgClient( |
| | "WZ-User", |
| | session_string=Config.USER_SESSION_STRING, |
| | sleep_threshold=60, |
| | no_updates=True, |
| | ) |
| | await cls.user.start() |
| | cls.IS_PREMIUM_USER = cls.user.me.is_premium |
| | if cls.IS_PREMIUM_USER: |
| | cls.MAX_SPLIT_SIZE = 4194304000 |
| | uname = cls.user.me.username or cls.user.me.first_name |
| | LOGGER.info(f"WZ User : [{uname}] Started!") |
| | except Exception as e: |
| | LOGGER.error(f"Failed to start client from USER_SESSION_STRING. {e}") |
| | cls.IS_PREMIUM_USER = False |
| | cls.user = None |
| |
|
| | @classmethod |
| | async def stop(cls): |
| | async with cls._lock: |
| | if cls.bot: |
| | await cls.bot.stop() |
| | cls.bot = None |
| | if cls.user: |
| | await cls.user.stop() |
| | cls.user = None |
| | if cls.helper_bots: |
| | await gather(*[h_bot.stop() for h_bot in cls.helper_bots.values()]) |
| | cls.helper_bots = {} |
| | LOGGER.info("All Client(s) stopped") |
| |
|
| | @classmethod |
| | async def reload(cls): |
| | async with cls._lock: |
| | await cls.bot.restart() |
| | if cls.user: |
| | await cls.user.restart() |
| | if cls.helper_bots: |
| | await gather(*[h_bot.restart() for h_bot in cls.helper_bots.values()]) |
| | LOGGER.info("All Client(s) restarted") |
| |
|