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)
-- 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)
debugPrint("=== getLicenseFromDB START ===")
debugPrint("CitizenID: " .. tostring(citizenid))
@ -109,11 +121,11 @@ local function getLicenseFromDB(citizenid, licenseType)
return cached
end
-- MariaDB-kompatible Query ohne JSON-Operatoren
local query = [[
SELECT pl.*,
CONCAT(p.charinfo->>'$.firstname', ' ', p.charinfo->>'$.lastname') as holder_name,
pi.charinfo->>'$.firstname' as issued_by_firstname,
pi.charinfo->>'$.lastname' as issued_by_lastname
p.charinfo as holder_charinfo,
pi.charinfo as issued_by_charinfo
FROM player_licenses pl
LEFT JOIN players p ON p.citizenid = pl.citizenid
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
local license = result[1]
-- Issued by Name zusammensetzen
if license.issued_by_firstname and license.issued_by_lastname then
license.issued_by_name = license.issued_by_firstname .. " " .. license.issued_by_lastname
else
-- Namen aus JSON extrahieren
license.holder_name = extractPlayerName(license.holder_charinfo)
license.issued_by_name = extractPlayerName(license.issued_by_charinfo)
-- Fallback für issued_by_name
if license.issued_by_name == "Unbekannt" then
license.issued_by_name = "System"
end
@ -146,6 +160,10 @@ local function getLicenseFromDB(citizenid, licenseType)
license.classes = {}
end
-- Cleanup - charinfo nicht mehr benötigt
license.holder_charinfo = nil
license.issued_by_charinfo = nil
debugPrint("Lizenz aus DB geladen: " .. license.license_type)
-- In Cache speichern
@ -158,16 +176,16 @@ local function getLicenseFromDB(citizenid, licenseType)
return nil
end
-- Alle Lizenzen eines Spielers abrufen
-- Alle Lizenzen eines Spielers abrufen (KORRIGIERT für MariaDB)
local function getAllPlayerLicenses(citizenid)
debugPrint("=== getAllPlayerLicenses START ===")
debugPrint("CitizenID: " .. tostring(citizenid))
-- MariaDB-kompatible Query
local query = [[
SELECT pl.*,
CONCAT(p.charinfo->>'$.firstname', ' ', p.charinfo->>'$.lastname') as holder_name,
pi.charinfo->>'$.firstname' as issued_by_firstname,
pi.charinfo->>'$.lastname' as issued_by_lastname
p.charinfo as holder_charinfo,
pi.charinfo as issued_by_charinfo
FROM player_licenses pl
LEFT JOIN players p ON p.citizenid = pl.citizenid
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
seenTypes[license.license_type] = true
-- Issued by Name zusammensetzen
if license.issued_by_firstname and license.issued_by_lastname then
license.issued_by_name = license.issued_by_firstname .. " " .. license.issued_by_lastname
else
-- Namen aus JSON extrahieren
license.holder_name = extractPlayerName(license.holder_charinfo)
license.issued_by_name = extractPlayerName(license.issued_by_charinfo)
-- Fallback für issued_by_name
if license.issued_by_name == "Unbekannt" then
license.issued_by_name = "System"
end
@ -205,6 +225,10 @@ local function getAllPlayerLicenses(citizenid)
license.classes = {}
end
-- Cleanup
license.holder_charinfo = nil
license.issued_by_charinfo = nil
table.insert(licenses, license)
end
end
@ -230,13 +254,13 @@ local function saveLicenseToDB(citizenid, licenseType, issuedBy, classes)
return false
end
-- Spieler-Name für das name-Feld abrufen
local holderQuery = "SELECT CONCAT(charinfo->>'$.firstname', ' ', charinfo->>'$.lastname') as name FROM players WHERE citizenid = ?"
-- Spieler-Name für das name-Feld abrufen (MariaDB-kompatibel)
local holderQuery = "SELECT charinfo FROM players WHERE citizenid = ?"
local holderResult = MySQL.query.await(holderQuery, {citizenid})
local holderName = "Unbekannt"
if holderResult and #holderResult > 0 and holderResult[1].name then
holderName = holderResult[1].name
if holderResult and #holderResult > 0 and holderResult[1].charinfo then
holderName = extractPlayerName(holderResult[1].charinfo)
end
-- 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 = ?"
MySQL.query.await(deactivateQuery, {citizenid, licenseType})
-- Neue Lizenz einfügen (MIT name-Feld)
-- Neue Lizenz einfügen
local insertQuery = [[
INSERT INTO player_licenses
(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 = {
citizenid,
licenseType,
holderName, -- HINZUGEFÜGT: name-Feld
holderName,
issueDate,
expireDate,
issuedBy,
@ -277,9 +301,9 @@ local function saveLicenseToDB(citizenid, licenseType, issuedBy, classes)
debugPrint("Führe INSERT-Query aus...")
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)
-- Cache invalidieren
@ -288,7 +312,7 @@ local function saveLicenseToDB(citizenid, licenseType, issuedBy, classes)
return true
else
debugPrint("^1Fehler beim Speichern der Lizenz^7")
debugPrint("^1Fehler beim Speichern der Lizenz: " .. tostring(result) .. "^7")
return false
end
end
@ -300,9 +324,9 @@ local function revokeLicenseInDB(citizenid, licenseType)
debugPrint("LicenseType: " .. tostring(licenseType))
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")
-- Cache invalidieren
@ -311,11 +335,22 @@ local function revokeLicenseInDB(citizenid, licenseType)
return true
else
debugPrint("^1Fehler beim Entziehen der Lizenz^7")
debugPrint("^1Fehler beim Entziehen der Lizenz: " .. tostring(result) .. "^7")
return false
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
RegisterNetEvent('license-system:server:requestLicense', function(targetId)
local src = source
@ -340,7 +375,10 @@ RegisterNetEvent('license-system:server:requestLicense', function(targetId)
-- Erste verfügbare Lizenz finden
local foundLicense = nil
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
foundLicense = {
license = license,
@ -373,7 +411,9 @@ RegisterNetEvent('license-system:server:requestMyLicense', function(licenseType)
end
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
local licenseData = {
@ -409,7 +449,10 @@ RegisterNetEvent('license-system:server:requestPlayerLicenses', function(targetI
local citizenid = targetPlayer.PlayerData.citizenid
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)
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
-- 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
debugPrint("Lizenz bereits vorhanden und aktiv")
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
-- 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
local targetName = getPlayerName(targetId)
@ -512,7 +560,9 @@ RegisterNetEvent('license-system:server:revokeLicense', function(targetId, licen
local targetCitizenId = targetPlayer.PlayerData.citizenid
-- Lizenz entziehen
local success = revokeLicenseInDB(targetCitizenId, licenseType)
local success = safeDBOperation(function()
return revokeLicenseInDB(targetCitizenId, licenseType)
end, "Fehler beim Entziehen der Lizenz")
if success then
local targetName = getPlayerName(targetId)
@ -544,53 +594,58 @@ RegisterNetEvent('license-system:server:savePhoto', function(citizenid, photoDat
debugPrint("Source: " .. src .. ", CitizenID: " .. citizenid)
-- 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)
TriggerClientEvent('QBCore:Notify', src, 'Foto gespeichert!', 'success')
end)
-- EXPORT FUNKTIONEN
-- Prüfen ob Spieler eine bestimmte Lizenz hat
exports('hasLicense', function(citizenid, licenseType)
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
end)
-- Lizenz für Spieler ausstellen (für andere Resources)
exports('issueLicense', function(citizenid, licenseType, issuedBy, classes)
if not citizenid or not licenseType then return false end
issuedBy = issuedBy or 'system'
return safeDBOperation(function()
return saveLicenseToDB(citizenid, licenseType, issuedBy, classes)
end, "Fehler beim Ausstellen der Lizenz") or false
end)
-- Lizenz entziehen (für andere Resources)
exports('revokeLicense', function(citizenid, licenseType)
if not citizenid or not licenseType then return false end
return safeDBOperation(function()
return revokeLicenseInDB(citizenid, licenseType)
end, "Fehler beim Entziehen der Lizenz") or false
end)
-- Alle Lizenzen eines Spielers abrufen (für andere Resources)
exports('getPlayerLicenses', function(citizenid)
if not citizenid then return {} end
return safeDBOperation(function()
return getAllPlayerLicenses(citizenid)
end, "Fehler beim Abrufen der Spieler-Lizenzen") or {}
end)
-- Spezifische Lizenz abrufen (für andere Resources)
exports('getPlayerLicense', function(citizenid, licenseType)
if not citizenid or not licenseType then return nil end
return safeDBOperation(function()
return getLicenseFromDB(citizenid, licenseType)
end, "Fehler beim Abrufen der Lizenz")
end)
-- INITIALISIERUNG
CreateThread(function()
debugPrint("License-System Server gestartet (korrigiert)")
debugPrint("License-System Server gestartet (MariaDB-kompatibel)")
-- Warten bis QBCore geladen ist
while not QBCore do
@ -600,8 +655,9 @@ CreateThread(function()
debugPrint("QBCore erfolgreich geladen")
-- Datenbank-Verbindung testen
local testQuery = "SELECT 1 as test"
local testResult = MySQL.query.await(testQuery)
local testResult = safeDBOperation(function()
return MySQL.query.await("SELECT 1 as test")
end, "Datenbank-Verbindungstest")
if testResult then
debugPrint("Datenbank-Verbindung erfolgreich")
@ -616,18 +672,51 @@ end)
AddEventHandler('onResourceStop', function(resourceName)
if GetCurrentResourceName() == resourceName then
debugPrint("License-System Server gestoppt")
-- Cache leeren
licenseCache = {}
end
end)
-- DEBUG COMMAND
-- DEBUG COMMANDS
RegisterCommand('licensestats', function(source, args, rawCommand)
if source == 0 then -- Console only
local cacheCount = 0
for _ in pairs(licenseCache) do
cacheCount = cacheCount + 1
end
print("=== LICENSE SYSTEM STATS ===")
print("Cache Entries: " .. #licenseCache)
print("Config License Types: " .. #Config.LicenseTypes)
print("Cache Entries: " .. cacheCount)
print("Config License Types: " .. (Config.LicenseTypes and #Config.LicenseTypes or 0))
print("============================")
end
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)")