1
0
Fork 0
forked from Simnation/Main

Update main.lua

This commit is contained in:
Nordi98 2025-08-04 08:51:13 +02:00
parent 21fc21b9d6
commit 1d24782e8d

View file

@ -97,7 +97,19 @@ CreateThread(function()
end end
end) end)
-- Lizenz aus Datenbank abrufen -- Spieler-Name aus JSON extrahieren (MariaDB-kompatibel)
local function extractPlayerName(charinfo_json)
if not charinfo_json then return "Unbekannt" end
local success, charinfo = pcall(json.decode, charinfo_json)
if success and charinfo and charinfo.firstname and charinfo.lastname then
return charinfo.firstname .. " " .. charinfo.lastname
end
return "Unbekannt"
end
-- Lizenz aus Datenbank abrufen (KORRIGIERT für MariaDB)
local function getLicenseFromDB(citizenid, licenseType) local function getLicenseFromDB(citizenid, licenseType)
debugPrint("=== getLicenseFromDB START ===") debugPrint("=== getLicenseFromDB START ===")
debugPrint("CitizenID: " .. tostring(citizenid)) debugPrint("CitizenID: " .. tostring(citizenid))
@ -109,11 +121,11 @@ local function getLicenseFromDB(citizenid, licenseType)
return cached return cached
end end
-- MariaDB-kompatible Query ohne JSON-Operatoren
local query = [[ local query = [[
SELECT pl.*, SELECT pl.*,
CONCAT(p.charinfo->>'$.firstname', ' ', p.charinfo->>'$.lastname') as holder_name, p.charinfo as holder_charinfo,
pi.charinfo->>'$.firstname' as issued_by_firstname, pi.charinfo as issued_by_charinfo
pi.charinfo->>'$.lastname' as issued_by_lastname
FROM player_licenses pl FROM player_licenses pl
LEFT JOIN players p ON p.citizenid = pl.citizenid LEFT JOIN players p ON p.citizenid = pl.citizenid
LEFT JOIN players pi ON pi.citizenid = pl.issued_by LEFT JOIN players pi ON pi.citizenid = pl.issued_by
@ -127,10 +139,12 @@ local function getLicenseFromDB(citizenid, licenseType)
if result and #result > 0 then if result and #result > 0 then
local license = result[1] local license = result[1]
-- Issued by Name zusammensetzen -- Namen aus JSON extrahieren
if license.issued_by_firstname and license.issued_by_lastname then license.holder_name = extractPlayerName(license.holder_charinfo)
license.issued_by_name = license.issued_by_firstname .. " " .. license.issued_by_lastname license.issued_by_name = extractPlayerName(license.issued_by_charinfo)
else
-- Fallback für issued_by_name
if license.issued_by_name == "Unbekannt" then
license.issued_by_name = "System" license.issued_by_name = "System"
end end
@ -146,6 +160,10 @@ local function getLicenseFromDB(citizenid, licenseType)
license.classes = {} license.classes = {}
end end
-- Cleanup - charinfo nicht mehr benötigt
license.holder_charinfo = nil
license.issued_by_charinfo = nil
debugPrint("Lizenz aus DB geladen: " .. license.license_type) debugPrint("Lizenz aus DB geladen: " .. license.license_type)
-- In Cache speichern -- In Cache speichern
@ -158,16 +176,16 @@ local function getLicenseFromDB(citizenid, licenseType)
return nil return nil
end end
-- Alle Lizenzen eines Spielers abrufen -- Alle Lizenzen eines Spielers abrufen (KORRIGIERT für MariaDB)
local function getAllPlayerLicenses(citizenid) local function getAllPlayerLicenses(citizenid)
debugPrint("=== getAllPlayerLicenses START ===") debugPrint("=== getAllPlayerLicenses START ===")
debugPrint("CitizenID: " .. tostring(citizenid)) debugPrint("CitizenID: " .. tostring(citizenid))
-- MariaDB-kompatible Query
local query = [[ local query = [[
SELECT pl.*, SELECT pl.*,
CONCAT(p.charinfo->>'$.firstname', ' ', p.charinfo->>'$.lastname') as holder_name, p.charinfo as holder_charinfo,
pi.charinfo->>'$.firstname' as issued_by_firstname, pi.charinfo as issued_by_charinfo
pi.charinfo->>'$.lastname' as issued_by_lastname
FROM player_licenses pl FROM player_licenses pl
LEFT JOIN players p ON p.citizenid = pl.citizenid LEFT JOIN players p ON p.citizenid = pl.citizenid
LEFT JOIN players pi ON pi.citizenid = pl.issued_by LEFT JOIN players pi ON pi.citizenid = pl.issued_by
@ -186,10 +204,12 @@ local function getAllPlayerLicenses(citizenid)
if not seenTypes[license.license_type] then if not seenTypes[license.license_type] then
seenTypes[license.license_type] = true seenTypes[license.license_type] = true
-- Issued by Name zusammensetzen -- Namen aus JSON extrahieren
if license.issued_by_firstname and license.issued_by_lastname then license.holder_name = extractPlayerName(license.holder_charinfo)
license.issued_by_name = license.issued_by_firstname .. " " .. license.issued_by_lastname license.issued_by_name = extractPlayerName(license.issued_by_charinfo)
else
-- Fallback für issued_by_name
if license.issued_by_name == "Unbekannt" then
license.issued_by_name = "System" license.issued_by_name = "System"
end end
@ -205,6 +225,10 @@ local function getAllPlayerLicenses(citizenid)
license.classes = {} license.classes = {}
end end
-- Cleanup
license.holder_charinfo = nil
license.issued_by_charinfo = nil
table.insert(licenses, license) table.insert(licenses, license)
end end
end end
@ -230,13 +254,13 @@ local function saveLicenseToDB(citizenid, licenseType, issuedBy, classes)
return false return false
end end
-- Spieler-Name für das name-Feld abrufen -- Spieler-Name für das name-Feld abrufen (MariaDB-kompatibel)
local holderQuery = "SELECT CONCAT(charinfo->>'$.firstname', ' ', charinfo->>'$.lastname') as name FROM players WHERE citizenid = ?" local holderQuery = "SELECT charinfo FROM players WHERE citizenid = ?"
local holderResult = MySQL.query.await(holderQuery, {citizenid}) local holderResult = MySQL.query.await(holderQuery, {citizenid})
local holderName = "Unbekannt" local holderName = "Unbekannt"
if holderResult and #holderResult > 0 and holderResult[1].name then if holderResult and #holderResult > 0 and holderResult[1].charinfo then
holderName = holderResult[1].name holderName = extractPlayerName(holderResult[1].charinfo)
end end
-- Datum berechnen -- Datum berechnen
@ -255,7 +279,7 @@ local function saveLicenseToDB(citizenid, licenseType, issuedBy, classes)
local deactivateQuery = "UPDATE player_licenses SET is_active = 0 WHERE citizenid = ? AND license_type = ?" local deactivateQuery = "UPDATE player_licenses SET is_active = 0 WHERE citizenid = ? AND license_type = ?"
MySQL.query.await(deactivateQuery, {citizenid, licenseType}) MySQL.query.await(deactivateQuery, {citizenid, licenseType})
-- Neue Lizenz einfügen (MIT name-Feld) -- Neue Lizenz einfügen
local insertQuery = [[ local insertQuery = [[
INSERT INTO player_licenses INSERT INTO player_licenses
(citizenid, license_type, name, issue_date, expire_date, issued_by, is_active, classes, created_at) (citizenid, license_type, name, issue_date, expire_date, issued_by, is_active, classes, created_at)
@ -265,7 +289,7 @@ local function saveLicenseToDB(citizenid, licenseType, issuedBy, classes)
local insertData = { local insertData = {
citizenid, citizenid,
licenseType, licenseType,
holderName, -- HINZUGEFÜGT: name-Feld holderName,
issueDate, issueDate,
expireDate, expireDate,
issuedBy, issuedBy,
@ -277,9 +301,9 @@ local function saveLicenseToDB(citizenid, licenseType, issuedBy, classes)
debugPrint("Führe INSERT-Query aus...") debugPrint("Führe INSERT-Query aus...")
debugPrint("Daten: " .. json.encode(insertData)) debugPrint("Daten: " .. json.encode(insertData))
local result = MySQL.insert.await(insertQuery, insertData) local success, result = pcall(MySQL.insert.await, insertQuery, insertData)
if result then if success and result then
debugPrint("Lizenz erfolgreich gespeichert. ID: " .. result) debugPrint("Lizenz erfolgreich gespeichert. ID: " .. result)
-- Cache invalidieren -- Cache invalidieren
@ -288,7 +312,7 @@ local function saveLicenseToDB(citizenid, licenseType, issuedBy, classes)
return true return true
else else
debugPrint("^1Fehler beim Speichern der Lizenz^7") debugPrint("^1Fehler beim Speichern der Lizenz: " .. tostring(result) .. "^7")
return false return false
end end
end end
@ -300,9 +324,9 @@ local function revokeLicenseInDB(citizenid, licenseType)
debugPrint("LicenseType: " .. tostring(licenseType)) debugPrint("LicenseType: " .. tostring(licenseType))
local query = "UPDATE player_licenses SET is_active = 0 WHERE citizenid = ? AND license_type = ? AND is_active = 1" local query = "UPDATE player_licenses SET is_active = 0 WHERE citizenid = ? AND license_type = ? AND is_active = 1"
local result = MySQL.query.await(query, {citizenid, licenseType}) local success, result = pcall(MySQL.query.await, query, {citizenid, licenseType})
if result then if success and result then
debugPrint("Lizenz erfolgreich entzogen") debugPrint("Lizenz erfolgreich entzogen")
-- Cache invalidieren -- Cache invalidieren
@ -311,11 +335,22 @@ local function revokeLicenseInDB(citizenid, licenseType)
return true return true
else else
debugPrint("^1Fehler beim Entziehen der Lizenz^7") debugPrint("^1Fehler beim Entziehen der Lizenz: " .. tostring(result) .. "^7")
return false return false
end end
end end
-- Erweiterte Fehlerbehandlung für Datenbankoperationen
local function safeDBOperation(operation, errorMessage)
local success, result = pcall(operation)
if not success then
debugPrint("^1DB-Fehler: " .. (errorMessage or "Unbekannt") .. "^7")
debugPrint("^1Details: " .. tostring(result) .. "^7")
return nil
end
return result
end
-- EVENT HANDLER: Lizenz anfordern -- EVENT HANDLER: Lizenz anfordern
RegisterNetEvent('license-system:server:requestLicense', function(targetId) RegisterNetEvent('license-system:server:requestLicense', function(targetId)
local src = source local src = source
@ -340,7 +375,10 @@ RegisterNetEvent('license-system:server:requestLicense', function(targetId)
-- Erste verfügbare Lizenz finden -- Erste verfügbare Lizenz finden
local foundLicense = nil local foundLicense = nil
for licenseType, _ in pairs(Config.LicenseTypes) do for licenseType, _ in pairs(Config.LicenseTypes) do
local license = getLicenseFromDB(citizenid, licenseType) local license = safeDBOperation(function()
return getLicenseFromDB(citizenid, licenseType)
end, "Fehler beim Abrufen der Lizenz")
if license and license.is_active == 1 then if license and license.is_active == 1 then
foundLicense = { foundLicense = {
license = license, license = license,
@ -373,7 +411,9 @@ RegisterNetEvent('license-system:server:requestMyLicense', function(licenseType)
end end
local citizenid = Player.PlayerData.citizenid local citizenid = Player.PlayerData.citizenid
local license = getLicenseFromDB(citizenid, licenseType) local license = safeDBOperation(function()
return getLicenseFromDB(citizenid, licenseType)
end, "Fehler beim Abrufen der eigenen Lizenz")
if license and license.is_active == 1 then if license and license.is_active == 1 then
local licenseData = { local licenseData = {
@ -409,7 +449,10 @@ RegisterNetEvent('license-system:server:requestPlayerLicenses', function(targetI
local citizenid = targetPlayer.PlayerData.citizenid local citizenid = targetPlayer.PlayerData.citizenid
local targetName = getPlayerName(targetId) local targetName = getPlayerName(targetId)
local licenses = getAllPlayerLicenses(citizenid)
local licenses = safeDBOperation(function()
return getAllPlayerLicenses(citizenid)
end, "Fehler beim Abrufen aller Spieler-Lizenzen") or {}
debugPrint("Sende " .. #licenses .. " Lizenzen für " .. targetName) debugPrint("Sende " .. #licenses .. " Lizenzen für " .. targetName)
TriggerClientEvent('license-system:client:receivePlayerLicenses', src, licenses, targetId, targetName) TriggerClientEvent('license-system:client:receivePlayerLicenses', src, licenses, targetId, targetName)
@ -444,7 +487,10 @@ RegisterNetEvent('license-system:server:issueLicense', function(targetId, licens
local issuerCitizenId = issuerPlayer.PlayerData.citizenid local issuerCitizenId = issuerPlayer.PlayerData.citizenid
-- Prüfen ob Lizenz bereits existiert -- Prüfen ob Lizenz bereits existiert
local existingLicense = getLicenseFromDB(targetCitizenId, licenseType) local existingLicense = safeDBOperation(function()
return getLicenseFromDB(targetCitizenId, licenseType)
end, "Fehler beim Prüfen bestehender Lizenz")
if existingLicense and existingLicense.is_active == 1 then if existingLicense and existingLicense.is_active == 1 then
debugPrint("Lizenz bereits vorhanden und aktiv") debugPrint("Lizenz bereits vorhanden und aktiv")
TriggerClientEvent('QBCore:Notify', src, 'Spieler hat bereits eine aktive ' .. (Config.LicenseTypes[licenseType].label or licenseType) .. '!', 'error') TriggerClientEvent('QBCore:Notify', src, 'Spieler hat bereits eine aktive ' .. (Config.LicenseTypes[licenseType].label or licenseType) .. '!', 'error')
@ -466,7 +512,9 @@ RegisterNetEvent('license-system:server:issueLicense', function(targetId, licens
end end
-- Lizenz in Datenbank speichern -- Lizenz in Datenbank speichern
local success = saveLicenseToDB(targetCitizenId, licenseType, issuerCitizenId, classes) local success = safeDBOperation(function()
return saveLicenseToDB(targetCitizenId, licenseType, issuerCitizenId, classes)
end, "Fehler beim Speichern der Lizenz")
if success then if success then
local targetName = getPlayerName(targetId) local targetName = getPlayerName(targetId)
@ -512,7 +560,9 @@ RegisterNetEvent('license-system:server:revokeLicense', function(targetId, licen
local targetCitizenId = targetPlayer.PlayerData.citizenid local targetCitizenId = targetPlayer.PlayerData.citizenid
-- Lizenz entziehen -- Lizenz entziehen
local success = revokeLicenseInDB(targetCitizenId, licenseType) local success = safeDBOperation(function()
return revokeLicenseInDB(targetCitizenId, licenseType)
end, "Fehler beim Entziehen der Lizenz")
if success then if success then
local targetName = getPlayerName(targetId) local targetName = getPlayerName(targetId)
@ -544,53 +594,58 @@ RegisterNetEvent('license-system:server:savePhoto', function(citizenid, photoDat
debugPrint("Source: " .. src .. ", CitizenID: " .. citizenid) debugPrint("Source: " .. src .. ", CitizenID: " .. citizenid)
-- Hier könnte das Foto in der Datenbank oder im Dateisystem gespeichert werden -- Hier könnte das Foto in der Datenbank oder im Dateisystem gespeichert werden
-- Für jetzt loggen wir es nur
debugPrint("Foto-Daten erhalten für: " .. citizenid) debugPrint("Foto-Daten erhalten für: " .. citizenid)
TriggerClientEvent('QBCore:Notify', src, 'Foto gespeichert!', 'success') TriggerClientEvent('QBCore:Notify', src, 'Foto gespeichert!', 'success')
end) end)
-- EXPORT FUNKTIONEN -- EXPORT FUNKTIONEN
-- Prüfen ob Spieler eine bestimmte Lizenz hat
exports('hasLicense', function(citizenid, licenseType) exports('hasLicense', function(citizenid, licenseType)
if not citizenid or not licenseType then return false end if not citizenid or not licenseType then return false end
local license = getLicenseFromDB(citizenid, licenseType) local license = safeDBOperation(function()
return getLicenseFromDB(citizenid, licenseType)
end, "Fehler beim Prüfen der Lizenz")
return license and license.is_active == 1 return license and license.is_active == 1
end) end)
-- Lizenz für Spieler ausstellen (für andere Resources)
exports('issueLicense', function(citizenid, licenseType, issuedBy, classes) exports('issueLicense', function(citizenid, licenseType, issuedBy, classes)
if not citizenid or not licenseType then return false end if not citizenid or not licenseType then return false end
issuedBy = issuedBy or 'system' issuedBy = issuedBy or 'system'
return saveLicenseToDB(citizenid, licenseType, issuedBy, classes) return safeDBOperation(function()
return saveLicenseToDB(citizenid, licenseType, issuedBy, classes)
end, "Fehler beim Ausstellen der Lizenz") or false
end) end)
-- Lizenz entziehen (für andere Resources)
exports('revokeLicense', function(citizenid, licenseType) exports('revokeLicense', function(citizenid, licenseType)
if not citizenid or not licenseType then return false end if not citizenid or not licenseType then return false end
return revokeLicenseInDB(citizenid, licenseType) return safeDBOperation(function()
return revokeLicenseInDB(citizenid, licenseType)
end, "Fehler beim Entziehen der Lizenz") or false
end) end)
-- Alle Lizenzen eines Spielers abrufen (für andere Resources)
exports('getPlayerLicenses', function(citizenid) exports('getPlayerLicenses', function(citizenid)
if not citizenid then return {} end if not citizenid then return {} end
return getAllPlayerLicenses(citizenid) return safeDBOperation(function()
return getAllPlayerLicenses(citizenid)
end, "Fehler beim Abrufen der Spieler-Lizenzen") or {}
end) end)
-- Spezifische Lizenz abrufen (für andere Resources)
exports('getPlayerLicense', function(citizenid, licenseType) exports('getPlayerLicense', function(citizenid, licenseType)
if not citizenid or not licenseType then return nil end if not citizenid or not licenseType then return nil end
return getLicenseFromDB(citizenid, licenseType) return safeDBOperation(function()
return getLicenseFromDB(citizenid, licenseType)
end, "Fehler beim Abrufen der Lizenz")
end) end)
-- INITIALISIERUNG -- INITIALISIERUNG
CreateThread(function() CreateThread(function()
debugPrint("License-System Server gestartet (korrigiert)") debugPrint("License-System Server gestartet (MariaDB-kompatibel)")
-- Warten bis QBCore geladen ist -- Warten bis QBCore geladen ist
while not QBCore do while not QBCore do
@ -600,8 +655,9 @@ CreateThread(function()
debugPrint("QBCore erfolgreich geladen") debugPrint("QBCore erfolgreich geladen")
-- Datenbank-Verbindung testen -- Datenbank-Verbindung testen
local testQuery = "SELECT 1 as test" local testResult = safeDBOperation(function()
local testResult = MySQL.query.await(testQuery) return MySQL.query.await("SELECT 1 as test")
end, "Datenbank-Verbindungstest")
if testResult then if testResult then
debugPrint("Datenbank-Verbindung erfolgreich") debugPrint("Datenbank-Verbindung erfolgreich")
@ -616,18 +672,51 @@ end)
AddEventHandler('onResourceStop', function(resourceName) AddEventHandler('onResourceStop', function(resourceName)
if GetCurrentResourceName() == resourceName then if GetCurrentResourceName() == resourceName then
debugPrint("License-System Server gestoppt") debugPrint("License-System Server gestoppt")
-- Cache leeren
licenseCache = {} licenseCache = {}
end end
end) end)
-- DEBUG COMMAND -- DEBUG COMMANDS
RegisterCommand('licensestats', function(source, args, rawCommand) RegisterCommand('licensestats', function(source, args, rawCommand)
if source == 0 then -- Console only if source == 0 then -- Console only
local cacheCount = 0
for _ in pairs(licenseCache) do
cacheCount = cacheCount + 1
end
print("=== LICENSE SYSTEM STATS ===") print("=== LICENSE SYSTEM STATS ===")
print("Cache Entries: " .. #licenseCache) print("Cache Entries: " .. cacheCount)
print("Config License Types: " .. #Config.LicenseTypes) print("Config License Types: " .. (Config.LicenseTypes and #Config.LicenseTypes or 0))
print("============================") print("============================")
end end
end, true) end, true)
RegisterCommand('licenseclearcache', function(source, args, rawCommand)
if source == 0 then -- Console only
local oldCount = 0
for _ in pairs(licenseCache) do
oldCount = oldCount + 1
end
licenseCache = {}
print("License-Cache geleert. Entfernte Einträge: " .. oldCount)
end
end, true)
-- Erweiterte Logging-Funktion
local function logLicenseAction(action, src, targetId, licenseType, details)
local timestamp = os.date("%Y-%m-%d %H:%M:%S")
local srcName = getPlayerName(src)
local targetName = targetId and getPlayerName(targetId) or "N/A"
local logMessage = string.format(
"[%s] %s | Quelle: %s (%s) | Ziel: %s (%s) | Typ: %s | Details: %s",
timestamp, action, srcName, src, targetName, targetId or "N/A", licenseType or "N/A", details or "N/A"
)
debugPrint("LOG: " .. logMessage)
-- Hier könnte das Log in eine Datei oder Datenbank geschrieben werden
end
debugPrint("License-System Server vollständig geladen (MariaDB-kompatibel)")