- 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>
96 lines
2.9 KiB
Lua
96 lines
2.9 KiB
Lua
-- =====================================================================
|
|
-- aether-admin — Rechteprüfung (Kopplung an aether-core)
|
|
--
|
|
-- Die Wahrheit über die Gruppe eines Spielers steht in
|
|
-- `aether_users.admin_group` — gepflegt vom Core. Dieses Modul liest
|
|
-- sie, hält sie je Session vor und beantwortet die einzige Frage, die
|
|
-- der Rest des Codes stellt: „Darf diese Server-ID das?"
|
|
--
|
|
-- Geprüft wird IMMER hier, nie in der Oberfläche. Was der Client
|
|
-- schickt, ist ein Wunsch, kein Nachweis.
|
|
-- =====================================================================
|
|
|
|
Admin = Admin or {}
|
|
Admin.Auth = {}
|
|
|
|
-- Zwischenspeicher: [quelle] = gruppe
|
|
local gruppeCache = {}
|
|
|
|
--- Liest die Rockstar-Lizenz einer Server-ID (ohne Präfix)
|
|
--- @param quelle number
|
|
--- @return string|nil
|
|
function Admin.Auth.Lizenz(quelle)
|
|
local lizenz = GetPlayerIdentifierByType(quelle, 'license')
|
|
if not lizenz then return nil end
|
|
return (lizenz:gsub('license:', ''))
|
|
end
|
|
|
|
--- Anzeigename einer Server-ID
|
|
--- @param quelle number
|
|
--- @return string
|
|
function Admin.Auth.Name(quelle)
|
|
return GetPlayerName(quelle) or ('Spieler ' .. tostring(quelle))
|
|
end
|
|
|
|
--- Rechtegruppe einer Server-ID (mit Cache)
|
|
--- @param quelle number
|
|
--- @return string
|
|
function Admin.Auth.Gruppe(quelle)
|
|
if gruppeCache[quelle] then return gruppeCache[quelle] end
|
|
|
|
local lizenz = Admin.Auth.Lizenz(quelle)
|
|
if not lizenz then return 'user' end
|
|
|
|
local gruppe = Admin.DB.GruppeVonLizenz(lizenz)
|
|
gruppeCache[quelle] = gruppe
|
|
return gruppe
|
|
end
|
|
|
|
--- Verwirft den Cache einer Server-ID (nach Rollenänderung / Disconnect)
|
|
--- @param quelle number
|
|
function Admin.Auth.CacheLeeren(quelle)
|
|
gruppeCache[quelle] = nil
|
|
end
|
|
|
|
--- Verwirft den Cache einer Lizenz, egal unter welcher Server-ID sie online ist
|
|
--- @param lizenz string
|
|
function Admin.Auth.CacheLeerenNachLizenz(lizenz)
|
|
for quelle in pairs(gruppeCache) do
|
|
if Admin.Auth.Lizenz(quelle) == lizenz then
|
|
gruppeCache[quelle] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
--- Erfüllt die Server-ID mindestens die geforderte Gruppe?
|
|
--- @param quelle number
|
|
--- @param benoetigt string
|
|
--- @return boolean
|
|
function Admin.Auth.Hat(quelle, benoetigt)
|
|
return AdminConfig.Erfuellt(Admin.Auth.Gruppe(quelle), benoetigt)
|
|
end
|
|
|
|
--- Darf die Server-ID das Panel überhaupt öffnen?
|
|
--- @param quelle number
|
|
--- @return boolean
|
|
function Admin.Auth.DarfOeffnen(quelle)
|
|
return Admin.Auth.Hat(quelle, AdminConfig.MindestGruppe)
|
|
end
|
|
|
|
--- Baut den „Handelnden"-Kontext, den Module und das Log erwarten
|
|
--- @param quelle number
|
|
--- @return table { quelle, lizenz, name, gruppe }
|
|
function Admin.Auth.Handelnder(quelle)
|
|
return {
|
|
quelle = quelle,
|
|
lizenz = Admin.Auth.Lizenz(quelle),
|
|
name = Admin.Auth.Name(quelle),
|
|
gruppe = Admin.Auth.Gruppe(quelle),
|
|
}
|
|
end
|
|
|
|
-- Cache aufräumen, wenn jemand geht
|
|
AddEventHandler('playerDropped', function()
|
|
gruppeCache[source] = nil
|
|
end)
|