- 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>
89 lines
3.5 KiB
Lua
89 lines
3.5 KiB
Lua
-- =====================================================================
|
||
-- 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)
|