"use server"; import { revalidatePath } from "next/cache"; import { requireStaff, requireStaffRateLimited } from "@/lib/admin/guard"; import { prisma } from "@/lib/prisma"; import { rcon } from "@/lib/services/rcon"; import { type CurrencyName, sendCurrency } from "@/lib/services/send-currency"; import { logStaffActivity } from "@/lib/services/staff-activity"; const CURRENCIES: ReadonlySet = new Set(["credits", "duckets", "diamonds", "points"]); export async function giveCurrency(formData: FormData): Promise { const staff = await requireStaffRateLimited(); const userId = Number(formData.get("userId")); const type = String(formData.get("type")); const amount = Number(formData.get("amount")); if (userId > 0 && amount > 0 && CURRENCIES.has(type)) { await sendCurrency({ rcon, db: prisma }, userId, type as CurrencyName, amount); await logStaffActivity({ staffId: staff.id, action: "give_currency", description: `Gave ${amount} ${type} to user #${userId}`, targetType: "user", targetId: userId, }); } revalidatePath(`/admin/users/${userId}`); } export async function setMotto(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const motto = String(formData.get("motto") ?? "").slice(0, 127); if (userId > 0) { await prisma.user.update({ where: { id: userId }, data: { motto } }); await rcon.setMotto(userId, motto); } revalidatePath(`/admin/users/${userId}`); } export async function setRank(formData: FormData): Promise { const staff = await requireStaffRateLimited(); const userId = Number(formData.get("userId")); const rank = Number(formData.get("rank")); if (userId > 0 && rank > 0) { await prisma.user.update({ where: { id: userId }, data: { rank } }); await rcon.setRank(userId, rank); await logStaffActivity({ staffId: staff.id, action: "rank_change", description: `Set rank of user #${userId} to ${rank}`, targetType: "user", targetId: userId, }); } revalidatePath(`/admin/users/${userId}`); } export async function alertUser(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const message = String(formData.get("message") ?? "").trim(); if (userId > 0 && message) await rcon.alertUser(userId, message); } export async function disconnectUser(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const username = String(formData.get("username") ?? ""); if (userId > 0) await rcon.disconnectUser(userId, username); }