import { and, count, eq, gte, ne } from "drizzle-orm"; import { Ban, Gavel, LifeBuoy, Radio, Shield, Ticket, Users, } from "lucide-react"; import Link from "next/link"; import { getTranslations } from "next-intl/server"; import { StatsCard } from "@/components/admin/stats-card"; import { getMinStaffRank } from "@/lib/admin/min-staff-rank"; import { Ban as BanTable, db, SupportTickets, User, WebsiteHelpCenterTickets, WebsiteTicket, } from "@/lib/db"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; export default async function ModDashboardPage() { const t = await getTranslations("pages.mod"); const { session, permissions } = await getAdminContext(); const rank = session.user.rank; const now = Math.floor(Date.now() / 1000); const todayStart = now - (now % 86400); const minStaffRank = await getMinStaffRank(); const showCfh = canAccess(permissions, PERMS.MOD_CFH_VIEW, rank) || canAccess(permissions, PERMS.MODERATION_VIEW, rank); const showActions = canAccess(permissions, PERMS.MOD_ACTIONS, rank) || canAccess(permissions, PERMS.MODERATION_EDIT, rank); const showBans = canAccess(permissions, PERMS.MOD_BANS_VIEW, rank) || canAccess(permissions, PERMS.BANS_VIEW, rank); const showTickets = canAccess(permissions, PERMS.MOD_TICKETS_VIEW, rank) || canAccess(permissions, PERMS.TICKETS_VIEW, rank); const showTeam = canAccess(permissions, PERMS.MOD_TEAM_VIEW, rank) || canAccess(permissions, PERMS.MODERATION_VIEW, rank); const showUsers = canAccess(permissions, PERMS.MOD_USERS_VIEW, rank) || canAccess(permissions, PERMS.USERS_VIEW, rank); const [openCfh, todayBans, modsOnline, openTickets, openHelpTickets] = await Promise.all([ showCfh ? db .select({ total: count() }) .from(SupportTickets) .where(eq(SupportTickets.state, 0)) .then((rows) => rows[0]?.total ?? 0) .catch(() => 0) : Promise.resolve(0), showBans ? db .select({ total: count() }) .from(BanTable) .where(gte(BanTable.timestamp, todayStart)) .then((rows) => rows[0]?.total ?? 0) .catch(() => 0) : Promise.resolve(0), db .select({ total: count() }) .from(User) .where(and(eq(User.online, "1"), gte(User.rank, minStaffRank))) .then((rows) => rows[0]?.total ?? 0) .catch(() => 0), showTickets ? db .select({ total: count() }) .from(WebsiteTicket) .where(ne(WebsiteTicket.status, "closed")) .then((rows) => rows[0]?.total ?? 0) .catch(() => 0) : Promise.resolve(0), showTickets ? db .select({ total: count() }) .from(WebsiteHelpCenterTickets) .where(eq(WebsiteHelpCenterTickets.open, true)) .then((rows) => rows[0]?.total ?? 0) .catch(() => 0) : Promise.resolve(0), ]); return (

{t("overviewTitle")}

{t("overviewSubtitle")}

{showCfh ? ( } href="/mod/cfh" /> ) : null} {showTickets ? ( } href="/mod/tickets" /> ) : null} {showTickets ? ( } href="/mod/help-tickets" /> ) : null} {showBans ? ( } href="/mod/bans" /> ) : null} } href={showTeam ? "/mod/team" : undefined} /> {showActions ? ( } href="/mod/actions" /> ) : null} {showTeam ? ( } href="/mod/team" /> ) : null}

{t("shortcutsTitle")}

); }