aether-framework/resources/[aether]/aether-admin/server/main.lua
Jerrit Fritzsche e4b82dd685 Aether-Framework: Fachmodule, Admin-Panel und Docker-Datenbank
- aether-medical: Stationen/Belegung, Intensivstation, Blutbank, Fuhrpark,
  Nachrichten/Aushänge, Berichte und Textbausteine (server + NUI)
- aether-admin: vollständiges Server-Admin-Panel als echtes FiveM-Resource,
  an aether-core gekoppelt (Rechte über aether_users.admin_group), mit
  WebRTC-Live-Kameras (Bildschirmfreigabe) und separatem Media-Server (SFU)
- Prototypen admin/ vervollständigt
- SQL-Schema aether_admin.sql
- Docker-Compose mit MariaDB und idempotenter Auto-Migration (schema_migrations)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-27 18:55:32 +02:00

81 lines
3.4 KiB
Lua

-- =====================================================================
-- aether-admin — Server-Schnittstelle
--
-- Ein einziges Netz-Event bedient das ganze Panel. Jede Anfrage
-- durchläuft die Rechteprüfung im Kern, bevor sie ein Modul erreicht.
-- =====================================================================
Admin = Admin or {}
Admin.Live = Admin.Live or { pos = {}, god = {}, frozen = {}, muted = {} }
-- ---------------------------------------------------------------------
-- Panel öffnen
-- ---------------------------------------------------------------------
RegisterNetEvent('aether-admin:oeffnen', function()
local quelle = source
if not Admin.Auth.DarfOeffnen(quelle) then
TriggerClientEvent('aether-admin:verweigert', quelle,
'Du hast keinen Zugriff auf das Admin-Panel.')
return
end
local gruppe = Admin.Auth.Gruppe(quelle)
TriggerClientEvent('aether-admin:zeige', quelle, {
admin = { name = Admin.Auth.Name(quelle), gruppe = gruppe },
sektionen = Admin.Kern.SichtbareSektionen(quelle),
rechte = Admin.Kern.RechteAbbild(quelle),
serverName = GetConvar('sv_hostname', 'Aether RP'),
media = { aktiv = AdminConfig.Media.aktiv },
})
Admin.Log.Schreibe(Admin.Auth.Handelnder(quelle), 'Panel geöffnet')
end)
-- ---------------------------------------------------------------------
-- Zentraler Aufruf: die Oberfläche fragt, ein Modul antwortet
-- ---------------------------------------------------------------------
RegisterNetEvent('aether-admin:aufruf', function(modul, aktion, daten, ruf)
local quelle = source
local ergebnis, fehler = Admin.Kern.FuehreAus(
quelle, tostring(modul or ''), tostring(aktion or ''), daten or {})
TriggerClientEvent('aether-admin:antwort', quelle, ruf, ergebnis, fehler)
end)
-- ---------------------------------------------------------------------
-- Positions-Cache (für Weltkarte, Teleport, Spectate)
-- ---------------------------------------------------------------------
RegisterNetEvent('aether-admin:pos', function(pos)
if type(pos) == 'table' and pos.x then
Admin.Live.pos[source] = { x = pos.x + 0.0, y = pos.y + 0.0, z = pos.z + 0.0 }
end
end)
-- ---------------------------------------------------------------------
-- Spieler-Report aus dem Spiel (/report)
-- ---------------------------------------------------------------------
RegisterNetEvent('aether-admin:report', function(betreff, nachricht)
local quelle = source
if type(betreff) ~= 'string' or #betreff < 2 then return end
Admin.ErstelleReport(quelle, betreff:sub(1, 160), nachricht)
TriggerClientEvent('aether-admin:client:hinweis', quelle,
'✅ Dein Report wurde an das Team übermittelt.')
end)
-- ---------------------------------------------------------------------
-- Neuen Spielern den aktuellen Weltzustand mitgeben
-- ---------------------------------------------------------------------
AddEventHandler('aether:server:spielerGeladen', function(quelle)
if Admin.SendeWelt then Admin.SendeWelt(quelle) end
end)
-- ---------------------------------------------------------------------
-- Aufräumen
-- ---------------------------------------------------------------------
AddEventHandler('playerDropped', function()
local weg = source
Admin.Live.pos[weg] = nil
Admin.Live.god[weg] = nil
Admin.Live.frozen[weg] = nil
Admin.Live.muted[weg] = nil
end)