- 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>
60 lines
2.4 KiB
Lua
60 lines
2.4 KiB
Lua
-- =====================================================================
|
|
-- aether-admin / Modul: Bans & Verwarnungen
|
|
--
|
|
-- Die Durchsetzung der Bans liegt in aether_users (der Core sperrt
|
|
-- darüber beim Connect). Dieses Modul liest den Verlauf, hebt Bans auf
|
|
-- und erlaubt manuelle Sperren — auch für Offline-Spieler.
|
|
-- =====================================================================
|
|
|
|
Admin = Admin or {}
|
|
|
|
Admin.Kern.Registriere('moderation', 'laden', function(handelnder, daten)
|
|
local bans = Admin.DB.AktiveBans()
|
|
local warns = MySQL.query.await([[
|
|
SELECT id, name, grund, admin_name, erstellt_am
|
|
FROM aether_admin_warns ORDER BY id DESC LIMIT 100
|
|
]]) or {}
|
|
return {
|
|
bans = bans,
|
|
warns = warns,
|
|
rechte = Admin.Kern.RechteAbbild(handelnder.quelle),
|
|
}
|
|
end)
|
|
|
|
Admin.Kern.Registriere('moderation', 'unban', function(handelnder, daten)
|
|
local banId = tonumber(daten.id)
|
|
if not banId then return nil, 'Ungültige Kennung.' end
|
|
if not Admin.DB.Entsperre(banId, handelnder.name) then
|
|
return nil, 'Bann nicht gefunden oder bereits aufgehoben.'
|
|
end
|
|
Admin.Log.Schreibe(handelnder, 'Entbannt', nil, 'Ban #' .. banId)
|
|
return { ok = true }
|
|
end)
|
|
|
|
Admin.Kern.Registriere('moderation', 'warnWeg', function(handelnder, daten)
|
|
local warnId = tonumber(daten.id)
|
|
if not warnId then return nil, 'Ungültige Kennung.' end
|
|
MySQL.update.await('DELETE FROM aether_admin_warns WHERE id = ?', { warnId })
|
|
Admin.Log.Schreibe(handelnder, 'Verwarnung gelöscht', nil, 'Warn #' .. warnId)
|
|
return { ok = true }
|
|
end)
|
|
|
|
Admin.Kern.Registriere('moderation', 'banManuell', function(handelnder, daten)
|
|
local name = tostring(daten.name or ''):sub(1, 64)
|
|
if #name < 2 then return nil, 'Bitte Name oder Kennung angeben.' end
|
|
|
|
local grund = tostring(daten.grund or 'Regelbruch'):sub(1, 255)
|
|
local dauer = tostring(daten.dauer or 'permanent')
|
|
local bis = Admin.BerechneBanEnde(dauer)
|
|
|
|
-- Sieht die Kennung wie eine Lizenz aus, wird direkt gesperrt (greift beim Connect)
|
|
local lizenz = daten.lizenz and tostring(daten.lizenz) or nil
|
|
if not lizenz and name:match('^%x%x%x%x%x%x%x%x') and #name >= 32 then
|
|
lizenz = name
|
|
end
|
|
|
|
Admin.DB.Sperre(lizenz, name, grund, bis, handelnder.lizenz, handelnder.name)
|
|
Admin.Log.Schreibe(handelnder, 'Manueller Ban (' .. dauer .. ')', name, grund)
|
|
return { ok = true }
|
|
end)
|