aether-framework/resources/[aether]/aether-admin/client/kamera.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

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)