Aceptar el correo en MAYÚSCULAS y mostrar las cuentas como WOW1, no 17#1

Dos fallos que se juntaban justo en «recuperar nombre de cuenta»:

- La validación de Gmail era sensible a mayúsculas (`/@gmail\.com$/` sin la `i`),
  así que NOVAWOW86@GMAIL.COM se rechazaba con invalidEmail. Y desde que los
  correos muestran la cuenta en MAYÚSCULAS, quien la copiara de ahí y la pegara
  no podía recuperar la cuenta, ni registrarse, ni cambiar el correo: la misma
  regex estaba repetida en register/change-email/recover. Ahora es una sola, con
  la `i`, en lib/bnet.ts (junto a normalizeEmail). El dominio de un correo NO
  distingue mayúsculas.

- Los correos enseñaban el username interno («17#1»), que no le dice nada a
  nadie, en vez del nombre visible («WOW1»). Afectaba a DOS plantillas: la de
  nombres de cuenta y la de la lista de tokens. La conversión existía, pero como
  helper local de my-account; sube a lib/bnet.ts como `gameAccountDisplayName`
  (el inverso de `makeGameAccountUsername`) y la aplican las propias plantillas,
  para que ningún sitio que las use pueda olvidarse.

Verificado: la regex acepta las 3 variantes de caja y sigue rechazando no-Gmail;
los dos correos renderizados muestran «Cuenta: WOW1 / WOW2».

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-15 18:53:09 +00:00
parent edf1feedf6
commit c255724ebf
6 changed files with 29 additions and 17 deletions
+6 -3
View File
@@ -21,7 +21,7 @@
* entra con el correo, no con un usuario).
*/
import { MAX_GAME_ACCOUNTS } from './bnet'
import { MAX_GAME_ACCOUNTS, gameAccountDisplayName } from './bnet'
const SERVER_NAME = 'NightSpire'
@@ -275,9 +275,10 @@ export function passwordResetEmailHtml(email: string, link: string, locale = 'es
}
/** `account_names.html` — recordatorio de cuentas de juego. */
/** `accounts` son los usernames internos («17#1»); aquí se muestran como «WOW1». */
export function accountNamesEmailHtml(email: string, accounts: string[], locale = 'es'): string {
const list = accounts.length
? pData(accounts.map((a) => `Cuenta: ${esc(a)}`).join('<br>') + '<br><br>')
? pData(accounts.map((a) => `Cuenta: ${esc(gameAccountDisplayName(a))}`).join('<br>') + '<br><br>')
: pData('No hay cuentas de juego asociadas todavía.<br><br>')
return layout('CUENTAS DE JUEGO', 'Tus Cuentas de Juego', [
p(
@@ -343,7 +344,9 @@ export function securityTokensListEmailHtml(
[
p(`Estos son los Token de seguridad de las cuentas de juego asociadas a ${esc(email)}.<br><br>Tus datos de cuenta son:`),
pData(
items.map((i) => `Cuenta: ${esc(i.username)}<br>Token de Seguridad: ${esc(i.token)}`).join('<br><br>') +
items
.map((i) => `Cuenta: ${esc(gameAccountDisplayName(i.username))}<br>Token de Seguridad: ${esc(i.token)}`)
.join('<br><br>') +
'<br><br>',
),
p(