forked from Simnation/Main
ed
This commit is contained in:
parent
a44c08fe7e
commit
4f3cd097a2
7 changed files with 1208 additions and 0 deletions
292
resources/[tools]/nordi_license/server/main.lua
Normal file
292
resources/[tools]/nordi_license/server/main.lua
Normal file
|
@ -0,0 +1,292 @@
|
|||
local QBCore = exports['qb-core']:GetCoreObject()
|
||||
|
||||
-- Datenbank Setup
|
||||
MySQL.ready(function()
|
||||
MySQL.Async.execute([[
|
||||
CREATE TABLE IF NOT EXISTS player_licenses (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
citizenid VARCHAR(50) NOT NULL,
|
||||
license_type VARCHAR(50) NOT NULL,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
birthday VARCHAR(20),
|
||||
gender VARCHAR(20),
|
||||
issue_date VARCHAR(20) NOT NULL,
|
||||
expire_date VARCHAR(20),
|
||||
classes TEXT,
|
||||
issued_by VARCHAR(50) NOT NULL,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX(citizenid),
|
||||
INDEX(license_type)
|
||||
)
|
||||
]])
|
||||
end)
|
||||
|
||||
-- Command registrieren
|
||||
QBCore.Commands.Add(Config.Command, 'Öffne das Lizenz-Menü', {}, false, function(source, args)
|
||||
TriggerClientEvent('license-system:client:openMenu', source)
|
||||
end)
|
||||
|
||||
-- Events
|
||||
RegisterNetEvent('license-system:server:getLicenses', function()
|
||||
local src = source
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
if not Player then return end
|
||||
|
||||
MySQL.Async.fetchAll('SELECT * FROM player_licenses WHERE citizenid = ?', {
|
||||
Player.PlayerData.citizenid
|
||||
}, function(result)
|
||||
TriggerClientEvent('license-system:client:receiveLicenses', src, result)
|
||||
end)
|
||||
end)
|
||||
|
||||
RegisterNetEvent('license-system:server:getNearbyPlayers', function()
|
||||
local src = source
|
||||
TriggerClientEvent('license-system:client:receiveNearbyPlayers', src, QBCore.Functions.GetPlayers())
|
||||
end)
|
||||
|
||||
RegisterNetEvent('license-system:server:showLicense', function(targetId, licenseData)
|
||||
local src = source
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
if not Player then return end
|
||||
|
||||
TriggerClientEvent('license-system:client:viewLicense', targetId, licenseData, Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname)
|
||||
end)
|
||||
|
||||
RegisterNetEvent('license-system:server:issueLicense', function(targetId, licenseType, licenseData)
|
||||
local src = source
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
local TargetPlayer = QBCore.Functions.GetPlayer(targetId)
|
||||
|
||||
if not Player or not TargetPlayer then return end
|
||||
|
||||
-- Job-Berechtigung prüfen
|
||||
local playerJob = Player.PlayerData.job.name
|
||||
if not Config.AuthorizedJobs[playerJob] or not hasPermission(Config.AuthorizedJobs[playerJob].canIssue, licenseType) then
|
||||
TriggerClientEvent('QBCore:Notify', src, 'Du hast keine Berechtigung für diese Aktion!', 'error')
|
||||
return
|
||||
end
|
||||
|
||||
-- Lizenz in Datenbank speichern
|
||||
MySQL.Async.execute('INSERT INTO player_licenses (citizenid, license_type, name, birthday, gender, issue_date, expire_date, classes, issued_by) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', {
|
||||
TargetPlayer.PlayerData.citizenid,
|
||||
licenseType,
|
||||
licenseData.name,
|
||||
licenseData.birthday,
|
||||
licenseData.gender,
|
||||
licenseData.issue_date,
|
||||
licenseData.expire_date,
|
||||
json.encode(licenseData.classes or {}),
|
||||
Player.PlayerData.citizenid
|
||||
}, function(insertId)
|
||||
if insertId then
|
||||
TriggerClientEvent('QBCore:Notify', src, 'Lizenz erfolgreich ausgestellt!', 'success')
|
||||
TriggerClientEvent('QBCore:Notify', targetId, 'Du hast eine neue Lizenz erhalten: ' .. Config.Licenses[licenseType].label, 'success')
|
||||
else
|
||||
TriggerClientEvent('QBCore:Notify', src, 'Fehler beim Ausstellen der Lizenz!', 'error')
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
RegisterNetEvent('license-system:server:revokeLicense', function(targetId, licenseId)
|
||||
local src = source
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
|
||||
if not Player then return end
|
||||
|
||||
-- Job-Berechtigung prüfen
|
||||
local playerJob = Player.PlayerData.job.name
|
||||
if not Config.AuthorizedJobs[playerJob] then
|
||||
TriggerClientEvent('QBCore:Notify', src, 'Du hast keine Berechtigung für diese Aktion!', 'error')
|
||||
return
|
||||
end
|
||||
|
||||
MySQL.Async.execute('UPDATE player_licenses SET is_active = FALSE WHERE id = ?', {
|
||||
licenseId
|
||||
}, function(affectedRows)
|
||||
if affectedRows > 0 then
|
||||
TriggerClientEvent('QBCore:Notify', src, 'Lizenz erfolgreich entzogen!', 'success')
|
||||
if targetId then
|
||||
TriggerClientEvent('QBCore:Notify', targetId, 'Eine deiner Lizenzen wurde entzogen!', 'error')
|
||||
end
|
||||
else
|
||||
TriggerClientEvent('QBCore:Notify', src, 'Fehler beim Entziehen der Lizenz!', 'error')
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
RegisterNetEvent('license-system:server:restoreLicense', function(targetId, licenseId)
|
||||
local src = source
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
|
||||
if not Player then return end
|
||||
|
||||
-- Job-Berechtigung prüfen
|
||||
local playerJob = Player.PlayerData.job.name
|
||||
if not Config.AuthorizedJobs[playerJob] then
|
||||
TriggerClientEvent('QBCore:Notify', src, 'Du hast keine Berechtigung für diese Aktion!', 'error')
|
||||
return
|
||||
end
|
||||
|
||||
MySQL.Async.execute('UPDATE player_licenses SET is_active = TRUE WHERE id = ?', {
|
||||
licenseId
|
||||
}, function(affectedRows)
|
||||
if affectedRows > 0 then
|
||||
TriggerClientEvent('QBCore:Notify', src, 'Lizenz erfolgreich wiederhergestellt!', 'success')
|
||||
if targetId then
|
||||
TriggerClientEvent('QBCore:Notify', targetId, 'Eine deiner Lizenzen wurde wiederhergestellt!', 'success')
|
||||
end
|
||||
else
|
||||
TriggerClientEvent('QBCore:Notify', src, 'Fehler beim Wiederherstellen der Lizenz!', 'error')
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
-- Hilfsfunktionen
|
||||
function hasPermission(permissions, licenseType)
|
||||
for _, permission in ipairs(permissions) do
|
||||
if permission == licenseType then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Erweiterte Funktionen für Lizenzverwaltung
|
||||
|
||||
RegisterNetEvent('license-system:server:searchPlayer', function(searchTerm)
|
||||
local src = source
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
|
||||
if not Player then return end
|
||||
|
||||
-- Job-Berechtigung prüfen
|
||||
local playerJob = Player.PlayerData.job.name
|
||||
if not Config.AuthorizedJobs[playerJob] then
|
||||
TriggerClientEvent('QBCore:Notify', src, 'Du hast keine Berechtigung für diese Aktion!', 'error')
|
||||
return
|
||||
end
|
||||
|
||||
-- Spieler suchen
|
||||
MySQL.Async.fetchAll('SELECT citizenid, charinfo FROM players WHERE JSON_EXTRACT(charinfo, "$.firstname") LIKE ? OR JSON_EXTRACT(charinfo, "$.lastname") LIKE ? LIMIT 10', {
|
||||
'%' .. searchTerm .. '%',
|
||||
'%' .. searchTerm .. '%'
|
||||
}, function(result)
|
||||
local players = {}
|
||||
for _, player in ipairs(result) do
|
||||
local charinfo = json.decode(player.charinfo)
|
||||
table.insert(players, {
|
||||
citizenid = player.citizenid,
|
||||
name = charinfo.firstname .. ' ' .. charinfo.lastname
|
||||
})
|
||||
end
|
||||
TriggerClientEvent('license-system:client:receiveSearchResults', src, players)
|
||||
end)
|
||||
end)
|
||||
|
||||
RegisterNetEvent('license-system:server:getPlayerLicenses', function(citizenid)
|
||||
local src = source
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
|
||||
if not Player then return end
|
||||
|
||||
-- Job-Berechtigung prüfen
|
||||
local playerJob = Player.PlayerData.job.name
|
||||
if not Config.AuthorizedJobs[playerJob] then
|
||||
TriggerClientEvent('QBCore:Notify', src, 'Du hast keine Berechtigung für diese Aktion!', 'error')
|
||||
return
|
||||
end
|
||||
|
||||
MySQL.Async.fetchAll('SELECT * FROM player_licenses WHERE citizenid = ? ORDER BY created_at DESC', {
|
||||
citizenid
|
||||
}, function(result)
|
||||
TriggerClientEvent('license-system:client:receivePlayerLicenses', src, result, citizenid)
|
||||
end)
|
||||
end)
|
||||
|
||||
-- Lizenz-Historie hinzufügen
|
||||
function addLicenseHistory(licenseId, action, performedBy, performedByName, reason)
|
||||
MySQL.Async.execute('INSERT INTO license_history (license_id, action, performed_by, performed_by_name, reason) VALUES (?, ?, ?, ?, ?)', {
|
||||
licenseId,
|
||||
action,
|
||||
performedBy,
|
||||
performedByName,
|
||||
reason or ''
|
||||
})
|
||||
end
|
||||
|
||||
-- Erweiterte Revoke-Funktion mit Grund
|
||||
RegisterNetEvent('license-system:server:revokeLicenseWithReason', function(licenseId, reason)
|
||||
local src = source
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
|
||||
if not Player then return end
|
||||
|
||||
local playerJob = Player.PlayerData.job.name
|
||||
if not Config.AuthorizedJobs[playerJob] then
|
||||
TriggerClientEvent('QBCore:Notify', src, 'Du hast keine Berechtigung für diese Aktion!', 'error')
|
||||
return
|
||||
end
|
||||
|
||||
local playerName = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname
|
||||
|
||||
MySQL.Async.execute('UPDATE player_licenses SET is_active = FALSE, revoked_by = ?, revoked_by_name = ?, revoked_date = NOW(), revoked_reason = ? WHERE id = ?', {
|
||||
Player.PlayerData.citizenid,
|
||||
playerName,
|
||||
reason,
|
||||
licenseId
|
||||
}, function(affectedRows)
|
||||
if affectedRows > 0 then
|
||||
addLicenseHistory(licenseId, 'revoked', Player.PlayerData.citizenid, playerName, reason)
|
||||
TriggerClientEvent('QBCore:Notify', src, 'Lizenz erfolgreich entzogen!', 'success')
|
||||
else
|
||||
TriggerClientEvent('QBCore:Notify', src, 'Fehler beim Entziehen der Lizenz!', 'error')
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
-- Automatische Lizenz-Überprüfung (läuft alle 24 Stunden)
|
||||
CreateThread(function()
|
||||
while true do
|
||||
Wait(24 * 60 * 60 * 1000) -- 24 Stunden
|
||||
|
||||
-- Abgelaufene Lizenzen deaktivieren
|
||||
MySQL.Async.execute('UPDATE player_licenses SET is_active = FALSE WHERE expire_date < CURDATE() AND is_active = TRUE', {}, function(affectedRows)
|
||||
if affectedRows > 0 then
|
||||
print('^3[License-System]^7 ' .. affectedRows .. ' abgelaufene Lizenzen wurden deaktiviert.')
|
||||
end
|
||||
end)
|
||||
end
|
||||
end)
|
||||
|
||||
-- Export-Funktionen für andere Ressourcen
|
||||
exports('hasLicense', function(citizenid, licenseType)
|
||||
local result = MySQL.Sync.fetchScalar('SELECT COUNT(*) FROM player_licenses WHERE citizenid = ? AND license_type = ? AND is_active = TRUE', {
|
||||
citizenid, licenseType
|
||||
})
|
||||
return result > 0
|
||||
end)
|
||||
|
||||
exports('getLicenses', function(citizenid)
|
||||
return MySQL.Sync.fetchAll('SELECT * FROM player_licenses WHERE citizenid = ? AND is_active = TRUE', {
|
||||
citizenid
|
||||
})
|
||||
end)
|
||||
|
||||
exports('hasLicenseClass', function(citizenid, class)
|
||||
local result = MySQL.Sync.fetchAll('SELECT classes FROM player_licenses WHERE citizenid = ? AND license_type = "drivers_license" AND is_active = TRUE', {
|
||||
citizenid
|
||||
})
|
||||
|
||||
for _, license in ipairs(result) do
|
||||
if license.classes then
|
||||
local classes = json.decode(license.classes)
|
||||
for _, licenseClass in ipairs(classes) do
|
||||
if licenseClass == class then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return false
|
||||
end)
|
Loading…
Add table
Add a link
Reference in a new issue