|
import os |
|
import asyncio |
|
import random |
|
from argparse import ArgumentParser |
|
from pathlib import Path |
|
from itertools import cycle |
|
from pyrogram import Client |
|
from better_proxy import Proxy |
|
from bot.utils.logger import log |
|
from bot.utils.settings import config, logo |
|
from bot.core.bot import run_bot |
|
|
|
start_text = logo + """ |
|
Select an action: |
|
1. Create session |
|
2. Run bot |
|
""" |
|
|
|
def get_session_names() -> list[str]: |
|
session_path = Path('sessions') |
|
session_files = session_path.glob('*.session') |
|
session_names = sorted([file.stem for file in session_files]) |
|
return session_names |
|
|
|
async def register_sessions() -> None: |
|
session_name = input('\nEnter the session name (press Enter to exit): ') |
|
if not session_name: return None |
|
|
|
if not os.path.exists(path='sessions'): os.mkdir(path='sessions') |
|
|
|
session = Client( |
|
name=session_name, |
|
api_id=config.API_ID, |
|
api_hash=config.API_HASH, |
|
workdir="sessions/" |
|
) |
|
|
|
async with session: user_data = await session.get_me() |
|
log.success(f"Session added successfully: {user_data.username or user_data.id} | " |
|
f"{user_data.first_name or ''} {user_data.last_name or ''}") |
|
|
|
def get_proxies() -> list[Proxy]: |
|
if config.USE_PROXY_FROM_FILE: |
|
with open(file='proxies.txt', encoding='utf-8-sig') as file: |
|
proxies = sorted([Proxy.from_str(proxy=row.strip()).as_url for row in file if row.strip()]) |
|
else: |
|
proxies = [] |
|
|
|
return proxies |
|
|
|
async def get_tg_clients() -> list[Client]: |
|
session_names = get_session_names() |
|
|
|
if not session_names: |
|
raise FileNotFoundError("Not found session files") |
|
|
|
tg_clients = [Client( |
|
name=session_name, |
|
api_id=config.API_ID, |
|
api_hash=config.API_HASH, |
|
workdir='sessions/', |
|
plugins=dict(root='bot/plugins') |
|
) for session_name in session_names] |
|
|
|
return tg_clients |
|
|
|
async def run_bot_with_delay(tg_client, proxy, delay): |
|
if delay > 0: |
|
log.info(f"{tg_client.name} | Wait {delay} seconds before start") |
|
await asyncio.sleep(delay) |
|
await run_bot(tg_client=tg_client, proxy=proxy) |
|
|
|
async def run_clients(tg_clients: list[Client]): |
|
proxies = get_proxies() |
|
proxies_cycle = cycle(proxies) if proxies else cycle([None]) |
|
tasks = [] |
|
delay = 0 |
|
for index, tg_client in enumerate(tg_clients): |
|
if index > 0: |
|
delay = random.randint(*config.SLEEP_BETWEEN_START) |
|
proxy = next(proxies_cycle) |
|
task = asyncio.create_task(run_bot_with_delay(tg_client=tg_client, proxy=proxy, delay=delay)) |
|
tasks.append(task) |
|
await asyncio.gather(*tasks) |
|
|
|
async def start() -> None: |
|
if not config: |
|
log.warning(f"Please fix the above errors in the .env file") |
|
return |
|
parser = ArgumentParser() |
|
parser.add_argument('-a', '--action', type=int, choices=[1, 2], help='Action to perform (1 or 2)') |
|
log.info(f"Detected {len(get_session_names())} sessions | {len(get_proxies())} proxies") |
|
action = parser.parse_args().action |
|
|
|
if not action: |
|
print(start_text) |
|
while True: |
|
action = input('> ').strip() |
|
if action.isdigit() and action in ['1', '2']: |
|
action = int(action) |
|
break |
|
log.warning("Action must be a number (1 or 2)") |
|
|
|
if action == 1: |
|
await register_sessions() |
|
elif action == 2: |
|
tg_clients = await get_tg_clients() |
|
await run_clients(tg_clients=tg_clients) |