"use server"; import { revalidatePath } from "next/cache"; import { requireStaff } from "@/lib/admin/guard"; import { rcon } from "@/lib/services/rcon"; import { CurrencyType } from "@/lib/services/currency"; const PATH = "/admin/commandocentrum"; /** Rebuild the in-memory catalog on the emulator (rcon: updatecatalog). */ export async function updateCatalog(): Promise { await requireStaff(); try { await rcon.updateCatalog(); } catch { // RCON is best-effort; a dead socket must not 500 the admin page. } revalidatePath(PATH); } /** Reload the chat word filter on the emulator (rcon: updatewordfilter). */ export async function updateWordFilter(): Promise { await requireStaff(); try { await rcon.updateWordFilter(); } catch { // best-effort } revalidatePath(PATH); } /** Reload navigator data on the emulator (rcon: updatenavigator, no payload). */ export async function updateNavigator(): Promise { await requireStaff(); try { await rcon.send("updatenavigator", null); } catch { // best-effort } revalidatePath(PATH); } /** Broadcast a hotel-wide alert to every connected user (rcon: hotelalert). */ export async function hotelAlert(formData: FormData): Promise { await requireStaff(); const message = String(formData.get("message") ?? "").trim().slice(0, 512); if (!message) return; try { await rcon.send("hotelalert", { message }); } catch { // best-effort } revalidatePath(PATH); } /** Disconnect/kick a user from the hotel (rcon: disconnect). */ export async function disconnectUser(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const username = String(formData.get("username") ?? "").trim(); if (!userId || !username) return; try { await rcon.disconnectUser(userId, username); } catch { // best-effort } revalidatePath(PATH); } /** Send an alert to a specific user (rcon: alertuser). */ export async function alertUser(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const message = String(formData.get("message") ?? "").trim().slice(0, 512); if (!userId || !message) return; try { await rcon.alertUser(userId, message); } catch { // best-effort } revalidatePath(PATH); } /** Forward a user to a specific room (rcon: forwarduser). */ export async function forwardUser(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const roomId = Number(formData.get("roomId")); if (!userId || !roomId) return; try { await rcon.forwardUser(userId, roomId); } catch { // best-effort } revalidatePath(PATH); } /** Give credits to a user (rcon: givecredits). */ export async function giveCredits(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const credits = Number(formData.get("credits")); if (!userId || !credits || credits <= 0) return; try { await rcon.giveCredits(userId, credits); } catch { // best-effort } revalidatePath(PATH); } /** Give duckets to a user (rcon: givepoints type=duckets). */ export async function giveDuckets(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const amount = Number(formData.get("amount")); if (!userId || !amount || amount <= 0) return; try { await rcon.giveDuckets(userId, amount); } catch { // best-effort } revalidatePath(PATH); } /** Give diamonds to a user (rcon: givepoints type=diamonds). */ export async function giveDiamonds(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const amount = Number(formData.get("amount")); if (!userId || !amount || amount <= 0) return; try { await rcon.giveDiamonds(userId, amount); } catch { // best-effort } revalidatePath(PATH); } /** Give a badge to a user (rcon: givebadge). */ export async function giveBadge(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const badge = String(formData.get("badge") ?? "").trim(); if (!userId || !badge) return; try { await rcon.giveBadge(userId, badge); } catch { // best-effort } revalidatePath(PATH); } /** Set a user's motto (rcon: setmotto). */ export async function setMotto(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const motto = String(formData.get("motto") ?? "").trim().slice(0, 127); if (!userId || !motto) return; try { await rcon.setMotto(userId, motto); } catch { // best-effort } revalidatePath(PATH); } /** Set a user's rank (rcon: setrank). */ export async function setRank(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const rank = Number(formData.get("rank")); if (!userId || rank < 0 || rank > 10) return; try { await rcon.setRank(userId, rank); } catch { // best-effort } revalidatePath(PATH); } /** Execute a command as a user (rcon: executecommand). */ export async function executeCommand(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const command = String(formData.get("command") ?? "").trim(); if (!userId || !command) return; try { await rcon.executeCommand(userId, command); } catch { // best-effort } revalidatePath(PATH); } /** Send a gift to a user (rcon: sendgift). */ export async function sendGift(formData: FormData): Promise { await requireStaff(); const userId = Number(formData.get("userId")); const itemId = Number(formData.get("itemId")); const message = String(formData.get("message") ?? "Here is a gift.").trim().slice(0, 255); if (!userId || !itemId) return; try { await rcon.sendGift(userId, itemId, message); } catch { // best-effort } revalidatePath(PATH); }