feat: Añadir sistema de mensajes de bienvenida con traducción para Discord

- Nueva tabla 'welcome_messages' en la base de datos
- Panel web con página de configuración de bienvenida (/welcome)
  - Listar, crear, editar y eliminar mensajes por servidor
  - Vista previa del mensaje
  - Plantillas predefinidas
- Bot Discord:
  - Nuevo intent 'members' para detectar nuevos usuarios
  - Evento on_member_join que envía mensaje de bienvenida
  - Botones de traducción en mensajes de bienvenida
- Actualizada configuración de MySQL en docker-compose.yml
- Añadido logging de debug para traducciones
This commit is contained in:
2026-03-20 03:18:07 -06:00
parent a3a55e5a95
commit 048e39e6a9
8 changed files with 614 additions and 14 deletions

View File

@@ -165,6 +165,14 @@ def init_db():
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4''')
cursor.execute('''CREATE TABLE IF NOT EXISTS welcome_messages
(guild_id BIGINT PRIMARY KEY,
channel_id BIGINT NOT NULL,
message_content TEXT NOT NULL,
enabled BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4''')
conn.commit()
cursor.close()
else:
@@ -212,6 +220,12 @@ def init_db():
username TEXT NOT NULL UNIQUE,
password_hash TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')
c.execute('''CREATE TABLE IF NOT EXISTS welcome_messages
(guild_id INTEGER PRIMARY KEY,
channel_id INTEGER NOT NULL,
message_content TEXT NOT NULL,
enabled INTEGER DEFAULT 1)''')
conn.commit()
conn.close()
@@ -593,3 +607,95 @@ def update_admin_password(admin_id: int, password_hash: str):
c.execute("UPDATE admins SET password_hash = ? WHERE id = ?", (password_hash, admin_id))
conn.commit()
conn.close()
def save_welcome_message(guild_id: int, channel_id: int, message_content: str, enabled: bool = True):
db_type = get_db_type()
if db_type == "mysql":
conn = get_connection()
cursor = conn.cursor()
query = """INSERT INTO welcome_messages (guild_id, channel_id, message_content, enabled)
VALUES (%s, %s, %s, %s)
ON DUPLICATE KEY UPDATE channel_id = %s, message_content = %s, enabled = %s"""
cursor.execute(query, (guild_id, channel_id, message_content, enabled, channel_id, message_content, enabled))
conn.commit()
cursor.close()
else:
conn = get_connection()
c = conn.cursor()
c.execute("""INSERT OR REPLACE INTO welcome_messages (guild_id, channel_id, message_content, enabled)
VALUES (?, ?, ?, ?)""", (guild_id, channel_id, message_content, 1 if enabled else 0))
conn.commit()
conn.close()
def get_welcome_message(guild_id: int):
db_type = get_db_type()
if db_type == "mysql":
conn = get_connection()
cursor = conn.cursor(dictionary=True)
cursor.execute("SELECT channel_id, message_content, enabled FROM welcome_messages WHERE guild_id = %s", (guild_id,))
row = cursor.fetchone()
cursor.close()
if row:
return {
'channel_id': int(row['channel_id']) if row['channel_id'] else 0,
'message_content': row['message_content'] or '',
'enabled': bool(row['enabled'])
}
return None
else:
conn = get_connection()
c = conn.cursor()
c.execute("SELECT channel_id, message_content, enabled FROM welcome_messages WHERE guild_id = ?", (guild_id,))
row = c.fetchone()
conn.close()
if row:
return {
"channel_id": int(row[0]) if row[0] else 0,
"message_content": row[1] or '',
"enabled": bool(row[2])
}
return None
def get_all_welcome_configs():
db_type = get_db_type()
if db_type == "mysql":
conn = get_connection()
cursor = conn.cursor(dictionary=True)
cursor.execute("SELECT guild_id, channel_id, message_content, enabled FROM welcome_messages")
rows = cursor.fetchall()
cursor.close()
result = []
for row in rows:
result.append({
'guild_id': int(row['guild_id']) if row['guild_id'] else 0,
'channel_id': int(row['channel_id']) if row['channel_id'] else 0,
'message_content': row['message_content'] or '',
'enabled': bool(row['enabled'])
})
return result
else:
conn = get_connection()
c = conn.cursor()
c.execute("SELECT guild_id, channel_id, message_content, enabled FROM welcome_messages")
rows = [{"guild_id": r[0], "channel_id": r[1], "message_content": r[2], "enabled": bool(r[3])} for r in c.fetchall()]
conn.close()
return rows
def delete_welcome_message(guild_id: int):
db_type = get_db_type()
if db_type == "mysql":
conn = get_connection()
cursor = conn.cursor()
cursor.execute("DELETE FROM welcome_messages WHERE guild_id = %s", (guild_id,))
conn.commit()
cursor.close()
else:
conn = get_connection()
c = conn.cursor()
c.execute("DELETE FROM welcome_messages WHERE guild_id = ?", (guild_id,))
conn.commit()
conn.close()