"use server"; import { revalidatePath } from "next/cache"; import { requirePermission } from "@/lib/admin/guard"; import { PERMS } from "@/lib/permissions"; import { rcon } from "@/lib/services/rcon"; /** * Broadcast a hotel-wide alert to every online user via RCON. * * Faithful to AtomCMS: the emulator's `hotelalert` command takes a single * `message` payload. Staff-gated; the message is trimmed/bounded before send. */ export async function sendHotelAlert(formData: FormData): Promise { await requirePermission(PERMS.NOTIFICATIONS_EDIT); const message = String(formData.get("message") ?? "") .normalize("NFC") .trim() .slice(0, 1000); if (!message) return; try { await rcon.send("hotelalert", { message }); } catch { // Best-effort delivery (dead socket / emulator offline) — never 500 the // admin page. The emulator writes its own alert_logs row on receipt. } revalidatePath("/admin/alerts"); }