refactor: Align codebase configuration with user's .env file

This commit refactors the application's configuration handling to perfectly match the structure and variable names provided by the user in their `.env` file. This resolves multiple critical discrepancies that would have prevented the bot from functioning correctly.

-   **Update `config.py`:** The file `talia_bot/config.py` has been completely rewritten to load environment variables using the names specified by the user (e.g., `TELEGRAM_OWNER_CHAT_ID`, `GOOGLE_CALENDAR_ID`, `VIKUNJA_BASE_URL`).

-   **Update Printer Logic:** The `talia_bot/modules/printer.py` module has been updated to use the new `PRINTER_EMAIL` variable and the specific IMAP credentials (`IMAP_USER`, `IMAP_PASSWORD`), rather than reusing SMTP credentials.

-   **Update `.env.example`:** The `.env.example` template file has been rewritten to serve as an accurate and well-documented guide that matches the user's `.env` structure.

This change ensures that the bot is now fully synchronized with the user's deployment environment, resolving previous inconsistencies and improving the overall robustness of the configuration.
This commit is contained in:
google-labs-jules[bot]
2025-12-21 15:18:55 +00:00
parent 2729ee41b8
commit 85d16538f2
3 changed files with 99 additions and 49 deletions

View File

@@ -1,18 +1,69 @@
# --- TELEGRAM & SECURITY ---
# ==================================================
# Telegram Configuration
# ==================================================
# Get your bot token from @BotFather on Telegram.
TELEGRAM_BOT_TOKEN=
ADMIN_ID=
# Your personal Telegram user ID. The bot will send you admin notifications.
TELEGRAM_OWNER_CHAT_ID=
# --- AI CORE ---
# ==================================================
# Google Services
# ==================================================
# The path to your Google Cloud service account credentials file.
GOOGLE_SERVICE_ACCOUNT_FILE=google_key.json
# The ID of the Google Calendar you want the bot to manage.
GOOGLE_CALENDAR_ID=
# ==================================================
# Webhooks (n8n)
# ==================================================
# The URL for your production n8n webhook.
N8N_WEBHOOK_URL=
# The URL for your test n8n webhook.
N8N_WEBHOOK_TEST_URL=
# ==================================================
# AI Core
# ==================================================
# Your API key from OpenAI.
OPENAI_API_KEY=
# The specific OpenAI model to use (e.g., gpt-4o-mini, gpt-4-turbo).
OPENAI_MODEL=gpt-4o-mini
# The time for the AI to send a daily summary (HH:MM format).
AI_DAILY_SUMMARY_TIME=08:00
# The timezone for scheduling and date/time operations (e.g., America/Mexico_City, America/Bogota).
TIMEZONE=America/Monterrey
# --- INTEGRATIONS ---
VIKUNJA_API_URL=https://tuservidor.com/api/v1
# ==================================================
# Scheduling
# ==================================================
# Your Calendly link for appointment scheduling.
CALENDLY_LINK=
# ==================================================
# Vikunja (Task Management)
# ==================================================
# The base URL for your Vikunja instance's API.
VIKUNJA_BASE_URL=
# Your API token for Vikunja.
VIKUNJA_TOKEN=
GOOGLE_CREDENTIALS_PATH=./data/credentials.json
# --- PRINT SERVICE ---
SMTP_SERVER=smtp.hostinger.com
SMTP_PORT=465
SMTP_USER=print.service@vanityexperience.mx
SMTP_PASS=
IMAP_SERVER=imap.hostinger.com
# ==================================================
# Email Configuration (SMTP / IMAP)
# ==================================================
# SMTP server for sending emails.
SMTP_SERVER=
SMTP_PORT=
SMTP_USER=
SMTP_PASSWORD=
# IMAP server for reading emails.
IMAP_SERVER=
IMAP_USER=
IMAP_PASSWORD=
# ==================================================
# Printer (Epson Connect)
# ==================================================
# The dedicated email address for your printer.
PRINTER_EMAIL=

View File

