Foro: autor con personaje aleatorio de la cuenta

- El nombre del autor muestra un personaje ALEATORIO de la cuenta (no la id).
- Nombre con <Hermandad> en dorado (oculto si el personaje no tiene guild).
- Avatar = imagen de raza del personaje (raza+género).
- Cajas nuevas: puntos de logros, nivel y clase (con su color de clase).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-17 07:57:41 +00:00
parent beba7301a1
commit 24bd28fcca
93 changed files with 249 additions and 28 deletions
@@ -11,6 +11,7 @@ import {
import { formatForumDate } from '@/lib/forum-format'
import { localizeWowheadLinks } from '@/lib/forum-wowhead'
import { getSession } from '@/lib/session'
import { className, classColor } from '@/lib/wow-data'
import { forumIsModerator, canEditPost } from '@/lib/forum-perm'
import { PageShell } from '@/components/PageShell'
import { ForumBreadcrumb } from '@/components/ForumBreadcrumb'
@@ -105,7 +106,10 @@ export default async function TopicPage({
<div key={post.id} className={`topic_post${isStaff ? ' isStaff' : ''}${post.deleted ? ' post_deleted' : ''}`}>
<div className="left_side">
<div className="username_container">
<span className="username">{author?.name ?? `#${post.poster}`}</span>
<span className="username">
{author?.charName ?? author?.name ?? `#${post.poster}`}
{author?.guildName ? <span className="username_guild"> &lt;{author.guildName}&gt;</span> : null}
</span>
</div>
<div className={`user_avatar${isStaff ? ' isStaff' : ''}`}>
<span
@@ -128,6 +132,30 @@ export default async function TopicPage({
</dt>
<dd>{formatForumDate(author?.joindate ?? null, locale) || '—'}</dd>
</h3>
{author?.charName ? (
<>
<h3 className="post_field">
<dt>
<i className="fa-solid fa-medal fa-fw" />
</dt>
<dd>{(author.achPoints ?? 0).toLocaleString(locale)}</dd>
</h3>
<h3 className="post_field">
<dt>
<i className="fa-solid fa-star fa-fw" />
</dt>
<dd>
{t('level')} {author.level}
</dd>
</h3>
<h3 className="post_field">
<dt>
<i className="fa-solid fa-khanda fa-fw" />
</dt>
<dd style={{ color: classColor(author.classId) }}>{className(author.classId, locale)}</dd>
</h3>
</>
) : null}
<h3 className="post_field">
<dt>
<i className="fa-solid fa-comments fa-fw" />
+3 -2
View File
@@ -54,8 +54,9 @@ export default async function LocaleLayout({
return (
<html lang={locale}>
<head>
{/* Verificación de la cuenta de Google AdSense: solo si hay ADSENSE_CLIENT_ID
y el visitante no es admin. Ver components/AdSense.tsx. */}
{/* Google AdSense (meta de verificación + adsbygoogle.js): solo si hay
ADSENSE_CLIENT_ID, el visitante no es admin ni ha pagado, y —para el
script— ha aceptado «Marketing». Ver components/AdSense.tsx. */}
<AdSense />
{/* Iconos del sitio (idénticos a la web Django) */}
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
+3
View File
@@ -295,3 +295,6 @@ a.nice_button:focus {
.topic_post .left_side { flex-basis: 100%; }
.topic_post .left_side .user_avatar { width: 56px; height: 56px; }
}
/* Nombre de hermandad junto al personaje en el foro */
.username_guild { color: #c8a24c; font-weight: 400; font-size: .8em; }