- 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>
51 lines
2.0 KiB
Lua
51 lines
2.0 KiB
Lua
-- =====================================================================
|
|
-- aether-admin — Kamera-Bridge (Client)
|
|
--
|
|
-- Die NUI (webrtc.js) macht das eigentliche WebRTC. Dieser Client-Code
|
|
-- ist nur die Brücke: Wenn der Server anordnet „publiziere in Raum X",
|
|
-- reicht er das an die immer geladene NUI weiter. Signaling und Medien
|
|
-- laufen direkt zwischen NUI und Media-Server — nicht über FiveM.
|
|
--
|
|
-- Wichtig: Das Publizieren läuft im Hintergrund, auch ohne geöffnetes
|
|
-- Panel. Die NUI-Seite ist die ehrliche Stelle, an der die echte
|
|
-- Videoquelle angeklemmt wird (siehe html/js/webrtc.js).
|
|
-- =====================================================================
|
|
|
|
local function SendeAnNui(nachricht)
|
|
SendNuiMessage(json.encode(nachricht))
|
|
end
|
|
|
|
--- Der Server fordert diesen Client auf, als Publisher zu senden
|
|
RegisterNetEvent('aether-admin:kamera:publiziere', function(daten)
|
|
if type(daten) ~= 'table' or not daten.token then return end
|
|
SendeAnNui({
|
|
aktion = 'webrtcPublish',
|
|
raum = daten.raum,
|
|
url = daten.url,
|
|
token = daten.token,
|
|
})
|
|
end)
|
|
|
|
--- Der Server beendet die Übertragung dieses Raums
|
|
RegisterNetEvent('aether-admin:kamera:stopp', function(raum)
|
|
SendeAnNui({ aktion = 'webrtcStop', raum = raum })
|
|
end)
|
|
|
|
--- Statusmeldung der NUI (Bildschirmfreigabe geklappt oder blockiert)
|
|
RegisterNUICallback('kameraStatus', function(daten, cb)
|
|
TriggerServerEvent('aether-admin:kamera:status',
|
|
tostring(daten.raum or ''), tostring(daten.typ or ''), tostring(daten.fehler or ''))
|
|
cb({ ok = true })
|
|
end)
|
|
|
|
--- Der Admin bekommt die Statusmeldung eines Ziel-Clients
|
|
RegisterNetEvent('aether-admin:kamera:status', function(daten)
|
|
SendeAnNui({ aktion = 'kameraStatus', quelle = daten.quelle, typ = daten.typ, fehler = daten.fehler })
|
|
end)
|
|
|
|
-- Beim Stoppen der Ressource alle Übertragungen kappen
|
|
AddEventHandler('onResourceStop', function(ressource)
|
|
if ressource ~= GetCurrentResourceName() then return end
|
|
SendeAnNui({ aktion = 'webrtcStopAll' })
|
|
end)
|