@@ -1,55 +1,51 @@
# talia_bot/config.py
# Este archivo se encarga de cargar todas las variables de entorno y configuraciones del bot.
# Las variables de entorno son valores que se guardan fuera del código por seguridad (como tokens y llaves API).
# This file loads all environment variables and bot configurations.
# Environment variables are stored securely outside the code (e.g., in a .env file).
import os
from dotenv import load_dotenv
from pathlib import Path
# Cargar variables de entorno desde el archivo .env en la raíz del proyecto
# Load environment variables from the .env file in the project root
env_path = Path(__file__).parent.parent / '.env'
load_dotenv(dotenv_path=env_path)
# Token del bot de Telegram (obtenido de @BotFather)
# --- Telegram Configuration ---
TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
ADMIN_ID = os.getenv("TELEGRAM_OWNER_CHAT_ID") # Renamed for consistency in the code
# ID de chat del dueño del bot (para recibir notificaciones importantes)
ADMIN_ID = os.getenv("ADMIN_ID")
# Ruta al archivo de credenciales de la cuenta de servicio de Google
# --- Google Services ---
GOOGLE_SERVICE_ACCOUNT_FILE = os.getenv("GOOGLE_SERVICE_ACCOUNT_FILE")
if GOOGLE_SERVICE_ACCOUNT_FILE and not os.path.isabs(GOOGLE_SERVICE_ACCOUNT_FILE):
GOOGLE_SERVICE_ACCOUNT_FILE = str(Path(__file__).parent.parent / GOOGLE_SERVICE_ACCOUNT_FILE)
CALENDAR_ID = os.getenv("GOOGLE_CALENDAR_ID")
# ID del calendario de Google que usará el bot
CALENDAR_ID = os.getenv("CALENDAR_ID")
# URL del webhook de n8n para enviar datos a otros servicios
# --- Webhooks (n8n) ---
N8N_WEBHOOK_URL = os.getenv("N8N_WEBHOOK_URL")
N8N_TEST_WEBHOOK_URL = os.getenv("N8N_TEST_WEBHOOK_URL")
N8N_TEST_WEBHOOK_URL = os.getenv("N8N_WEBHOOK_TEST_URL")
# Configuración de Vikunja
VIKUNJA_API_URL = os.getenv("VIKUNJA_API_URL", "https://tasks.soul23.cloud/api/v1")
VIKUNJA_API_TOKEN = os.getenv("VIKUNJA_API_TOKEN")
# Llave de la API de OpenAI para usar modelos de lenguaje (como GPT)
# --- AI Core ---
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
OPENAI_MODEL = os.getenv("OPENAI_MODEL", "gpt-4o-mini")
DAILY_SUMMARY_TIME = os.getenv("AI_DAILY_SUMMARY_TIME", "08:00")
TIMEZONE = os.getenv("TIMEZONE", "America/Monterrey")
# Modelo de OpenAI a utilizar (ej. gpt-3.5-turbo, gpt-4)
OPENAI_MODEL = os.getenv("OPENAI_MODEL", "gpt-3.5-turbo")
# --- Scheduling ---
CALENDLY_LINK = os.getenv("CALENDLY_LINK")
# Hora del resumen diario (formato HH:MM)
DAILY_SUMMARY_TIME = os.getenv("DAILY_SUMMARY_TIME", "07:00")
# --- Vikunja (Task Management) ---
VIKUNJA_API_URL = os.getenv("VIKUNJA_BASE_URL")
VIKUNJA_API_TOKEN = os.getenv("VIKUNJA_TOKEN")
# Enlace de Calendly para agendar citas
CALENDLY_LINK = os.getenv("CALENDLY_LINK", "https://calendly.com/user/appointment-link")
# Zona horaria por defecto para el manejo de fechas y horas
TIMEZONE = os.getenv("TIMEZONE", "America/Mexico_City")
# --- PRINT SERVICE ---
# --- Email Configuration (SMTP / IMAP) ---
SMTP_SERVER = os.getenv("SMTP_SERVER")
SMTP_PORT = os.getenv("SMTP_PORT")
SMTP_USER = os.getenv("SMTP_USER")
SMTP_PASS = os.getenv("SMTP_PASS")
SMTP_PASS = os.getenv("SMTP_PASSWORD")
IMAP_SERVER = os.getenv("IMAP_SERVER")
IMAP_USER = os.getenv("IMAP_USER")
IMAP_PASS = os.getenv("IMAP_PASSWORD")
# --- Printer (Epson Connect) ---
PRINTER_EMAIL = os.getenv("PRINTER_EMAIL")

View File

@@ -16,6 +16,9 @@ from talia_bot.config import (
SMTP_USER,
SMTP_PASS,
IMAP_SERVER,
IMAP_USER,
IMAP_PASS,
PRINTER_EMAIL,
)
from talia_bot.modules.identity import is_admin
@@ -28,14 +31,14 @@ async def send_file_to_printer(file_path: str, user_id: int, file_name: str):
if not is_admin(user_id):
return "No tienes permiso para usar este comando."
if not all([SMTP_SERVER, SMTP_PORT, SMTP_USER, SMTP_PASS]):
logger.error("Faltan una o más variables de entorno SMTP.")
if not all([SMTP_SERVER, SMTP_PORT, SMTP_USER, SMTP_PASS, PRINTER_EMAIL]):
logger.error("Faltan una o más variables de entorno SMTP o PRINTER_EMAIL.")
return "El servicio de impresión no está configurado correctamente."
try:
msg = MIMEMultipart()
msg["From"] = SMTP_USER
msg["To"] = SMTP_USER # Sending to the printer's email address
msg["To"] = PRINTER_EMAIL
msg["Subject"] = f"Print Job from {user_id}: {file_name}"
body = f"Nuevo trabajo de impresión enviado por el usuario {user_id}.\nNombre del archivo: {file_name}"
@@ -55,10 +58,10 @@ async def send_file_to_printer(file_path: str, user_id: int, file_name: str):
server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
server.login(SMTP_USER, SMTP_PASS)
text = msg.as_string()
server.sendmail(SMTP_USER, SMTP_USER, text)
server.sendmail(SMTP_USER, PRINTER_EMAIL, text)
server.quit()
logger.info(f"Archivo {file_name} enviado a la impresora por el usuario {user_id}.")
logger.info(f"Archivo {file_name} enviado a la impresora ({PRINTER_EMAIL}) por el usuario {user_id}.")
return f"Tu archivo '{file_name}' ha sido enviado a la impresora. Recibirás una notificación cuando el estado del trabajo cambie."
except Exception as e:
@@ -73,13 +76,13 @@ async def check_print_status(user_id: int):
if not is_admin(user_id):
return "No tienes permiso para usar este comando."
if not all([IMAP_SERVER, SMTP_USER, SMTP_PASS]):
if not all([IMAP_SERVER, IMAP_USER, IMAP_PASS]):
logger.error("Faltan una o más variables de entorno IMAP.")
return "El servicio de monitoreo de impresión no está configurado correctamente."
try:
mail = imaplib.IMAP4_SSL(IMAP_SERVER)
mail.login(SMTP_USER, SMTP_PASS)
mail.login(IMAP_USER, IMAP_PASS)
mail.select("inbox")
status, messages = mail.search(None, "UNSEEN")