Files
Inna 3af7f5e804 Armería: muñeco de papel, talentos, actividad y caché del visor 3D
La ficha de personaje pasa a mostrar el equipo sobre el paperdoll (con
encantamientos y gemas en los tooltips de wowhead), el árbol de talentos y
la actividad reciente del personaje.

El proxy de /modelviewer/* deja de ser un rewrite de Next y pasa a un route
handler que cachea en disco los assets de zamimg, para no repetir la descarga
en cada visita.
2026-07-16 21:07:39 +00:00

73 lines
3.0 KiB
TypeScript

/**
* Enlaces, iconos y tooltips de wowhead (rama WotLK Classic) con el locale de la
* web. Sustituye a la antigua base de datos de ítems (AoWoW en wotlk.ultimowow /
* wotlk.novawow) y a los iconos de otros mirrors: todo pasa por wowhead / zamimg.
*
* El tooltip lo pinta el script global (ver el layout raíz); el idioma del
* tooltip lo determina el SUBDOMINIO del enlace, por eso construimos las URLs
* con el subdominio del locale actual.
*
* Es un módulo puro (sin acceso a BD), así que lo pueden importar tanto los
* Server Components como los Client Components.
*/
export type WowheadType = 'item' | 'spell' | 'quest' | 'npc' | 'achievement' | 'object' | 'faction'
export type IconSize = 'tiny' | 'small' | 'medium' | 'large'
// Subdominio de wowhead por locale de la web (www = inglés, por defecto).
// Añadir aquí si se soportan más idiomas (de, fr, ru, pt, it, ko...).
const LOCALE_SUBDOMAIN: Record<string, string> = { es: 'es', en: 'www' }
function subdomain(locale: string): string {
return LOCALE_SUBDOMAIN[locale] ?? 'www'
}
/** URL de wowhead (rama WotLK) para una entidad, en el locale de la web. */
export function wowheadUrl(type: WowheadType, id: number | string, locale: string): string {
return `https://${subdomain(locale)}.wowhead.com/wotlk/${type}=${id}`
}
/** Enlace a un ítem en wowhead (WotLK) en el locale de la web. */
export function wowheadItemUrl(id: number | string, locale: string): string {
return wowheadUrl('item', id, locale)
}
/** Home de la base de datos WotLK en wowhead (enlace "WOTLK DB"). */
export function wowheadWotlkHome(locale: string): string {
return `https://${subdomain(locale)}.wowhead.com/wotlk`
}
/** Icono (de ítem/hechizo/misión) servido por el CDN de wowhead (zamimg). */
export function wowheadIcon(name: string, size: IconSize = 'large'): string {
const ext = size === 'tiny' ? 'gif' : 'jpg'
return `https://wow.zamimg.com/images/wow/icons/${size}/${name}.${ext}`
}
// Código de idioma de wowhead para el parámetro `domain` del tooltip. El inglés
// es la base (sin prefijo). El script mapea el 1.er segmento a locale
// ({es:6,fr:2,de:3,...}) y el resto a la versión del juego (wotlk = WRATH).
const LOCALE_WH_CODE: Record<string, string> = { es: 'es' }
function wowheadDomain(locale: string): string {
const code = LOCALE_WH_CODE[locale]
return code ? `${code}.wotlk` : 'wotlk'
}
/**
* Valor del atributo `data-wowhead`, para que el tooltip salga en la rama WotLK
* y EN EL IDIOMA de la web. El `domain` lleva el idioma (p.ej. `es.wotlk`) porque
* el script prioriza este atributo sobre el subdominio del href; sin el idioma
* aquí, el tooltip saldría en inglés aunque el enlace sea es.wowhead.com.
*/
export function wowheadData(
type: WowheadType,
id: number | string,
locale: string,
opts?: { ench?: number; gems?: number[] },
): string {
let s = `${type}=${id}&domain=${wowheadDomain(locale)}`
if (opts?.ench) s += `&ench=${opts.ench}`
if (opts?.gems && opts.gems.length) s += `&gems=${opts.gems.join(':')}`
return s
}