- 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>
81 lines
3.4 KiB
Lua
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)
|