Update main.lua

Added SonoranCAD integration as well as some improvements
This commit is contained in:
Andyyy7666
2022-02-26 01:45:27 +01:00
committed by GitHub
parent 554cbc15c1
commit fbec3aa961

View File

@@ -1,10 +1,34 @@
------------------------------------------------------------------------ -- For support join my discord: https://discord.gg/Z9Mxu72zZ6
------------------------------------------------------------------------
-- DO NOT EDIT IF YOU DON'T KNOW WHAT YOU'RE DOING -- if server_config.SonoranCAD_Enabled then
-- -- local function OnPlayerConnecting(name, setKickReason, deferrals)
-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 -- local player = source
------------------------------------------------------------------------ local steamIdentifier
------------------------------------------------------------------------ local identifiers = GetPlayerIdentifiers(player)
deferrals.defer()
Citizen.Wait(0)
deferrals.update(string.format("Hello %s. Your Steam ID is being checked.", name))
for _, v in pairs(identifiers) do
if string.find(v, "steam") then
steamIdentifier = v
break
end
end
Citizen.Wait(0)
if not steamIdentifier then
deferrals.done("You are not connected to Steam.")
else
deferrals.done()
end
end
AddEventHandler("playerConnecting", OnPlayerConnecting)
end
expectedName = "ND_Core" -- This is the resource and is not suggested to be changed. expectedName = "ND_Core" -- This is the resource and is not suggested to be changed.
resource = GetCurrentResourceName() resource = GetCurrentResourceName()
@@ -40,6 +64,9 @@ PerformHttpRequest("https://raw.githubusercontent.com/Andyyy7666/ND_Framework/ma
end end
end) end)
-- onlinePlayers table.
onlinePlayers = {}
-- Get player identifier function (This will not change the identifier all the time) -- Get player identifier function (This will not change the identifier all the time)
function GetPlayerIdentifierFromType(type, source) -- Credits: xander1998, Post: https://forum.cfx.re/t/solved-is-there-a-better-way-to-get-lic-steam-and-ip-than-getplayeridentifiers/236243/2?u=andyyy7666 function GetPlayerIdentifierFromType(type, source) -- Credits: xander1998, Post: https://forum.cfx.re/t/solved-is-there-a-better-way-to-get-lic-steam-and-ip-than-getplayeridentifiers/236243/2?u=andyyy7666
local identifiers = {} local identifiers = {}
@@ -61,7 +88,7 @@ end
RegisterNetEvent("checkPerms") RegisterNetEvent("checkPerms")
AddEventHandler("checkPerms", function(role) AddEventHandler("checkPerms", function(role)
local player = source local player = source
local rolePermission = IsRolePresent(player, role) local rolePermission = IsRolePresent(player, role, config.departments)
TriggerClientEvent("permsChecked", player, role, rolePermission) TriggerClientEvent("permsChecked", player, role, rolePermission)
end) end)
@@ -76,16 +103,57 @@ end)
RegisterNetEvent("getCharacters") RegisterNetEvent("getCharacters")
AddEventHandler("getCharacters", function() AddEventHandler("getCharacters", function()
local player = source local player = source
local characters = {}
local department = "CIV"
if server_config.SonoranCAD_Enabled then
local steam = string.gsub(GetPlayerIdentifierFromType("steam", player), "steam:", "")
local info = {
["id"] = server_config.SonoranCAD_CommunityID,
["key"] = server_config.SonoranCAD_APIKey,
["type"] = "GET_CHARACTERS",
["data"] = {
{
["apiId"] = steam
}
}
}
PerformHttpRequest("https://api.sonorancad.com/civilian/get_characters", function(errorCode, resultData, resultHeaders)
for k, v in pairs(json.decode(resultData)) do
if v.sections[2].fields[6].value == "M" then
gender = "Male"
else
gender = "Female"
end
exports.oxmysql:query("SELECT cash, bank, twt FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), v.id}, function(result)
if result then
if result[1] and result[1].cash and result[1].bank then
cash = result[1].cash
bank = result[1].bank
twt = result[1].twt
else
cash = config.maxStartingCash
bank = config.maxStartingBank
twt = v.sections[2].fields[1].value .. " " .. v.sections[2].fields[2].value
exports.oxmysql:query("INSERT INTO characters (license, character_id, cash, bank, twt) VALUES (?, ?, ?, ?, ?)", {GetPlayerIdentifierFromType("license", player), v.id, cash, bank, twt})
end
characters[v.id] = {id = v.id, firstName = v.sections[2].fields[1].value, lastName = v.sections[2].fields[2].value, dob = v.sections[2].fields[4].value, gender = gender, twt = twt, department = "CIV", cash = cash, bank = bank}
TriggerClientEvent("returnCharacters", player, characters)
end
end)
end
end, "POST", json.encode(info))
else
exports.oxmysql:query("SELECT * FROM characters WHERE license = ?", {GetPlayerIdentifierFromType("license", player)}, function(result) exports.oxmysql:query("SELECT * FROM characters WHERE license = ?", {GetPlayerIdentifierFromType("license", player)}, function(result)
if result then if result then
characters = {}
for i = 1, #result do for i = 1, #result do
temp = result[i] temp = result[i]
table.insert(characters, {id = temp.character_id, firstName = temp.first_name, lastName = temp.last_name, dob = temp.dob, gender = temp.gender, twt = temp.twt, department = temp.department, cash = temp.cash, bank = temp.bank}) characters[temp.character_id] = {id = temp.character_id, firstName = temp.first_name, lastName = temp.last_name, dob = temp.dob, gender = temp.gender, twt = temp.twt, department = temp.department, cash = temp.cash, bank = temp.bank}
end end
TriggerClientEvent("returnCharacters", player, characters) TriggerClientEvent("returnCharacters", player, characters)
end end
end) end)
end
end) end)
-- Creating a new character and increasing the character id. -- Creating a new character and increasing the character id.
@@ -93,6 +161,42 @@ RegisterNetEvent("newCharacter")
AddEventHandler("newCharacter", function(newCharacter) AddEventHandler("newCharacter", function(newCharacter)
local player = source local player = source
local license = GetPlayerIdentifierFromType("license", player) local license = GetPlayerIdentifierFromType("license", player)
if server_config.SonoranCAD_Enabled then
local steam = string.gsub(GetPlayerIdentifierFromType("steam", player), "steam:", "")
if newCharacter.gender == "Male" then
newGender = "M"
else
newGender = "F"
end
local info = {
["id"] = server_config.SonoranCAD_CommunityID,
["key"] = server_config.SonoranCAD_APIKey,
["type"] = "NEW_CHARACTER",
["data"] = {
{
["user"] = steam,
["useDictionary"] = true,
["recordTypeId"] = 7,
["replaceValues"] = {
["first"] = newCharacter.firstName,
["last"] = newCharacter.lastName,
["dob"] = newCharacter.dateOfBirth,
["sex"] = newGender
}
}
}
}
PerformHttpRequest("https://api.sonorancad.com/civilian/new_character", function(errorCode, resultData, resultHeaders)
print("Returned error code: " .. tostring(errorCode))
print("Returned data: " .. tostring(resultData))
print("Returned result Headers: " .. tostring(resultHeaders))
end, "POST", json.encode(info))
TriggerClientEvent("refreshCharacters", player)
else
exports.oxmysql:query("SELECT character_id FROM characters WHERE license = ?", {GetPlayerIdentifierFromType("license", player)}, function(result) exports.oxmysql:query("SELECT character_id FROM characters WHERE license = ?", {GetPlayerIdentifierFromType("license", player)}, function(result)
if (result) and (config.characterLimit > #result) then if (result) and (config.characterLimit > #result) then
exports.oxmysql:query("SELECT MAX(character_id) AS nextID FROM characters WHERE license = ?", {license}, function(result) exports.oxmysql:query("SELECT MAX(character_id) AS nextID FROM characters WHERE license = ?", {license}, function(result)
@@ -110,7 +214,7 @@ AddEventHandler("newCharacter", function(newCharacter)
characters = {} characters = {}
for i = 1, #result do for i = 1, #result do
temp = result[i] temp = result[i]
table.insert(characters, {id = temp.character_id, firstName = temp.first_name, lastName = temp.last_name, dob = temp.dob, gender = temp.gender, twt = temp.twt, department = temp.department, cash = temp.cash, bank = temp.bank}) characters[temp.character_id] = {id = temp.character_id, firstName = temp.first_name, lastName = temp.last_name, dob = temp.dob, gender = temp.gender, twt = temp.twt, department = temp.department, cash = temp.cash, bank = temp.bank}
end end
TriggerClientEvent("returnCharacters", player, characters) TriggerClientEvent("returnCharacters", player, characters)
end end
@@ -121,25 +225,78 @@ AddEventHandler("newCharacter", function(newCharacter)
end) end)
end end
end) end)
end
end) end)
-- Delete character from database. -- Delete character from database.
RegisterNetEvent("delCharacter") RegisterNetEvent("delCharacter")
AddEventHandler("delCharacter", function(character_id) AddEventHandler("delCharacter", function(character_id)
local player = source local player = source
if server_config.SonoranCAD_Enabled then
local info = {
["id"] = server_config.SonoranCAD_CommunityID,
["key"] = server_config.SonoranCAD_APIKey,
["type"] = "REMOVE_CHARACTER",
["data"] = {
{
["id"] = character_id,
},
}
}
PerformHttpRequest("https://api.sonorancad.com/civilian/remove_character", function(errorCode, resultData, resultHeaders)
print("Returned error code: " .. tostring(errorCode))
print("Returned data: " .. tostring(resultData))
print("Returned result Headers: " .. tostring(resultHeaders))
end, "POST", json.encode(info))
exports.oxmysql:query("DELETE FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), character_id}) exports.oxmysql:query("DELETE FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), character_id})
else
exports.oxmysql:query("DELETE FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), character_id})
end
end) end)
-- Update the character info when edited. -- Update the character info when edited.
RegisterNetEvent("editCharacter") RegisterNetEvent("editCharacter")
AddEventHandler("editCharacter", function(newCharacter) AddEventHandler("editCharacter", function(newCharacter)
local player = source local player = source
if server_config.SonoranCAD_Enabled then
local steam = string.gsub(GetPlayerIdentifierFromType("steam", player), "steam:", "")
if newCharacter.gender == "Male" then
newGender = "M"
else
newGender = "F"
end
local info = {
["id"] = server_config.SonoranCAD_CommunityID,
["key"] = server_config.SonoranCAD_APIKey,
["type"] = "EDIT_CHARACTER",
["data"] = {
{
["user"] = steam,
["useDictionary"] = true,
["recordId"] = newCharacter.id,
["replaceValues"] = {
["first"] = newCharacter.firstName,
["last"] = newCharacter.lastName,
["dob"] = newCharacter.dateOfBirth,
["sex"] = newGender
}
}
}
}
PerformHttpRequest("https://api.sonorancad.com/civilian/edit_character", function(errorCode, resultData, resultHeaders)
print("Returned error code: " .. tostring(errorCode))
print("Returned data: " .. tostring(resultData))
print("Returned result Headers: " .. tostring(resultHeaders))
end, "POST", json.encode(info))
else
exports.oxmysql:query("UPDATE characters SET first_name = ?, last_name = ?, dob = ?, gender = ?, twt = ?, department = ? WHERE license = ? AND character_id = ?", {newCharacter.firstName, newCharacter.lastName, newCharacter.dateOfBirth, newCharacter.gender, newCharacter.twtName, newCharacter.department, GetPlayerIdentifierFromType("license", player), newCharacter.id}) exports.oxmysql:query("UPDATE characters SET first_name = ?, last_name = ?, dob = ?, gender = ?, twt = ?, department = ? WHERE license = ? AND character_id = ?", {newCharacter.firstName, newCharacter.lastName, newCharacter.dateOfBirth, newCharacter.gender, newCharacter.twtName, newCharacter.department, GetPlayerIdentifierFromType("license", player), newCharacter.id})
end
end) end)
-- This is used to find out how much money the player has and use it in the client to show it on the ui. if config.enableMoneySystem then
RegisterNetEvent("getMoney") -- This is used to find out how much money the player has and use it in the client to show it on the ui.
AddEventHandler("getMoney", function(characterid) RegisterNetEvent("getMoney")
AddEventHandler("getMoney", function(characterid)
local player = source local player = source
exports.oxmysql:query("SELECT cash, bank FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), characterid}, function(result) exports.oxmysql:query("SELECT cash, bank FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), characterid}, function(result)
if result then if result then
@@ -150,36 +307,10 @@ AddEventHandler("getMoney", function(characterid)
TriggerClientEvent("returnMoney", player, cash, bank) TriggerClientEvent("returnMoney", player, cash, bank)
end end
end) end)
end)
-- onlinePlayers table.
onlinePlayers = {}
-- add a player to the table.
RegisterNetEvent("characterOnline")
AddEventHandler("characterOnline", function(id)
local player = source
local license = GetPlayerIdentifierFromType("license", player)
exports.oxmysql:query("SELECT * FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), id}, function(result)
if result then
local i = result[1]
onlinePlayers[player] = {
characterId = id,
firstName = i.first_name,
lastName = i.last_name,
dob = i.dob,
gender = i.gender,
twt = i.twt,
dept = i.department,
cash = i.cash,
bank = i.bank
}
end
end) end)
end)
-- paying command. -- paying command.
RegisterCommand(config.payCommand, function(source, args, raw) RegisterCommand(config.payCommand, function(source, args, raw)
local player = source local player = source
local target = tonumber(args[1]) local target = tonumber(args[1])
local amount = tonumber(args[2]) local amount = tonumber(args[2])
@@ -207,26 +338,18 @@ RegisterCommand(config.payCommand, function(source, args, raw)
exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", target), onlinePlayers[target].characterId}) exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", target), onlinePlayers[target].characterId})
TriggerClientEvent("updateMoney", target) TriggerClientEvent("updateMoney", target)
exports.oxmysql:query("SELECT first_name, last_name FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", target), onlinePlayers[target].characterId}, function(result)
if result then
TriggerClientEvent("chat:addMessage", player, { TriggerClientEvent("chat:addMessage", player, {
color = {0, 255, 0}, color = {0, 255, 0},
args = {"Success", "You paid " .. result[1].first_name .. " " .. result[1].last_name .. " $" .. amount .. "."} args = {"Success", "You paid " .. onlinePlayers[target].firstName .. " " .. onlinePlayers[target].lastName .. " $" .. amount .. "."}
}) })
exports.oxmysql:query("SELECT first_name, last_name FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}, function(result) TriggerClientEvent("receiveBank", target, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player)
if result then
TriggerClientEvent("receiveBank", target, amount, result[1].first_name .. " " .. result[1].last_name, player)
end
end)
end
end)
end end
end end
end) end)
end) end)
-- Give money command. -- Give money command.
RegisterCommand(config.giveCommand, function(source, args, raw) RegisterCommand(config.giveCommand, function(source, args, raw)
local player = source local player = source
local amount = tonumber(args[1]) local amount = tonumber(args[1])
@@ -248,19 +371,12 @@ RegisterCommand(config.giveCommand, function(source, args, raw)
exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", k), tonumber(v.characterId)}) exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", k), tonumber(v.characterId)})
TriggerClientEvent("updateMoney", k) TriggerClientEvent("updateMoney", k)
playerFound = true playerFound = true
exports.oxmysql:query("SELECT first_name, last_name FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", k), tonumber(v.characterId)}, function(result)
if result then
TriggerClientEvent("chat:addMessage", player, { TriggerClientEvent("chat:addMessage", player, {
color = {0, 255, 0}, color = {0, 255, 0},
args = {"Success", "You gave " .. result[1].first_name .. " " .. result[1].last_name .. " $" .. amount .. "."} args = {"Success", "You gave " .. onlinePlayers[k].firstName .. " " .. onlinePlayers[k].lastName .. " $" .. amount .. "."}
}) })
exports.oxmysql:query("SELECT first_name, last_name FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}, function(result) TriggerClientEvent("receiveCash", k, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player)
if result then break
TriggerClientEvent("receiveCash", k, amount, result[1].first_name .. " " .. result[1].last_name, player)
end
end)
end
end)
end end
end end
if not playerFound then if not playerFound then
@@ -273,11 +389,11 @@ RegisterCommand(config.giveCommand, function(source, args, raw)
end end
end end
end) end)
end) end)
-- Salary. -- Salary.
local salaryInterval = config.salaryInterval * 60000 local salaryInterval = config.salaryInterval * 60000
Citizen.CreateThread(function() Citizen.CreateThread(function()
while true do while true do
Citizen.Wait(salaryInterval) Citizen.Wait(salaryInterval)
for k, v in pairs(onlinePlayers) do for k, v in pairs(onlinePlayers) do
@@ -285,6 +401,81 @@ Citizen.CreateThread(function()
TriggerClientEvent("receiveSalary", k, config.salaryAmount) TriggerClientEvent("receiveSalary", k, config.salaryAmount)
end end
end end
end)
end
-- add a player to the table.
RegisterNetEvent("characterOnline")
AddEventHandler("characterOnline", function(id)
local player = source
local license = GetPlayerIdentifierFromType("license", player)
if server_config.SonoranCAD_Enabled then
local steam = string.gsub(GetPlayerIdentifierFromType("steam", player), "steam:", "")
local info = {
["id"] = server_config.SonoranCAD_CommunityID,
["key"] = server_config.SonoranCAD_APIKey,
["type"] = "GET_CHARACTERS",
["data"] = {
{
["apiId"] = steam
}
}
}
PerformHttpRequest("https://api.sonorancad.com/civilian/get_characters", function(errorCode, resultData, resultHeaders)
for k, v in pairs(json.decode(resultData)) do
if v.sections[2].fields[6].value == "M" then
gender = "Male"
else
gender = "Female"
end
exports.oxmysql:query("SELECT cash, bank, twt FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), v.id}, function(result)
if result then
if result[1] and result[1].cash and result[1].bank then
cash = result[1].cash
bank = result[1].bank
twt = result[1].twt
else
cash = config.maxStartingCash
bank = config.maxStartingBank
twt = v.sections[2].fields[1].value .. " " .. v.sections[2].fields[2].value
exports.oxmysql:query("INSERT INTO characters (license, character_id, cash, bank, twt) VALUES (?, ?, ?, ?, ?)", {GetPlayerIdentifierFromType("license", player), v.id, cash, bank, twt})
end
if v.id == id then
onlinePlayers[player] = {
characterId = id,
firstName = v.sections[2].fields[1].value,
lastName = v.sections[2].fields[2].value,
dob = v.sections[2].fields[4].value,
gender = gender,
twt = twt,
dept = "CIV",
cash = cash,
bank = bank
}
end
end
end)
end
end, "POST", json.encode(info))
else
exports.oxmysql:query("SELECT * FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), id}, function(result)
if result then
local i = result[1]
onlinePlayers[player] = {
characterId = id,
firstName = i.first_name,
lastName = i.last_name,
dob = i.dob,
gender = i.gender,
twt = i.twt,
dept = i.department,
cash = i.cash,
bank = i.bank
}
end
end)
end
end) end)
-- Remove player from onlinePlayers table when they leave. -- Remove player from onlinePlayers table when they leave.