Files
ND_Core/server/main.lua

145 lines
4.9 KiB
Lua
Raw Normal View History

2023-07-09 21:19:35 +02:00
NDCore = {}
2023-07-09 03:07:46 +02:00
ActivePlayers = {}
2023-07-11 01:05:13 +02:00
PlayersInfo = {}
local resourceName = GetCurrentResourceName()
2023-07-11 01:05:13 +02:00
local tempPlayersInfo = {}
local discordErrors = {
[400] = "Improper HTTP request",
[401] = "Discord bot token might be missing or incorrect",
[404] = "User might not be in the server",
[429] = "Discord bot rate limited"
}
2023-07-12 04:51:50 +02:00
Config = {
serverName = GetConvar("core:serverName", "Unconfigured ND-Core Server"),
discordInvite = GetConvar("core:discordInvite", "https://discord.gg/Z9Mxu72zZ6"),
discordAppId = GetConvar("core:discordAppId", "858146067018416128"),
discordAsset = GetConvar("core:discordAsset", "andyyy"),
discordAssetSmall = GetConvar("core:discordAssetSmall", "andyyy"),
discordActionText = GetConvar("core:discordActionText", "DISCORD"),
discordActionLink = GetConvar("discordActionLink", "https://discord.gg/Z9Mxu72zZ6"),
discordActionText2 = GetConvar("core:discordActionText2", "STORE"),
discordActionLink2 = GetConvar("core:discordActionLink2", "https://andyyy.tebex.io/category/fivem-scripts"),
characterIdentifier = GetConvar("core:characterIdentifier", "license"),
discordGuildId = GetConvar("core:discordGuildId"),
discordBotToken = GetConvar("core:discordBotToken"),
randomUnlockedVehicleChance = GetConvarInt("core:randomUnlockedVehicleChance", 30),
disableVehicleAirControl = GetConvarInt("core:disableVehicleAirControl", 1) == 1,
useInventoryForKeys = GetConvarInt("core:useInventoryForKeys", 1) == 1,
groups = json.decode(GetConvar("core:groups", "[]"))
}
2022-11-30 03:32:52 +01:00
SetConvarServerInfo("ND_Core", GetResourceMetadata(resourceName, "version", 0) or "invalid")
2023-07-11 01:05:13 +02:00
SetConvarReplicated("inventory:framework", "nd")
2023-07-10 02:31:42 +02:00
2023-07-11 01:05:13 +02:00
local function getIdentifierList(src)
local list = {}
for i=0, GetNumPlayerIdentifiers(src) do
local identifier = GetPlayerIdentifier(src, i)
if identifier then
local colon = identifier:find(":")
local identifierType = identifier:sub(1, colon-1)
list[identifierType] = identifier
2023-07-11 01:05:13 +02:00
end
end
return list
end
local function getDiscordInfo(discordUserId)
local done = false
local data
PerformHttpRequest(("https://discordapp.com/api/guilds/%s/members/%s"):format(Config.discordGuildId, discordUserId), function(errorCode, resultData, resultHeaders)
if errorCode ~= 200 then
done = true
return print(("^3Warning: %d %s"):format(errorCode, discordErrors[errorCode]))
2023-07-11 01:05:13 +02:00
end
local result = json.decode(resultData)
data = {
nickname = result.nick or result.user.username,
user = result.user,
roles = result.roles
}
done = true
end, "GET", "", {["Content-Type"] = "application/json", ["Authorization"] = ("Bot %s"):format(Config.discordBotToken)})
while not done do Wait(500) end
return data
end
AddEventHandler("playerJoining", function(oldId)
local src = source
PlayersInfo[src] = tempPlayersInfo[oldId]
tempPlayersInfo[oldId] = nil
end)
local function checkDiscordIdentifier(identifiers)
if not Config.discordBotToken or not Config.discordGuildId then return end
local discordIdentifier = identifiers["discord"]
if not discordIdentifier then return end
return getDiscordInfo(discordIdentifier:gsub("discord:", ""))
end
AddEventHandler("onResourceStart", function(name)
if name ~= resourceName or not Config.discordBotToken or not Config.discordGuildId then return end
for _, playerId in ipairs(GetPlayers()) do
local src = tonumber(playerId)
local identifiers = getIdentifierList(src)
PlayersInfo[src] = {
identifiers = identifiers,
discord = checkDiscordIdentifier(identifiers)
}
end
end)
2023-07-11 01:05:13 +02:00
AddEventHandler("playerConnecting", function(name, setKickReason, deferrals)
local tempSrc = source
local identifiers = getIdentifierList(tempSrc)
local mainIdentifier = identifiers[Config.characterIdentifier]
local discordInfo = {}
deferrals.defer()
Wait(0)
if mainIdentifier then
discordInfo = checkDiscordIdentifier(identifiers)
if not discordInfo then
2023-07-11 01:05:13 +02:00
deferrals.done(("Your discord was not found, join our discord here: %s."):format(Config.discordInvite))
Wait(0)
end
end
deferrals.update("Connecting...")
Wait(0)
if mainIdentifier then
tempPlayersInfo[tempSrc] = {
identifiers = identifiers,
discord = discordInfo
}
deferrals.done()
else
deferrals.done(("Your %s was not found."):format(Config.characterIdentifier))
Wait(0)
end
end)
AddEventHandler("playerDropped", function()
local src = source
local char = ActivePlayers[src]
if char then
2023-07-13 01:23:23 +02:00
char.unload()
end
PlayersInfo[src] = nil
end)
2023-07-16 12:31:02 +02:00
SetTimeout(500, function()
NDCore.loadSQL({
"database/characters.sql",
"database/vehicles.sql"
}, resourceName)
end)