refactor: esx_identity server side

This commit is contained in:
Csoki
2022-11-24 23:22:26 +01:00
parent 42d80407b5
commit ce89ca0234
+250 -306
View File
@@ -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