137 lines
3.8 KiB
Lua
137 lines
3.8 KiB
Lua
local discordWebhook = "https://discord.com/api/webhooks/"
|
|
local cachedUsers = {}
|
|
|
|
---@param id string
|
|
---@return { username: string, avatar: string } | nil
|
|
local function getForumUserFromId(id)
|
|
if cachedUsers[id] then
|
|
return cachedUsers[id]
|
|
end
|
|
|
|
local getPromise = promise.new()
|
|
|
|
PerformHttpRequest("https://policy-live.fivem.net/api/getUserInfo/" .. id, function(statusCode, response, headers)
|
|
if statusCode ~= 200 then
|
|
getPromise:resolve()
|
|
end
|
|
|
|
local responseData = json.decode(response)
|
|
|
|
getPromise:resolve({
|
|
username = responseData.username,
|
|
avatar = "https://forum.cfx.re/" .. responseData.avatar_template:gsub("{size}", "512")
|
|
})
|
|
end, "GET", "", {["Content-Type"] = "application/json"})
|
|
|
|
local user = Citizen.Await(getPromise)
|
|
|
|
if user then
|
|
cachedUsers[id] = user
|
|
end
|
|
|
|
return user
|
|
end
|
|
|
|
---@param source number
|
|
---@param event string
|
|
---@param message string
|
|
function Log(source, event, message)
|
|
if not Config.LogSystem then
|
|
return
|
|
end
|
|
|
|
if Config.LogSystem == "ox_lib" then
|
|
lib.Logger(source, event, message)
|
|
end
|
|
|
|
if Config.LogSystem ~= "discord" then
|
|
return
|
|
end
|
|
|
|
if discordWebhook == "https://discord.com/api/webhooks/" then
|
|
infoprint("warning", "Config.LogSystem is set to discord, but no discord webhook has been set in loaf_spikestrips/server/logs.lua")
|
|
return
|
|
end
|
|
|
|
local cleanedUpIdentifiers = {}
|
|
local accounts = {}
|
|
local identifiers = GetPlayerIdentifiers(source)
|
|
local avatar = "https://st3.depositphotos.com/9998432/13335/v/450/depositphotos_133352156-stock-illustration-default-placeholder-profile-icon.jpg"
|
|
local description = "**Message:**\n" .. message
|
|
local accountsCount = 0
|
|
|
|
for i = 1, #identifiers do
|
|
local identifierTypeIndex = identifiers[i]:find(":")
|
|
|
|
if not identifierTypeIndex then
|
|
goto continue
|
|
end
|
|
|
|
local identifierType = identifiers[i]:sub(1, identifierTypeIndex - 1)
|
|
local identifier = identifiers[i]:sub(identifierTypeIndex + 1)
|
|
|
|
if identifierType == "steam" then
|
|
accountsCount += 1
|
|
accounts[accountsCount] = "- Steam: https://steamcommunity.com/profiles/" .. tonumber(identifier, 16)
|
|
elseif identifierType == "fivem" then
|
|
local user = getForumUserFromId(identifier)
|
|
|
|
if user then
|
|
avatar = user.avatar
|
|
accountsCount += 1
|
|
accounts[accountsCount] = "- Forum account: [" .. user.username .. "](https://forum.cfx.re/u/" .. user.username .. ")"
|
|
end
|
|
elseif identifierType == "discord" then
|
|
accountsCount += 1
|
|
accounts[accountsCount] = "- Discord: <@" .. identifier .. ">"
|
|
end
|
|
|
|
if identifierType ~= "ip" then
|
|
cleanedUpIdentifiers[identifierType] = identifier
|
|
end
|
|
|
|
::continue::
|
|
end
|
|
|
|
---@diagnostic disable-next-line: param-type-mismatch
|
|
local currentTime = os.time(os.date("!*t")) -- Get the current time in UTC
|
|
local timestamp = os.date("%Y-%m-%dT%H:%M:%S.000Z", currentTime)
|
|
|
|
if accountsCount > 0 then
|
|
description = description .. "\n\n**Accounts:**\n"
|
|
for i = 1, accountsCount do
|
|
description = description .. accounts[i] .. "\n"
|
|
end
|
|
end
|
|
|
|
description = description .. "**Identifiers:**"
|
|
|
|
for identifierType in pairs(cleanedUpIdentifiers) do
|
|
description = description .. "\n- **" .. identifierType .. ":** " .. cleanedUpIdentifiers[identifierType]
|
|
end
|
|
|
|
local embed = {
|
|
title = event,
|
|
description = description,
|
|
color = 15633643,
|
|
timestamp = timestamp,
|
|
author = {
|
|
name = GetPlayerName(source) .. " | " .. source,
|
|
icon_url = avatar
|
|
},
|
|
footer = {
|
|
text = "loaf_spikestrips",
|
|
icon_url = "https://dunb17ur4ymx4.cloudfront.net/webstore/logos/3abb800c9903d7ba189328c8f520e76c96bf35ba.png"
|
|
}
|
|
}
|
|
|
|
PerformHttpRequest(discordWebhook, function() end, "POST", json.encode({
|
|
username = "Loaf - Spike strips",
|
|
avatar_url = "https://dunb17ur4ymx4.cloudfront.net/webstore/logos/3abb800c9903d7ba189328c8f520e76c96bf35ba.png",
|
|
embeds = {
|
|
embed
|
|
}
|
|
}), {
|
|
["Content-Type"] = "application/json"
|
|
})
|
|
end
|