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:
@@ -0,0 +1,19 @@
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { getAchievementCategory } from '@/lib/armory'
|
||||
|
||||
export const runtime = 'nodejs'
|
||||
export const dynamic = 'force-dynamic'
|
||||
|
||||
const PAGE_SIZE = 20
|
||||
|
||||
/** Logros conseguidos de un personaje dentro de una categoría (paginado). */
|
||||
export async function GET(req: NextRequest) {
|
||||
const sp = req.nextUrl.searchParams
|
||||
const guid = Number(sp.get('guid')) || 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 (!guid || !cat) return NextResponse.json({ entries: [], total: 0, pageSize: PAGE_SIZE })
|
||||
const { entries, total } = await getAchievementCategory(guid, cat, locale, page, PAGE_SIZE)
|
||||
return NextResponse.json({ entries, total, pageSize: PAGE_SIZE })
|
||||
}
|
||||
@@ -6,14 +6,15 @@ export const dynamic = 'force-dynamic'
|
||||
|
||||
const PAGE_SIZE = 10
|
||||
|
||||
/** Actividad reciente paginada + búsqueda (por nombre o ID) para la armería. */
|
||||
/** Logros paginados + filtros (por ID y por nombre) para la armería. */
|
||||
export async function GET(req: NextRequest) {
|
||||
const sp = req.nextUrl.searchParams
|
||||
const guid = Number(sp.get('guid'))
|
||||
const locale = sp.get('locale') === 'en' ? 'en' : 'es'
|
||||
const page = Math.max(1, Number(sp.get('page')) || 1)
|
||||
const q = sp.get('q') || ''
|
||||
const filterId = sp.get('id') || ''
|
||||
const filterName = sp.get('name') || ''
|
||||
if (!guid) return NextResponse.json({ entries: [], total: 0, pageSize: PAGE_SIZE })
|
||||
const { entries, total } = await getActivityPage(guid, locale, page, PAGE_SIZE, q)
|
||||
const { entries, total } = await getActivityPage(guid, locale, page, PAGE_SIZE, filterId, filterName)
|
||||
return NextResponse.json({ entries, total, pageSize: PAGE_SIZE })
|
||||
}
|
||||
|
||||
@@ -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 })
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { getGuildRoster } from '@/lib/armory'
|
||||
|
||||
export const runtime = 'nodejs'
|
||||
export const dynamic = 'force-dynamic'
|
||||
|
||||
/** Roster de hermandad paginado con filtro por clase y orden. */
|
||||
export async function GET(req: NextRequest) {
|
||||
const sp = req.nextUrl.searchParams
|
||||
const guildid = Number(sp.get('guild')) || 0
|
||||
const page = Math.max(1, Number(sp.get('page')) || 1)
|
||||
const pageSize = Math.min(50, Math.max(10, Number(sp.get('pageSize')) || 25))
|
||||
const sort = sp.get('sort') || 'rank'
|
||||
const classes = (sp.get('classes') || '')
|
||||
.split(',')
|
||||
.map((n) => Number(n))
|
||||
.filter((n) => Number.isInteger(n) && n > 0)
|
||||
const roles = (sp.get('roles') || '')
|
||||
.split(',')
|
||||
.map((s) => s.trim())
|
||||
.filter((s) => s === 'tank' || s === 'healer' || s === 'dps')
|
||||
if (!guildid) return NextResponse.json({ members: [], total: 0, pageSize })
|
||||
const { members, total } = await getGuildRoster(guildid, { page, pageSize, classes, roles, sort })
|
||||
return NextResponse.json({ members, total, pageSize })
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { getPvpRank } from '@/lib/armory'
|
||||
|
||||
export const runtime = 'nodejs'
|
||||
export const dynamic = 'force-dynamic'
|
||||
|
||||
const PAGE_SIZE = 30
|
||||
|
||||
/** Ranking mundial de bajas (Total Kills) con búsqueda + paginación. */
|
||||
export async function GET(req: NextRequest) {
|
||||
const sp = req.nextUrl.searchParams
|
||||
const page = Math.max(1, Number(sp.get('page')) || 1)
|
||||
const q = sp.get('q') || ''
|
||||
const { entries, total } = await getPvpRank(page, PAGE_SIZE, q)
|
||||
return NextResponse.json({ entries, total, pageSize: PAGE_SIZE })
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { getQuestPage } from '@/lib/armory'
|
||||
|
||||
export const runtime = 'nodejs'
|
||||
export const dynamic = 'force-dynamic'
|
||||
|
||||
const PAGE_SIZE = 15
|
||||
|
||||
/** Misiones paginadas + filtros (ID, nombre, estado). */
|
||||
export async function GET(req: NextRequest) {
|
||||
const sp = req.nextUrl.searchParams
|
||||
const guid = Number(sp.get('guid'))
|
||||
const locale = sp.get('locale') === 'en' ? 'en' : 'es'
|
||||
const page = Math.max(1, Number(sp.get('page')) || 1)
|
||||
const filterId = sp.get('id') || ''
|
||||
const filterName = sp.get('name') || ''
|
||||
const status = sp.get('status') || 'all'
|
||||
if (!guid) return NextResponse.json({ entries: [], total: 0, pageSize: PAGE_SIZE })
|
||||
const { entries, total } = await getQuestPage(guid, locale, page, PAGE_SIZE, filterId, filterName, status)
|
||||
return NextResponse.json({ entries, total, pageSize: PAGE_SIZE })
|
||||
}
|
||||
Reference in New Issue
Block a user