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

@@ -128,6 +128,7 @@ async def login(request: Request):
if verify_admin(username, password):
response = RedirectResponse(url="/dashboard", status_code=status.HTTP_303_SEE_OTHER)
response.set_cookie(key="auth", value="ok", httponly=True)
response.set_cookie(key="username", value=username, httponly=True)
return response
return templates.TemplateResponse("login.html", {
@@ -140,10 +141,12 @@ async def dashboard(request: Request):
if request.cookies.get("auth") != "ok":
return RedirectResponse(url="/login")
username = request.cookies.get("username", "")
config = get_config()
return templates.TemplateResponse("dashboard.html", {
"request": request,
"config": config
"config": config,
"username": username
})
@app.get("/config")
@@ -151,10 +154,12 @@ async def config_page(request: Request):
if request.cookies.get("auth") != "ok":
return RedirectResponse(url="/login")
username = request.cookies.get("username", "")
config = get_config()
return templates.TemplateResponse("config.html", {
"request": request,
"config": config
"config": config,
"username": username
})
@app.get("/languages")
@@ -248,6 +253,7 @@ async def update_language_flags(request: Request):
async def logout():
response = RedirectResponse(url="/login", status_code=status.HTTP_303_SEE_OTHER)
response.delete_cookie("auth")
response.delete_cookie("username")
return response
@app.get("/admins")
@@ -316,6 +322,81 @@ async def update_admin_post(request: Request):
return RedirectResponse(url="/admins?success=1", status_code=status.HTTP_303_SEE_OTHER)
@app.get("/welcome")
async def welcome_page(request: Request):
if request.cookies.get("auth") != "ok":
return RedirectResponse(url="/login")
from botdiscord.database import get_all_welcome_configs
configs = get_all_welcome_configs()
config_dict = {c['guild_id']: c for c in configs} if configs else {}
selected_guild = request.query_params.get("guild")
selected_cfg = None
if selected_guild and selected_guild.isdigit():
selected_cfg = config_dict.get(int(selected_guild))
success = request.query_params.get("success") == "1"
error = request.query_params.get("error") == "1"
return templates.TemplateResponse("welcome.html", {
"request": request,
"configs": config_dict,
"config": config_dict,
"selected_guild": int(selected_guild) if selected_guild and selected_guild.isdigit() else None,
"selected_cfg": selected_cfg,
"success": success,
"error": error,
"new_form": request.query_params.get("new") == "1"
})
@app.post("/welcome/save")
async def save_welcome(request: Request):
if request.cookies.get("auth") != "ok":
raise HTTPException(status_code=401)
form = await request.form()
guild_id = form.get("guild_id")
channel_id = form.get("channel_id")
message_content = form.get("message_content")
enabled = form.get("enabled") == "1"
if not guild_id or not channel_id or not message_content:
return RedirectResponse(url="/welcome?error=1", status_code=status.HTTP_303_SEE_OTHER)
try:
from botdiscord.database import save_welcome_message
save_welcome_message(
int(guild_id),
int(channel_id),
message_content,
enabled
)
return RedirectResponse(url="/welcome?success=1", status_code=status.HTTP_303_SEE_OTHER)
except Exception as e:
print(f"Error saving welcome message: {e}")
return RedirectResponse(url="/welcome?error=1", status_code=status.HTTP_303_SEE_OTHER)
@app.post("/welcome/delete")
async def delete_welcome(request: Request):
if request.cookies.get("auth") != "ok":
raise HTTPException(status_code=401)
form = await request.form()
guild_id = form.get("guild_id")
if guild_id:
try:
from botdiscord.database import delete_welcome_message
delete_welcome_message(int(guild_id))
return RedirectResponse(url="/welcome?success=1", status_code=status.HTTP_303_SEE_OTHER)
except Exception as e:
print(f"Error deleting welcome message: {e}")
return RedirectResponse(url="/welcome?error=1", status_code=status.HTTP_303_SEE_OTHER)
return RedirectResponse(url="/welcome", status_code=status.HTTP_303_SEE_OTHER)
if __name__ == "__main__":
import uvicorn
web_config = get_web_config()