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()