From 4303e9fc88b79b3bac6e6796931bfb722c92dfb9 Mon Sep 17 00:00:00 2001 From: adevopg Date: Wed, 15 Jul 2026 19:26:46 +0000 Subject: [PATCH] =?UTF-8?q?Los=20correos=20de=20cambio=20de=20correo=20sal?= =?UTF-8?q?udan=20con=20la=20cuenta,=20no=20con=20=C2=AB15#1=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Decían «Hola 15#1»: el username interno, que no le dice nada a nadie. Ahora «Hola INNA@INNA.CL (WOW1)» — el correo, que es la cuenta con Battle.net, y la cuenta de juego con su nombre visible. Si no se sabe cuál es, va el correo solo, sin paréntesis vacío. Afecta a las 3 plantillas del cambio de correo. En la que va al correo NUEVO se saluda con `old_email`: el cambio aún no ha terminado, así que la cuenta se sigue identificando con el correo viejo (hay que añadirlo al SELECT). El original de Django también decía «Hola {{ username }}», así que esto es un arreglo, no una copia. Co-Authored-By: Claude Opus 4.8 (1M context) --- web-next/lib/change-email.ts | 8 +++++--- web-next/lib/emails.ts | 39 ++++++++++++++++++++++++++++++------ 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/web-next/lib/change-email.ts b/web-next/lib/change-email.ts index 917c7a0..a384942 100644 --- a/web-next/lib/change-email.ts +++ b/web-next/lib/change-email.ts @@ -43,14 +43,16 @@ export async function requestEmailChange( await sendMail( current, `Confirma el cambio de correo - NightSpire`, - confirmOldEmailHtml(session.username ?? current, newEmail, link), + confirmOldEmailHtml(current, session.username ?? null, newEmail, link), ) return { success: true } } export async function confirmOldEmail(hash: string): Promise { + // `old_email` es el correo con el que la cuenta se identifica AHORA: el cambio + // aún no ha terminado, así que es con ese con el que hay que saludar. const [rows] = await db(DB.default).query( - 'SELECT id, email, hash, username FROM accountactivation WHERE old_email_hash = ? AND is_used = 0', + 'SELECT id, email, old_email, hash, username FROM accountactivation WHERE old_email_hash = ? AND is_used = 0', [hash], ) const act = rows[0] @@ -62,7 +64,7 @@ export async function confirmOldEmail(hash: string): Promise { await sendMail( act.email, `Confirma tu nuevo correo - NightSpire`, - confirmNewEmailHtml(act.username ?? act.email, link), + confirmNewEmailHtml(act.old_email || act.email, act.username ?? null, link), ) return { success: true } } diff --git a/web-next/lib/emails.ts b/web-next/lib/emails.ts index ea4ef43..d395cee 100644 --- a/web-next/lib/emails.ts +++ b/web-next/lib/emails.ts @@ -291,10 +291,27 @@ export function accountNamesEmailHtml(email: string, accounts: string[], locale } /** `confirm_old_email.html` — se confirma desde el correo ACTUAL. */ -export function confirmOldEmailHtml(username: string, newEmail: string, link: string, locale = 'es'): string { +/** + * Cómo se saluda a alguien: «INNA@INNA.CL (WOW1)». Antes se saludaba con el + * username interno («Hola 15#1»), que no le dice nada a nadie: la cuenta es el + * correo, y el «15#1» solo tiene sentido como WOW1. Si no se sabe la cuenta de + * juego, va el correo a secas. + */ +function saludo(email: string, gameAccount?: string | null): string { + const wow = gameAccount ? gameAccountDisplayName(gameAccount) : '' + return wow ? `${esc(email)} (${esc(wow)})` : esc(email) +} + +export function confirmOldEmailHtml( + email: string, + gameAccount: string | null, + newEmail: string, + link: string, + locale = 'es', +): string { return layout('CAMBIO DE CORREO', 'Confirmación de Cambio de Correo', [ p( - `Hola ${esc(username)}, has solicitado cambiar tu correo en ${SERVER_NAME} a ${esc(newEmail)}.
Para confirmar el cambio, pulsa el botón.`, + `Hola ${saludo(email, gameAccount)}, has solicitado cambiar tu correo en ${SERVER_NAME} a ${esc(newEmail)}.
Para confirmar el cambio, pulsa el botón.`, ), button(link, 'CONFIRMAR CAMBIO'), fallbackLink(link), @@ -304,10 +321,15 @@ export function confirmOldEmailHtml(username: string, newEmail: string, link: st } /** `confirm_new_email.html` — se confirma desde el correo NUEVO. */ -export function confirmNewEmailHtml(username: string, link: string, locale = 'es'): string { +export function confirmNewEmailHtml( + email: string, + gameAccount: string | null, + link: string, + locale = 'es', +): string { return layout('NUEVO CORREO', 'Activación de Nuevo Correo', [ p( - `Hola ${esc(username)}, tu solicitud para cambiar el correo en ${SERVER_NAME} ha sido recibida.
Pulsa el botón para confirmar este correo como el nuevo de tu cuenta.`, + `Hola ${saludo(email, gameAccount)}, tu solicitud para cambiar el correo en ${SERVER_NAME} ha sido recibida.
Pulsa el botón para confirmar este correo como el nuevo de tu cuenta.`, ), button(link, 'ACTIVAR NUEVO CORREO'), fallbackLink(link), @@ -317,10 +339,15 @@ export function confirmNewEmailHtml(username: string, link: string, locale = 'es } /** `old_email_notification.html` — aviso al correo antiguo, ya sin enlaces. */ -export function oldEmailNotificationHtml(username: string, newEmail: string, locale = 'es'): string { +export function oldEmailNotificationHtml( + email: string, + gameAccount: string | null, + newEmail: string, + locale = 'es', +): string { return layout('CAMBIO DE CORREO', 'Cambio de Correo Realizado', [ p( - `Hola ${esc(username)}, te avisamos de que el correo de tu cuenta en ${SERVER_NAME} se ha cambiado correctamente al siguiente:`, + `Hola ${saludo(email, gameAccount)}, te avisamos de que el correo de tu cuenta en ${SERVER_NAME} se ha cambiado correctamente al siguiente:`, ), pData(`Nuevo correo: ${esc(newEmail)}

`), divider(),