JadeAssistant / main.py
Madras1's picture
Update main.py
0ebf510 verified
import os
import logging
import asyncio
import socket
from datetime import datetime
from telegram import Update
from telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler, MessageHandler, filters
from telegram.request import HTTPXRequest
# --- A GAMBIARRA SUPREMA DA BERTA (HARDCODED DNS) ---
# Se o DNS do Hugging Face não funciona, nós somos o DNS.
# Este é o IP oficial da API do Telegram.
original_getaddrinfo = socket.getaddrinfo
def fixed_ip_getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
# Se for o Telegram, retornamos o IP direto (149.154.167.220)
if host == 'api.telegram.org':
return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', ('149.154.167.220', port))]
# Para todo o resto (Google, DuckDuckGo), tentamos usar o sistema normal
try:
return original_getaddrinfo(host, port, family, type, proto, flags)
except socket.gaierror:
# Se falhar no DuckDuckGo, paciência, mas o bot liga.
return original_getaddrinfo(host, port, family, type, proto, flags)
socket.getaddrinfo = fixed_ip_getaddrinfo
# ----------------------------------------------------
# Carrega variáveis
try:
from dotenv import load_dotenv
load_dotenv()
except ImportError:
pass
# Imports seguros
try:
from core import TelegramJadeAgent
from tools import ReminderManager
except ImportError:
import sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from core import TelegramJadeAgent
from tools import ReminderManager
# Logging setup
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO
)
logger = logging.getLogger(__name__)
reminder_manager = ReminderManager()
agent = TelegramJadeAgent(reminder_manager=reminder_manager)
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await context.bot.send_message(chat_id=update.effective_chat.id, text="Oi! Eu sou a Jade. Estou viva graças à Berta!")
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
chat_id = update.effective_chat.id
user_text = update.message.text
try:
await context.bot.send_chat_action(chat_id=chat_id, action="typing")
response = await asyncio.to_thread(agent.chat, chat_id, user_text)
await context.bot.send_message(chat_id=chat_id, text=response)
except Exception as e:
logger.error(f"Erro ao processar mensagem: {e}")
await context.bot.send_message(chat_id=chat_id, text="Tive um erro interno, desculpe.")
async def send_reminder_job(context: ContextTypes.DEFAULT_TYPE):
job_data = context.job.data
chat_id = job_data["chat_id"]
reminder_message = job_data["message"]
reminder_id = job_data["id"]
current_reminders = reminder_manager.get_due_reminders()
if not any(r["id"] == reminder_id for r in current_reminders):
return
text = await asyncio.to_thread(agent.generate_reminder_message, chat_id, reminder_message)
await context.bot.send_message(chat_id=chat_id, text=text)
reminder_manager.mark_as_sent(reminder_id)
async def check_reminders_loop(context: ContextTypes.DEFAULT_TYPE):
reminder_manager._load_reminders()
pending = [r for r in reminder_manager.reminders if r["status"] == "pending"]
job_queue = context.job_queue
current_jobs = [j.name for j in job_queue.jobs()]
for r in pending:
job_name = f"reminder_{r['id']}"
if job_name not in current_jobs:
try:
run_date = datetime.strptime(r["time"], "%Y-%m-%d %H:%M:%S")
if run_date < datetime.now():
run_date = datetime.now()
job_queue.run_once(send_reminder_job, when=run_date, data=r, name=job_name)
except Exception as e:
logger.error(f"Failed to schedule {job_name}: {e}")
if __name__ == '__main__':
token = os.getenv("TELEGRAM_BOT_TOKEN")
if not token:
logger.error("Error: TELEGRAM_BOT_TOKEN not found.")
exit(1)
# Removemos configurações complexas de HTTPXRequest para usar o padrão (que agora usa nosso IP fixo)
application = ApplicationBuilder().token(token).build()
application.add_handler(CommandHandler('start', start))
application.add_handler(MessageHandler(filters.TEXT & (~filters.COMMAND), handle_message))
if application.job_queue:
application.job_queue.run_repeating(check_reminders_loop, interval=10, first=1)
print("Jade Telegram Bot is running...")
application.run_polling(drop_pending_updates=True)