web-next: rediseño de security-token, recover, vote-points + rename-guild

- /security-token: diseño completo del original (info + advertencia + NOTA 7 días),
  fecha en formato HH:MM:SS DD-MM-YYYY, botón "Token enviado", enlace a /recover.
- /recover: 4 opciones (contraseña por usuario, nombre de cuenta, token de seguridad
  y enlace de activación por correo); recuperación de token nueva; Turnstile por envío.
- /vote-points: caja de info con las 7 secciones Q&A + panel "Sitios de votación" con
  tarjetas inline-div (imagen, PV, último voto), botón refrescar; abre el sitio y acredita
  PV al volver. lib/vote.ts + getVoteSitesForAccount.
- /rename-guild: renombra una hermandad de la que la cuenta es Maestro por 1000 PD +
  token de seguridad; SOAP .guild rename con comillas; reembolsa los PD si SOAP falla.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-14 10:06:49 +00:00
parent 66d056c04b
commit b9803adeb9
15 changed files with 778 additions and 116 deletions
+5 -3
View File
@@ -3,12 +3,14 @@ import { verifyTurnstile } from '@/lib/turnstile'
export async function POST(request: Request) {
let type = ''
let email = ''
let value = ''
let turnstileToken = ''
try {
const body = await request.json()
type = String(body.type ?? '')
email = String(body.email ?? '')
// `value` es el nombre de usuario (password) o el correo (resto). Se acepta
// `email` por compatibilidad.
value = String(body.value ?? body.email ?? '')
turnstileToken = String(body.turnstileToken ?? '')
} catch {
return Response.json({ success: false, error: 'invalidRequest' }, { status: 400 })
@@ -17,6 +19,6 @@ export async function POST(request: Request) {
if (!(await verifyTurnstile(turnstileToken, ip))) {
return Response.json({ success: false, error: 'captchaFailed' })
}
const result = await requestRecovery(type, email)
const result = await requestRecovery(type, value)
return Response.json(result)
}