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

89 lines
3.5 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =====================================================================
-- aether-admin / Modul: Fraktionen
--
-- Mitgliedschaft ergibt sich aus aether_characters.faction. Hier liegen
-- nur die Zusatzangaben (Gehalt, Farbe). Der Payday zahlt das Gehalt an
-- alle Online-Mitglieder über den Core aus.
-- =====================================================================
Admin = Admin or {}
Admin.Kern.Registriere('fraktionen', 'laden', function(handelnder, daten)
local meta = MySQL.query.await(
'SELECT name, gehalt, farbe, aktiv FROM aether_admin_factions ORDER BY name') or {}
-- Mitgliederzahl je Fraktion aus den Charakteren
local zaehl = MySQL.query.await([[
SELECT faction AS name, COUNT(*) AS anzahl
FROM aether_characters WHERE deleted = 0 AND faction IS NOT NULL AND faction <> ''
GROUP BY faction
]]) or {}
local nachName = {}
for _, z in ipairs(zaehl) do nachName[z.name] = tonumber(z.anzahl) end
-- Online-Mitglieder
local online = {}
local alle = exports['aether-core']:HoleAlleSpieler() or {}
for _, d in pairs(alle) do
if d.fraktion then online[d.fraktion] = (online[d.fraktion] or 0) + 1 end
end
for _, f in ipairs(meta) do
f.mitglieder = nachName[f.name] or 0
f.online = online[f.name] or 0
f.aktiv = tonumber(f.aktiv) == 1
end
return { fraktionen = meta, rechte = Admin.Kern.RechteAbbild(handelnder.quelle) }
end)
Admin.Kern.Registriere('fraktionen', 'speichern', function(handelnder, daten)
local name = tostring(daten.name or ''):sub(1, 48)
if #name < 2 then return nil, 'Bitte einen Namen angeben.' end
local gehalt = math.max(0, math.floor(tonumber(daten.gehalt) or 0))
local farbe = tostring(daten.farbe or '#34d39a'):sub(1, 9)
MySQL.prepare.await([[
INSERT INTO aether_admin_factions (name, gehalt, farbe) VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE gehalt = VALUES(gehalt), farbe = VALUES(farbe)
]], { name, gehalt, farbe })
Admin.Log.Schreibe(handelnder, 'Fraktion gespeichert', name, gehalt .. ' €/h')
return { ok = true }
end)
Admin.Kern.Registriere('fraktionen', 'loeschen', function(handelnder, daten)
local name = tostring(daten.name or '')
if name == '' then return nil, 'Keine Fraktion angegeben.' end
MySQL.update.await('DELETE FROM aether_admin_factions WHERE name = ?', { name })
-- Mitgliedschaft der Charaktere lösen
MySQL.update.await(
'UPDATE aether_characters SET faction = NULL WHERE faction = ?', { name })
Admin.Log.Schreibe(handelnder, 'Fraktion gelöscht', name)
return { ok = true }
end)
Admin.Kern.Registriere('fraktionen', 'payday', function(handelnder, daten)
local name = tostring(daten.name or '')
local zeilen = MySQL.query.await(
'SELECT gehalt FROM aether_admin_factions WHERE name = ?', { name })
if not zeilen or not zeilen[1] then return nil, 'Fraktion nicht gefunden.' end
local gehalt = tonumber(zeilen[1].gehalt) or 0
if gehalt <= 0 then return nil, 'Diese Fraktion zahlt kein Gehalt.' end
local anzahl = 0
local alle = exports['aether-core']:HoleAlleSpieler() or {}
for serverId, d in pairs(alle) do
if d.fraktion == name then
exports['aether-core']:FuegeGeldHinzu(tonumber(serverId), 'bank', gehalt,
'Payday ' .. name)
anzahl = anzahl + 1
end
end
Admin.Log.Schreibe(handelnder, 'Payday', name, anzahl .. ' × ' .. gehalt .. ' €')
return { ok = true, anzahl = anzahl }
end)