From ce89ca02347e2f9bb5d3b13092df26524548784c Mon Sep 17 00:00:00 2001 From: Csoki Date: Thu, 24 Nov 2022 23:22:26 +0100 Subject: [PATCH] refactor: esx_identity server side --- [esx]/esx_identity/server/main.lua | 556 +++++++++++++---------------- 1 file changed, 250 insertions(+), 306 deletions(-) diff --git a/[esx]/esx_identity/server/main.lua b/[esx]/esx_identity/server/main.lua index e40cdc8b..5b0f0450 100644 --- a/[esx]/esx_identity/server/main.lua +++ b/[esx]/esx_identity/server/main.lua @@ -17,15 +17,17 @@ local function deleteIdentityFromDatabase(xPlayer) end local function deleteIdentity(xPlayer) - if alreadyRegistered[xPlayer.identifier] then - xPlayer.setName(('%s %s'):format(nil, nil)) - xPlayer.set('firstName', nil) - xPlayer.set('lastName', nil) - xPlayer.set('dateofbirth', nil) - xPlayer.set('sex', nil) - xPlayer.set('height', nil) - deleteIdentityFromDatabase(xPlayer) + if not alreadyRegistered[xPlayer.identifier] then + return end + + xPlayer.setName(('%s %s'):format(nil, nil)) + xPlayer.set('firstName', nil) + xPlayer.set('lastName', nil) + xPlayer.set('dateofbirth', nil) + xPlayer.set('sex', nil) + xPlayer.set('height', nil) + deleteIdentityFromDatabase(xPlayer) end local function saveIdentityToDatabase(identifier, identity) @@ -35,44 +37,28 @@ local function saveIdentityToDatabase(identifier, identity) end local function checkDate(str) - if string.match(str, '(%d%d)/(%d%d)/(%d%d%d%d)') ~= nil then - local d, m, y = string.match(str, '(%d+)/(%d+)/(%d+)') + if not string.match(str, '(%d%d)/(%d%d)/(%d%d%d%d)') then + return false + end + + local d, m, y = string.match(str, '(%d+)/(%d+)/(%d+)') - m = tonumber(m) - d = tonumber(d) - y = tonumber(y) + m = tonumber(m) + d = tonumber(d) + y = tonumber(y) - if ((d <= 0) or (d > 31)) or ((m <= 0) or (m > 12)) or ((y <= Config.LowestYear) or (y > Config.HighestYear)) then - return false - elseif m == 4 or m == 6 or m == 9 or m == 11 then - if d > 30 then - return false - else - return true - end - elseif m == 2 then - if y % 400 == 0 or (y % 100 ~= 0 and y % 4 == 0) then - if d > 29 then - return false - else - return true - end - else - if d > 28 then - return false - else - return true - end - end + if ((d <= 0) or (d > 31)) or ((m <= 0) or (m > 12)) or ((y <= Config.LowestYear) or (y > Config.HighestYear)) then + return false + elseif m == 4 or m == 6 or m == 9 or m == 11 then + return d < 30 + elseif m == 2 then + if y % 400 == 0 or (y % 100 ~= 0 and y % 4 == 0) then + return d < 29 else - if d > 31 then - return false - else - return true - end + return d < 28 end else - return false + return d < 31 end end @@ -98,47 +84,27 @@ local function checkForNumbers(str) end local function checkNameFormat(name) - if not checkAlphanumeric(name) then - if not checkForNumbers(name) then - local stringLength = string.len(name) - if stringLength > 0 and stringLength < Config.MaxNameLength then - return true - else - return false - end - else - return false - end - else - return false + if not checkAlphanumeric(name) and not checkForNumbers(name) then + local stringLength = string.len(name) + return stringLength > 0 and stringLength < Config.MaxNameLength end + + return false end local function checkDOBFormat(dob) local date = tostring(dob) - if checkDate(date) then - return true - else - return false - end + return checkDate(date) end local function checkSexFormat(sex) - if sex == "m" or sex == "M" or sex == "f" or sex == "F" then - return true - else - return false - end + return sex == "m" or sex == "M" or sex == "f" or sex == "F" end local function checkHeightFormat(height) local numHeight = tonumber(height) - if numHeight < Config.MinHeight and numHeight > Config.MaxHeight then - return false - else - return true - end + return numHeight < Config.MinHeight and numHeight > Config.MaxHeight end local function convertToLowerCase(str) @@ -151,8 +117,7 @@ end local function formatName(name) local loweredName = convertToLowerCase(name) - local formattedName = convertFirstLetterToUpper(loweredName) - return formattedName + return convertFirstLetterToUpper(loweredName) end if Config.UseDeferrals then @@ -187,7 +152,7 @@ if Config.UseDeferrals then {"title":"Female","value":"f"}],"style":"expanded","id":"sex"}]},{"type": "ActionSet", "actions": [{"type":"Action.Submit","title":"Submit"}]}], "$schema": "http://adaptivecards.io/schemas/adaptive-card.json","version":"1.0"}]==], - function(data, rawData) + function(data) if data.firstname == '' or data.lastname == '' or data.dateofbirth == '' or data.sex == '' or data.height == '' then deferrals.done(TranslateCap('data_incorrect')) @@ -222,46 +187,36 @@ if Config.UseDeferrals then "placeholder":"Sex","choices":[{"title":"Male","value":"m"},{"title":"Female","value":"f"}], "style":"expanded","id":"sex"}]},{"type": "ActionSet","actions": [{"type":"Action.Submit", "title":"Submit"}]}],"$schema": "http://adaptivecards.io/schemas/adaptive-card.json","version":"1.0"}]==], - function(data, rawData) - if data.firstname == '' or data.lastname == '' or data.dateofbirth == '' or data.sex == - '' or data.height == '' then - deferrals.done(TranslateCap('data_incorrect')) - else - if checkNameFormat(data.firstname) then - if checkNameFormat(data.lastname) then - if checkDOBFormat(data.dateofbirth) then - if checkSexFormat(data.sex) then - if checkHeightFormat(data.height) then - local formattedFirstName = formatName(data.firstname) - local formattedLastName = formatName(data.lastname) - local formattedDate = formatDate(data.dateofbirth) - - playerIdentity[identifier] = { - firstName = formatName(data.firstname), - lastName = formatName(data.lastname), - dateOfBirth = data.dateofbirth, - sex = data.sex, - height = tonumber(data.height), - saveToDatabase = true - } - - deferrals.done() - else - deferrals.done(TranslateCap('invalid_height_format')) - end - else - deferrals.done(TranslateCap('invalid_sex_format')) - end - else - deferrals.done(TranslateCap('invalid_dob_format')) - end - else - deferrals.done(TranslateCap('invalid_lastname_format')) - end - else - deferrals.done(TranslateCap('invalid_firstname_format')) - end + function(data) + if data.firstname == '' or data.lastname == '' or data.dateofbirth == '' or data.sex == '' or data.height == '' then + return deferrals.done(TranslateCap('data_incorrect')) end + if not checkNameFormat(data.firstname) then + return deferrals.done(TranslateCap('invalid_firstname_format')) + end + if not checkNameFormat(data.lastname) then + return deferrals.done(TranslateCap('invalid_lastname_format')) + end + if not checkDOBFormat(data.dateofbirth) then + return deferrals.done(TranslateCap('invalid_dob_format')) + end + if not checkSexFormat(data.sex) then + return deferrals.done(TranslateCap('invalid_sex_format')) + end + if not checkHeightFormat(data.height) then + return deferrals.done(TranslateCap('invalid_height_format')) + end + + playerIdentity[identifier] = { + firstName = formatName(data.firstname), + lastName = formatName(data.lastname), + dateOfBirth = formatDate(data.dateofbirth), + sex = data.sex, + height = tonumber(data.height), + saveToDatabase = true + } + + deferrals.done() end) end end) @@ -272,70 +227,71 @@ if Config.UseDeferrals then RegisterNetEvent('esx:playerLoaded') AddEventHandler('esx:playerLoaded', function(playerId, xPlayer) - if playerIdentity[xPlayer.identifier] then - local currentIdentity = playerIdentity[xPlayer.identifier] - xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName)) - xPlayer.set('firstName', currentIdentity.firstName) - xPlayer.set('lastName', currentIdentity.lastName) - xPlayer.set('dateofbirth', currentIdentity.dateOfBirth) - xPlayer.set('sex', currentIdentity.sex) - xPlayer.set('height', currentIdentity.height) - if currentIdentity.saveToDatabase then - saveIdentityToDatabase(xPlayer.identifier, currentIdentity) - end - - Wait(0) - alreadyRegistered[xPlayer.identifier] = true - TriggerClientEvent('esx_identity:alreadyRegistered', xPlayer.source) - playerIdentity[xPlayer.identifier] = nil - else - xPlayer.kick(_('missing_identity')) + if not playerIdentity[xPlayer.identifier] then + return xPlayer.kick(_('missing_identity')) end + + local currentIdentity = playerIdentity[xPlayer.identifier] + xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName)) + xPlayer.set('firstName', currentIdentity.firstName) + xPlayer.set('lastName', currentIdentity.lastName) + xPlayer.set('dateofbirth', currentIdentity.dateOfBirth) + xPlayer.set('sex', currentIdentity.sex) + xPlayer.set('height', currentIdentity.height) + if currentIdentity.saveToDatabase then + saveIdentityToDatabase(xPlayer.identifier, currentIdentity) + end + + Wait(0) + alreadyRegistered[xPlayer.identifier] = true + TriggerClientEvent('esx_identity:alreadyRegistered', xPlayer.source) + playerIdentity[xPlayer.identifier] = nil end) else local function setIdentity(xPlayer) - if alreadyRegistered[xPlayer.identifier] then - local currentIdentity = playerIdentity[xPlayer.identifier] + if not alreadyRegistered[xPlayer.identifier] then + return + end + local currentIdentity = playerIdentity[xPlayer.identifier] - xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName)) - xPlayer.set('firstName', currentIdentity.firstName) - xPlayer.set('lastName', currentIdentity.lastName) - xPlayer.set('dateofbirth', currentIdentity.dateOfBirth) - xPlayer.set('sex', currentIdentity.sex) - xPlayer.set('height', currentIdentity.height) - TriggerClientEvent('esx_identity:setPlayerData', xPlayer.source, currentIdentity) - if currentIdentity.saveToDatabase then - saveIdentityToDatabase(xPlayer.identifier, currentIdentity) - end + xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName)) + xPlayer.set('firstName', currentIdentity.firstName) + xPlayer.set('lastName', currentIdentity.lastName) + xPlayer.set('dateofbirth', currentIdentity.dateOfBirth) + xPlayer.set('sex', currentIdentity.sex) + xPlayer.set('height', currentIdentity.height) + TriggerClientEvent('esx_identity:setPlayerData', xPlayer.source, currentIdentity) + if currentIdentity.saveToDatabase then + saveIdentityToDatabase(xPlayer.identifier, currentIdentity) + end - playerIdentity[xPlayer.identifier] = nil - end + playerIdentity[xPlayer.identifier] = nil end local function checkIdentity(xPlayer) - MySQL.single('SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = ?', - {xPlayer.identifier}, function(result) - if result then - if result.firstname then - playerIdentity[xPlayer.identifier] = { - firstName = result.firstname, - lastName = result.lastname, - dateOfBirth = result.dateofbirth, - sex = result.sex, - height = result.height - } - - alreadyRegistered[xPlayer.identifier] = true - setIdentity(xPlayer) - else - playerIdentity[xPlayer.identifier] = nil - alreadyRegistered[xPlayer.identifier] = false - TriggerClientEvent('esx_identity:showRegisterIdentity', xPlayer.source) - end - else - TriggerClientEvent('esx_identity:showRegisterIdentity', xPlayer.source) + MySQL.single('SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = ?', {xPlayer.identifier}, + function(result) + if not result then + return TriggerClientEvent('esx_identity:showRegisterIdentity', xPlayer.source) end - end) + if not result.firstname then + playerIdentity[xPlayer.identifier] = nil + alreadyRegistered[xPlayer.identifier] = false + return TriggerClientEvent('esx_identity:showRegisterIdentity', xPlayer.source) + end + + playerIdentity[xPlayer.identifier] = { + firstName = result.firstname, + lastName = result.lastname, + dateOfBirth = result.dateofbirth, + sex = result.sex, + height = result.height + } + + alreadyRegistered[xPlayer.identifier] = true + setIdentity(xPlayer) + end + ) end if not multichar then @@ -344,50 +300,49 @@ else local playerId, identifier = source, ESX.GetIdentifier(source) Wait(40) - if identifier then - MySQL.single('SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = ?', - {identifier}, function(result) - if result then - if result.firstname then - playerIdentity[identifier] = { - firstName = result.firstname, - lastName = result.lastname, - dateOfBirth = result.dateofbirth, - sex = result.sex, - height = result.height - } + if not identifier then + return deferrals.done(TranslateCap('no_identifier')) + end + MySQL.single('SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = ?', {identifier}, + function(result) + if not result then + playerIdentity[identifier] = nil + alreadyRegistered[identifier] = false + return deferrals.done() + end + if not result.firstname then + playerIdentity[identifier] = nil + alreadyRegistered[identifier] = false + return deferrals.done() + end - alreadyRegistered[identifier] = true + playerIdentity[identifier] = { + firstName = result.firstname, + lastName = result.lastname, + dateOfBirth = result.dateofbirth, + sex = result.sex, + height = result.height + } - deferrals.done() - else - playerIdentity[identifier] = nil - alreadyRegistered[identifier] = false - deferrals.done() - end - else - playerIdentity[identifier] = nil - alreadyRegistered[identifier] = false - deferrals.done() - end - end) - else - deferrals.done(TranslateCap('no_identifier')) - end + alreadyRegistered[identifier] = true + + deferrals.done() + end) end) AddEventHandler('onResourceStart', function(resource) - if resource == GetCurrentResourceName() then - Wait(300) + if resource ~= GetCurrentResourceName() then + return + end + Wait(300) - while not ESX do Wait(0) end + while not ESX do Wait(0) end - local xPlayers = ESX.GetExtendedPlayers() + local xPlayers = ESX.GetExtendedPlayers() - for i=1, #(xPlayers) do - if xPlayers[i] then - checkIdentity(xPlayers[i]) - end + for i=1, #(xPlayers) do + if xPlayers[i] then + checkIdentity(xPlayers[i]) end end end) @@ -395,7 +350,7 @@ else RegisterNetEvent('esx:playerLoaded', function(playerId, xPlayer) local currentIdentity = playerIdentity[xPlayer.identifier] - if currentIdentity and alreadyRegistered[xPlayer.identifier] == true then + if currentIdentity and alreadyRegistered[xPlayer.identifier] then xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName)) xPlayer.set('firstName', currentIdentity.firstName) xPlayer.set('lastName', currentIdentity.lastName) @@ -422,111 +377,100 @@ else local xPlayer = ESX.GetPlayerFromId(source) if xPlayer then - if not alreadyRegistered[xPlayer.identifier] then - xPlayer.showNotification(TranslateCap('running'), "error") - if checkNameFormat(data.firstname) then - if checkNameFormat(data.lastname) then - if checkSexFormat(data.sex) then - if checkDOBFormat(data.dateofbirth) then - if checkHeightFormat(data.height) then - local formattedFirstName = formatName(data.firstname) - local formattedLastName = formatName(data.lastname) - local formattedDate = formatDate(data.dateofbirth) - - playerIdentity[xPlayer.identifier] = { - firstName = formattedFirstName, - lastName = formattedLastName, - dateOfBirth = formattedDate, - sex = data.sex, - height = data.height - } - - local currentIdentity = playerIdentity[xPlayer.identifier] - - xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName)) - xPlayer.set('firstName', currentIdentity.firstName) - xPlayer.set('lastName', currentIdentity.lastName) - xPlayer.set('dateofbirth', currentIdentity.dateOfBirth) - xPlayer.set('sex', currentIdentity.sex) - xPlayer.set('height', currentIdentity.height) - TriggerClientEvent('esx_identity:setPlayerData', xPlayer.source, currentIdentity) - saveIdentityToDatabase(xPlayer.identifier, currentIdentity) - alreadyRegistered[xPlayer.identifier] = true - playerIdentity[xPlayer.identifier] = nil - cb(true) - else - xPlayer.showNotification(TranslateCap('invalid_height_format'), "error") - cb(false) - end - else - xPlayer.showNotification(TranslateCap('invalid_dob_format'), "error") - cb(false) - end - else - xPlayer.showNotification(TranslateCap('invalid_sex_format'), "error") - cb(false) - end - else - xPlayer.showNotification(TranslateCap('invalid_lastname_format'), "error") - cb(false) - end - else - xPlayer.showNotification(TranslateCap('invalid_firstname_format'), "error") - cb(false) - end - else + if alreadyRegistered[xPlayer.identifier] then xPlayer.showNotification(TranslateCap('already_registered'), "error") - cb(false) - end - else - if multichar then - if checkNameFormat(data.firstname) then - if checkNameFormat(data.lastname) then - if checkSexFormat(data.sex) then - if checkDOBFormat(data.dateofbirth) then - local formattedFirstName = formatName(data.firstname) - local formattedLastName = formatName(data.lastname) - local formattedDate = formatDate(data.dateofbirth) - - data.firstname = formattedFirstName - data.lastname = formattedLastName - data.dateofbirth = formattedDate - if checkHeightFormat(data.height) then - local Identity= { - firstName = formattedFirstName, - lastName = formattedLastName, - dateOfBirth = formattedDate, - sex = data.sex, - height = data.height - } - TriggerEvent('esx_identity:completedRegistration', source, data) - TriggerClientEvent('esx_identity:setPlayerData', source, Identity) - cb(true) - else - TriggerClientEvent("esx:showNotification", source, TranslateCap('invalid_height_format'), "error") - cb(false) - end - else - TriggerClientEvent("esx:showNotification", source, TranslateCap('invalid_dob_format'), "error") - cb(false) - end - else - TriggerClientEvent("esx:showNotification", source, TranslateCap('invalid_sex_format'), "error") - cb(false) - end - else - TriggerClientEvent("esx:showNotification", source, TranslateCap('invalid_lastname_format'), "error") - cb(false) - end - else - TriggerClientEvent("esx:showNotification", source, TranslateCap('invalid_firstname_format'), "error") - cb(false) - end - else - TriggerClientEvent("esx:showNotification", source, TranslateCap('data_incorrect'), "error") - cb(false) - end - end + return cb(false) + end + + xPlayer.showNotification(TranslateCap('running'), "error") + if not checkNameFormat(data.firstname) then + xPlayer.showNotification(TranslateCap('invalid_firstname_format'), "error") + return cb(false) + end + if not checkNameFormat(data.lastname) then + xPlayer.showNotification(TranslateCap('invalid_lastname_format'), "error") + return cb(false) + end + if not checkSexFormat(data.sex) then + xPlayer.showNotification(TranslateCap('invalid_sex_format'), "error") + return cb(false) + end + if checkDOBFormat(data.dateofbirth) then + xPlayer.showNotification(TranslateCap('invalid_dob_format'), "error") + return cb(false) + end + if checkHeightFormat(data.height) then + xPlayer.showNotification(TranslateCap('invalid_height_format'), "error") + return cb(false) + end + + playerIdentity[xPlayer.identifier] = { + firstName = formatName(data.firstname), + lastName = formatName(data.lastname), + dateOfBirth = formatDate(data.dateofbirth), + sex = data.sex, + height = data.height + } + + local currentIdentity = playerIdentity[xPlayer.identifier] + + xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName)) + xPlayer.set('firstName', currentIdentity.firstName) + xPlayer.set('lastName', currentIdentity.lastName) + xPlayer.set('dateofbirth', currentIdentity.dateOfBirth) + xPlayer.set('sex', currentIdentity.sex) + xPlayer.set('height', currentIdentity.height) + TriggerClientEvent('esx_identity:setPlayerData', xPlayer.source, currentIdentity) + saveIdentityToDatabase(xPlayer.identifier, currentIdentity) + alreadyRegistered[xPlayer.identifier] = true + playerIdentity[xPlayer.identifier] = nil + return cb(true) + end + + if not multichar then + TriggerClientEvent("esx:showNotification", source, TranslateCap('data_incorrect'), "error") + return cb(false) + end + if not checkNameFormat(data.firstname) then + TriggerClientEvent("esx:showNotification", source, TranslateCap('invalid_firstname_format'), "error") + return cb(false) + end + if not checkNameFormat(data.lastname) then + TriggerClientEvent("esx:showNotification", source, TranslateCap('invalid_lastname_format'), "error") + return cb(false) + end + if not checkSexFormat(data.sex) then + TriggerClientEvent("esx:showNotification", source, TranslateCap('invalid_sex_format'), "error") + return cb(false) + end + if not checkDOBFormat(data.dateofbirth) then + TriggerClientEvent("esx:showNotification", source, TranslateCap('invalid_dob_format'), "error") + return cb(false) + end + if not checkHeightFormat(data.height) then + TriggerClientEvent("esx:showNotification", source, TranslateCap('invalid_height_format'), "error") + return cb(false) + end + + + local formattedFirstName = formatName(data.firstname) + local formattedLastName = formatName(data.lastname) + local formattedDate = formatDate(data.dateofbirth) + + data.firstname = formattedFirstName + data.lastname = formattedLastName + data.dateofbirth = formattedDate + local Identity = { + firstName = formattedFirstName, + lastName = formattedLastName, + dateOfBirth = formattedDate, + sex = data.sex, + height = data.height + } + + TriggerEvent('esx_identity:completedRegistration', source, data) + TriggerClientEvent('esx_identity:setPlayerData', source, Identity) + cb(true) end) end