← Voltar

main.py

import logging
import asyncio # Importar asyncio
import concurrent.futures # Importar concurrent.futures
import os # Importar os para os.cpu_count()
from telegram.ext import (
    Application,
    CommandHandler,
    CallbackQueryHandler,
    MessageHandler,
    filters,
)

# Configurações e logger
from config.settings import TOKEN
from config.logger import logger

# Handlers principais
from handlers.start_handler import start
from handlers.callback_handler import callback_router
from handlers.link_handler import handle_link
from handlers.commands import help_command, clear, ls, stats

# Job automático para limpeza da pasta temporária
from utils.cleaner import clean_temp_folders


def main():
    """Inicia o bot do Telegram."""
    logger.info("Iniciando o bot...")

    # Configura o ThreadPoolExecutor para asyncio.to_thread
    loop = asyncio.get_event_loop()
    # Define um número maior de workers para o ThreadPoolExecutor
    # Por exemplo, 20, ou um múltiplo da contagem de CPUs
    max_workers = max(20, os.cpu_count() * 2) # Garante pelo menos 20 workers ou o dobro de CPUs
    executor = concurrent.futures.ThreadPoolExecutor(max_workers=max_workers)
    loop.set_default_executor(executor)

    # Cria a aplicação do bot com timeout estendido (importante para vídeos grandes)
    app = (
        Application.builder()
        .token(TOKEN)
        .read_timeout(1000)   # tempo maior evita TimedOut
        .write_timeout(1000)
        .connect_timeout(120)
        .build()
    )

    # =====================
    #     REGISTRA HANDLERS
    # =====================
    
    # Comandos
    app.add_handler(CommandHandler("start", start))
    app.add_handler(CommandHandler("help", help_command))
    app.add_handler(CommandHandler("clear", clear))
    app.add_handler(CommandHandler("ls", ls))
    app.add_handler(CommandHandler("stats", stats))

    # Callback dos botões
    app.add_handler(CallbackQueryHandler(callback_router))

    # Handler para qualquer link enviado
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_link))

    # ====================
    #     JOB QUEUE
    # ====================
    # Limpa a pasta /tmp/ a cada 1 hora
    app.job_queue.run_repeating(
        clean_temp_folders,
        interval=3600,  # a cada 1 hora
        first=60        # primeira execução após 1 minuto
    )

    # Inicia o bot
    logger.info("Bot iniciado e aguardando mensagens.")
    app.run_polling(drop_pending_updates=True)


if __name__ == "__main__":
    main()