aether-framework/resources/[aether]/aether-admin/server/module/moderation.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

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)