Armería: PvP campos de batalla, logros por categoría, bandas/mazmorras y página de hermandad

- PvP: pestaña Campos de batalla (pvpstats) con resultado, stats por partida y fecha/hora.
- Logros: rejilla por categoría con anillos de progreso + detalle por categoría
  (datos de Achievement.db2 + Achievement_Category.db2, iconos vía wowhead).
- Bandas: progreso por dificultad (10/25/heroico) con jefes reales de DungeonEncounter.db2
  y tooltip de jefes; agrupado por expansión (Clásico/TBC/WotLK).
- Mazmorras: mismo sistema, Normal + Heroico, Clásico/TBC/WotLK.
- Página de hermandad estilo armería: cabecera (emblema, puntos = unión de logros de
  miembros sin duplicar, nº miembros, fundada), pestañas Hermandad/Logros, roster con
  iconos de clase/raza, columna Función (rol por spec), filtros clase/función,
  orden por rango/puntos/nivel de objeto/nivel/nombre, paginación.
- Barra lateral: mensaje diario con login (iron-session, gated por pertenencia),
  logros recientes y desgloses de clases y funciones.
- Cabecera de personaje: enlace a la hermandad + nombre del reino.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-17 01:18:30 +00:00
parent 476e5dba87
commit beba7301a1
203 changed files with 31304 additions and 269 deletions
@@ -0,0 +1,19 @@
import { type NextRequest, NextResponse } from 'next/server'
import { getGuildAchievementCategory } from '@/lib/armory'
export const runtime = 'nodejs'
export const dynamic = 'force-dynamic'
const PAGE_SIZE = 20
/** Logros de una categoría conseguidos por la hermandad (paginado). */
export async function GET(req: NextRequest) {
const sp = req.nextUrl.searchParams
const guild = Number(sp.get('guild')) || 0
const cat = Number(sp.get('cat')) || 0
const page = Math.max(1, Number(sp.get('page')) || 1)
const locale = sp.get('locale') === 'en' ? 'en' : 'es'
if (!guild || !cat) return NextResponse.json({ entries: [], total: 0, pageSize: PAGE_SIZE })
const { entries, total } = await getGuildAchievementCategory(guild, cat, locale, page, PAGE_SIZE)
return NextResponse.json({ entries, total, pageSize: PAGE_SIZE })
}