- Agregado logging estructurado en todos los módulos - Implementados try-catches en todos los métodos críticos - Errores ahora se envían automáticamente por Telegram - Mejorado manejo de excepciones en requests HTTP - Agregado try-catch global en main.py para errores no manejados - Logging detallado en timenet_manager, telegram_bot, google_calendar y config_parser
88 lines
3.6 KiB
Python
88 lines
3.6 KiB
Python
from app import config_parser
|
|
import telegram
|
|
from importlib.metadata import version
|
|
import asyncio
|
|
import logging
|
|
|
|
config = config_parser.ConfigParser().loadConfig()
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class telegramBot:
|
|
bot = None
|
|
|
|
async def sendMessage(self, message):
|
|
try:
|
|
logger.info(f"Preparando envío de mensaje por Telegram (longitud: {len(str(message))} caracteres)")
|
|
|
|
ver = version("python-telegram-bot")
|
|
major = int(ver.split(".")[0])
|
|
logger.info(f"Versión de python-telegram-bot: {ver} (major: {major})")
|
|
|
|
token = config.get("telegram", {}).get("token")
|
|
chat_id = config.get("telegram", {}).get("chat_id")
|
|
|
|
if not token:
|
|
error_msg = "Token de Telegram no configurado"
|
|
logger.error(error_msg)
|
|
print(f"Error: {error_msg}")
|
|
return
|
|
|
|
if not chat_id:
|
|
error_msg = "Chat ID de Telegram no configurado"
|
|
logger.error(error_msg)
|
|
print(f"Error: {error_msg}")
|
|
return
|
|
|
|
# --------------------
|
|
# PTB v20+ (async)
|
|
# --------------------
|
|
if major >= 20:
|
|
logger.info("Usando API async de python-telegram-bot v20+")
|
|
try:
|
|
self.bot = telegram.Bot(token)
|
|
await self.bot.send_message(chat_id=chat_id, text=str(message))
|
|
logger.info("Mensaje enviado correctamente por Telegram (v20+)")
|
|
return
|
|
except telegram.error.TelegramError as e:
|
|
error_msg = f"Error de Telegram API al enviar mensaje (v20+): {str(e)}"
|
|
logger.error(error_msg, exc_info=True)
|
|
print(f"Error: {error_msg}")
|
|
raise
|
|
except Exception as e:
|
|
error_msg = f"Error inesperado al enviar mensaje por Telegram (v20+): {str(e)}"
|
|
logger.error(error_msg, exc_info=True)
|
|
print(f"Error: {error_msg}")
|
|
raise
|
|
|
|
# --------------------
|
|
# PTB v12/v13 (sync)
|
|
# --------------------
|
|
else:
|
|
logger.info("Usando API sync de python-telegram-bot v12/v13")
|
|
try:
|
|
self.bot = telegram.Bot(token)
|
|
|
|
# ejecuta el método sync en un hilo para no romper asyncio.run()
|
|
loop = asyncio.get_running_loop()
|
|
await loop.run_in_executor(
|
|
None,
|
|
lambda: self.bot.send_message(chat_id=chat_id, text=str(message))
|
|
)
|
|
logger.info("Mensaje enviado correctamente por Telegram (v12/v13)")
|
|
except telegram.error.TelegramError as e:
|
|
error_msg = f"Error de Telegram API al enviar mensaje (v12/v13): {str(e)}"
|
|
logger.error(error_msg, exc_info=True)
|
|
print(f"Error: {error_msg}")
|
|
raise
|
|
except Exception as e:
|
|
error_msg = f"Error inesperado al enviar mensaje por Telegram (v12/v13): {str(e)}"
|
|
logger.error(error_msg, exc_info=True)
|
|
print(f"Error: {error_msg}")
|
|
raise
|
|
except Exception as e:
|
|
error_msg = f"Error crítico al enviar mensaje por Telegram: {str(e)}"
|
|
logger.error(error_msg, exc_info=True)
|
|
print(f"Error crítico: {error_msg}")
|
|
# No re-lanzamos la excepción para evitar que rompa el flujo principal
|