import { eq } from "drizzle-orm"; import Link from "next/link"; import { notFound } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { Badge } from "@/components/ui/badge"; import { requireModPermission } from "@/lib/admin/guard"; import { db, User } from "@/lib/db"; import { formatDate } from "@/lib/format-date"; import { getAvatarUrl } from "@/lib/imager"; import { PERMS } from "@/lib/permissions"; export default async function ModUserDetailPage({ params, }: { params: Promise<{ id: string }>; }) { await requireModPermission([PERMS.MOD_USERS_VIEW, PERMS.USERS_VIEW]); const t = await getTranslations("pages.mod"); const { id: rawId } = await params; const id = Number(rawId); if (!Number.isFinite(id) || id <= 0) notFound(); const [user] = await db .select({ id: User.id, username: User.username, rank: User.rank, online: User.online, motto: User.motto, look: User.look, accountCreated: User.accountCreated, lastLogin: User.lastLogin, lastOnline: User.lastOnline, }) .from(User) .where(eq(User.id, id)) .limit(1); if (!user) notFound(); return (

{user.username}

#{user.id} · {t("usersRank")} {user.rank}

{user.online === "1" ? ( Online ) : ( Offline )}
← {t("nav.users")} {t("usersPublicProfile")}
{t("usersPiiNote")}

Motto

{user.motto || "—"}

{t("usersJoined")}

{user.accountCreated > 0 ? formatDate(new Date(user.accountCreated * 1000), "date") : "—"}

{t("usersLastLogin")}

{user.lastLogin ? formatDate(new Date(user.lastLogin * 1000), "datetime") : "—"}

{t("usersLastOnline")}

{user.lastOnline > 0 ? formatDate(new Date(user.lastOnline * 1000), "datetime") : "—"}

); }