local QBCore = exports["qb-core"]:GetCoreObject() local Webhook = '' -- PUT YOUR WEBHOOK LINK HERE local adsList = {} local anonymousList = {} local chatsHidden = {} local mutedList = {} local isDead = false local checkedDeathStatus = false local playersList = nil local onlinePlayers = {} function interp(s, tab) return (s:gsub('($%b{})', function(w) return tab[w:sub(3, -2)] or w end)) end AddEventHandler('onResourceStart', function(resourceName) if (GetCurrentResourceName() ~= resourceName) then return end for _, playerId in ipairs(GetPlayers()) do Citizen.Wait(1000) getNearPlayers(playerId) break end end) RegisterServerEvent('okokChat:onPlayerSpawn') AddEventHandler('okokChat:onPlayerSpawn', function() local _source = source if #onlinePlayers >= 1 then local addPlayer = true for k,v in ipairs(onlinePlayers) do if v == _source then addPlayer = false end end if addPlayer then onlinePlayers[#onlinePlayers + 1] = _source end else onlinePlayers[#onlinePlayers + 1] = _source end end) AddEventHandler('playerDropped', function(reason) local _source = source for i = 1, #onlinePlayers do if onlinePlayers[i] == source then table.remove(onlinePlayers, i) break end end end) RegisterServerEvent("okokChat:SetClosePlayers") AddEventHandler("okokChat:SetClosePlayers", function(players) playersList = players onlinePlayers = playersList end) function getNearPlayers(source) playersList = nil TriggerClientEvent("okokChat:getAllPlayers", tonumber(source)) while playersList == nil do Citizen.Wait(10) end return playersList end exports.chat:registerMessageHook(function(source, outMessage, hookRef) local msg = outMessage.args[2] if string.sub(msg, 1, 1) ~= "/" then hookRef.cancel() if Config.OOCMessageWithoutCommand then OOC(source, msg) end end end) RegisterServerEvent("okokChat:ServerMessage") AddEventHandler("okokChat:ServerMessage", function(background, color, icon, title, playername, message, target, image) local time = os.date(Config.DateFormat) if image == nil or image:gsub("%s+", "") == "" then TriggerClientEvent('chat:addMessage', target, { template = '
[{3}]{4} {6}
'..message..'
', args = { background, color, icon, title, playername, message, time } }) else TriggerClientEvent('chat:addMessage', target, { template = '
[{3}]{4} {6}
'..message..'
', args = { background, color, icon, title, playername, message, time } }) end end) RegisterServerEvent("okokChat:deathStatus") AddEventHandler("okokChat:deathStatus", function(isPlayerDead) isDead = isPlayerDead checkedDeathStatus = true end) ------------------------- -- [Me] if Config.EnableMeCommand then RegisterCommand(Config.MeCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local time = os.date(Config.DateFormat) local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname local playerNameAdmin = playerName.." ["..source.."]" local length = string.len(Config.MeCommand) local message = rawCommand:sub(length + 1) if mutedList[source] ~= nil then TriggerClientEvent('chat:addMessage', source, { template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', args = { SecondsToClock(mutedList[source].timeLeft), time } }) return end if message:gsub("%s+", "") == "" then return end if Config.Enable3DMe then TriggerClientEvent('okokChat:3dme', -1, "" .. message .. "", source) end if chatsHidden[source] == nil then showToClosePlayers(xPlayer, function(players) TriggerClientEvent('chat:addMessage', players, { template = '
['..Config.MeMessageTitle..'] {0} {2}
{1}
', args = { playerName, message, time } }) end) if Config.ShowIDOnMessage then showToClosePlayersAdmins(xPlayer, function(players) TriggerClientEvent('chat:addMessage', players, { template = '
['..Config.MeMessageTitle..'] {0} {2}
{1}
', args = { playerNameAdmin, message, time } }) end) end if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['me'], message = message, } discordWebhook(data) end end end) end ------------------------- -- [Do] if Config.EnableDoCommand then RegisterCommand(Config.DoCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local time = os.date(Config.DateFormat) local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname local playerNameAdmin = playerName.." ["..source.."]" local length = string.len(Config.DoCommand) local message = rawCommand:sub(length + 1) if mutedList[source] ~= nil then TriggerClientEvent('chat:addMessage', source, { template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', args = { SecondsToClock(mutedList[source].timeLeft), time } }) return end if message:gsub("%s+", "") == "" then return end if Config.Enable3DDo then TriggerClientEvent('okokChat:3ddo', -1, "" .. message .. "", source) end if chatsHidden[source] == nil then showToClosePlayers(xPlayer, function(players) TriggerClientEvent('chat:addMessage', players, { template = '
['..Config.DoMessageTitle..'] {0} {2}
{1}
', args = { playerName, message, time } }) end) if Config.ShowIDOnMessage then showToClosePlayersAdmins(xPlayer, function(players) TriggerClientEvent('chat:addMessage', players, { template = '
['..Config.DoMessageTitle..'] {0} {2}
{1}
', args = { playerNameAdmin, message, time } }) end) end if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['do'], message = message, } discordWebhook(data) end end end) end ------------------------- -- [Try] if Config.EnableTryCommand then RegisterCommand(Config.TryCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local time = os.date(Config.DateFormat) local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname local playerNameAdmin = playerName.." ["..source.."]" local length = string.len(Config.TryCommand) local message = rawCommand:sub(length + 1) if mutedList[source] ~= nil then TriggerClientEvent('chat:addMessage', source, { template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', args = { SecondsToClock(mutedList[source].timeLeft), time } }) return end if message:gsub("%s+", "") == "" then return end if math.random(0, 1) == 0 then return end if chatsHidden[source] == nil then showToClosePlayers(xPlayer, function(players) TriggerClientEvent('chat:addMessage', players, { template = '
['..Config.TryMessageTitle..'] {0} {2}
{1}
', args = { playerName, message, time } }) end) if Config.ShowIDOnMessage then showToClosePlayersAdmins(xPlayer, function(players) TriggerClientEvent('chat:addMessage', players, { template = '
['..Config.TryMessageTitle..'] {0} {2}
{1}
', args = { playerNameAdmin, message, time } }) end) end if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['try'], message = message, } discordWebhook(data) end end end) end ------------------------- -- [Auto Message] local id = 1 Citizen.CreateThread(function() while Config.EnableAutoMessage do Citizen.Wait(Config.AutoMessageTime*60000) local time = os.date(Config.DateFormat) TriggerClientEvent('chat:addMessage', -1, { template = '
['..Config.AnnouncementMessageTitle..'] {1}
{0}
', args = { Config.AutoMessages[id], time } }) if Config.AutoMessages[id+1] ~= nil then id = id + 1 else id = 1 end end end) ------------------------- -- [Clear Chat] if Config.AllowPlayersToClearTheirChat then RegisterCommand(Config.ClearChatCommand, function(source, args, rawCommand) TriggerClientEvent('chat:clear', source) end) end if Config.AllowStaffsToClearEveryonesChat then RegisterCommand(Config.ClearEveryonesChatCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local time = os.date(Config.DateFormat) if isAdmin(xPlayer) then TriggerClientEvent('chat:clear', -1) showAll(function(players) TriggerClientEvent('chat:addMessage', players, { template = '
'..Config.ClearChatMessageTitle..' {0}
'..Config.ClearChatMessage..'
', args = { time } }) end) if Config.ShowIDOnMessage then showOnlyForAdmins(function(admins) TriggerClientEvent('chat:addMessage', admins, { template = '
'..Config.ClearChatMessageTitle..' {0}
'..Config.ClearChatMessage..'
', args = { time } }) end) end if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['clear_all'], message = Config.ClearEveryonesChatCommand, } discordWebhook(data) end end end) end ------------------------- -- [Hide Chat] if Config.EnableHideChat then RegisterCommand(Config.HideChatCommand, function(source, args, rawCommand) if chatsHidden[source] == nil then chatsHidden[source] = true TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['disable_chat'], Config.NotificationsText['disable_chat'].message) else chatsHidden[source] = nil TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['enable_chat'], Config.NotificationsText['enable_chat'].message) end end) end ------------------------- -- [Staff] if Config.EnableStaffCommand then RegisterCommand(Config.StaffCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local length = string.len(Config.StaffCommand) local message = rawCommand:sub(length + 1) local time = os.date(Config.DateFormat) local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname if Config.StaffSteamName then playerName = xPlayer.PlayerData.name end if message:gsub("%s+", "") ~= "" then if isAdmin(xPlayer) then showToEveryoneNotHidden(function(players) TriggerClientEvent('chat:addMessage', players, { template = '
['..Config.StaffMessageTitle..'] {0} {2}
{1}
', args = { playerName, message, time } }) end) if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['staff_msg'], message = message, } discordWebhook(data) end end end end) end ------------------------- -- [Staff Only] if Config.EnableStaffOnlyCommand then RegisterCommand(Config.StaffOnlyCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local length = string.len(Config.StaffOnlyCommand) local message = rawCommand:sub(length + 1) local time = os.date(Config.DateFormat) local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname if Config.StaffSteamName then playerName = xPlayer.PlayerData.name end if message:gsub("%s+", "") ~= "" then if chatsHidden[source] == nil then if isAdmin(xPlayer) then showOnlyForAdmins(function(admins) TriggerClientEvent('chat:addMessage', admins, { template = '
['..Config.StaffOnlyMessageTitle..'] {0} {2}
{1}
', args = { playerName, message, time } }) end) if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['staff_chat_msg'], message = message, } discordWebhook(data) end end end end end) end ------------------------- -- [Server Announcement] if Config.EnableServerAnnouncement then RegisterCommand(Config.ServerAnnouncementCommand, function(source, args, rawCommand) local xPlayer = nil local length = string.len(Config.ServerAnnouncementCommand) local message = rawCommand:sub(length + 1) local time = os.date(Config.DateFormat) if source ~= 0 and source ~= -1 then xPlayer = QBCore.Functions.GetPlayer(source) end if message:gsub("%s+", "") ~= "" then if source <= 0 then TriggerClientEvent('chat:addMessage', -1, { template = '
['..Config.AnnouncementMessageTitle..'] {1}
{0}
', args = { message, time } }) elseif isAdmin(xPlayer) then TriggerClientEvent('chat:addMessage', -1, { template = '
['..Config.AnnouncementMessageTitle..'] {1}
{0}
', args = { message, time } }) if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['sv_an'], message = message, } discordWebhook(data) end end end end) end ------------------------- -- [Advertisement] if Config.EnableAdvertisementCommand then RegisterCommand(Config.AdvertisementCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local length = string.len(Config.AdvertisementCommand) local message = rawCommand:sub(length + 1) local time = os.date(Config.DateFormat) local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname local playerNameAdmins = xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" local bankMoney = xPlayer.PlayerData.money.bank if mutedList[source] ~= nil then TriggerClientEvent('chat:addMessage', source, { template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', args = { SecondsToClock(mutedList[source].timeLeft), time } }) return end if message:gsub("%s+", "") == "" then return end if chatsHidden[source] == nil then if adsList[source] == nil then if bankMoney >= Config.AdvertisementPrice then xPlayer.Functions.RemoveMoney('bank', Config.AdvertisementPrice) showAll(function(players) TriggerClientEvent('chat:addMessage', players, { template = '', args = { playerName, message, time } }) end) if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['ad'], message = message, } discordWebhook(data) end if Config.ShowIDOnMessage then showOnlyForAdmins(function(admins) TriggerClientEvent('chat:addMessage', admins, { template = '', args = { playerNameAdmins, message, time } }) end) end TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['ad_success'], interp(Config.NotificationsText['ad_success'].message, {price = Config.AdvertisementPrice})) adsList[source] = { time = Config.AdvertisementCooldown * 60, pastTime = 0, timeLeft = Config.AdvertisementCooldown * 60 } while (adsList[source].time > adsList[source].pastTime) do Citizen.Wait(1000) adsList[source].pastTime = adsList[source].pastTime + 1 adsList[source].timeLeft = adsList[source].time - adsList[source].pastTime end adsList[source] = nil else TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['ad_no_money'], Config.NotificationsText['ad_no_money'].message) end else TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['ad_too_quick'], Config.NotificationsText['ad_too_quick'].message) end end end) end ------------------------- -- [Twitch] if Config.EnableTwitchCommand then RegisterCommand(Config.TwitchCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local length = string.len(Config.TwitchCommand) local message = rawCommand:sub(length + 1) local time = os.date(Config.DateFormat) local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname local playerNameAdmins = xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" local twitch = twitchPermission(source) if mutedList[source] ~= nil then TriggerClientEvent('chat:addMessage', source, { template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', args = { SecondsToClock(mutedList[source].timeLeft), time } }) return end if message:gsub("%s+", "") == "" then return end if chatsHidden[source] == nil then if twitch then showAll(function(players) TriggerClientEvent('chat:addMessage', players, { template = '
{0} {2}
{1}
', args = { playerName, message, time } }) end) if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['twitch'], message = message, } discordWebhook(data) end if Config.ShowIDOnMessage then showOnlyForAdmins(function(admins) TriggerClientEvent('chat:addMessage', admins, { template = '
{0} {2}
{1}
', args = { playerNameAdmins, message, time } }) end) end end end end) end function twitchPermission(id) for i, a in ipairs(Config.TwitchList) do for x, b in ipairs(GetPlayerIdentifiers(id)) do if string.lower(b) == string.lower(a) then return true end end end end ------------------------- -- [Youtube] if Config.EnableYoutubeCommand then RegisterCommand(Config.YoutubeCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local length = string.len(Config.YoutubeCommand) local message = rawCommand:sub(length + 1) local time = os.date(Config.DateFormat) local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname local playerNameAdmins = xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" local youtube = youtubePermission(source) if mutedList[source] ~= nil then TriggerClientEvent('chat:addMessage', source, { template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', args = { SecondsToClock(mutedList[source].timeLeft), time } }) return end if message:gsub("%s+", "") == "" then return end if chatsHidden[source] == nil then if youtube then showAll(function(players) TriggerClientEvent('chat:addMessage', players, { template = '
{0} {2}
{1}
', args = { playerName, message, time } }) end) if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['youtube'], message = message, } discordWebhook(data) end if Config.ShowIDOnMessage then showOnlyForAdmins(function(admins) TriggerClientEvent('chat:addMessage', admins, { template = '
{0} {2}
{1}
', args = { playerNameAdmins, message, time } }) end) end end end end) end function youtubePermission(id) for i, a in ipairs(Config.YoutubeList) do for x, b in ipairs(GetPlayerIdentifiers(id)) do if string.lower(b) == string.lower(a) then return true end end end end ------------------------- -- [Twitter] if Config.EnableTwitterCommand then RegisterCommand(Config.TwitterCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local length = string.len(Config.TwitterCommand) local message = rawCommand:sub(length + 1) local time = os.date(Config.DateFormat) local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname local playerNameAdmins = xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" if mutedList[source] ~= nil then TriggerClientEvent('chat:addMessage', source, { template = '
'..Config.MessageTitle..' {1}
'..Config.TimeOutMessages['muted_message']..'
', args = { SecondsToClock(mutedList[source].timeLeft), time } }) return end if message:gsub("%s+", "") == "" then return end if chatsHidden[source] == nil then showAll(function(players) TriggerClientEvent('chat:addMessage', players, { template = '
{0} {2}
{1}
', args = { playerName, message, time } }) end) if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['twitter'], message = message, } discordWebhook(data) end if Config.ShowIDOnMessage then showOnlyForAdmins(function(admins) TriggerClientEvent('chat:addMessage', admins, { template = '
{0} {2}
{1}
', args = { playerNameAdmins, message, time } }) end) end end end) end ------------------------- -- [Police] if Config.EnablePoliceCommand then RegisterCommand(Config.PoliceCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local length = string.len(Config.PoliceCommand) local message = rawCommand:sub(length + 1) local time = os.date(Config.DateFormat) local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname local playerNameAdmins = xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" local job = xPlayer.PlayerData.job.name if mutedList[source] ~= nil then TriggerClientEvent('chat:addMessage', source, { template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', args = { SecondsToClock(mutedList[source].timeLeft), time } }) return end if message:gsub("%s+", "") == "" then return end if chatsHidden[source] == nil then if job == Config.PoliceJobName then showAll(function(players) TriggerClientEvent('chat:addMessage', players, { template = '
{0} {2}
{1}
', args = { playerName, message, time } }) end) if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['police'], message = message, } discordWebhook(data) end if Config.ShowIDOnMessage then showOnlyForAdmins(function(admins) TriggerClientEvent('chat:addMessage', admins, { template = '
{0} {2}
{1}
', args = { playerNameAdmins, message, time } }) end) end end end end) end ------------------------- -- [Ambulance] if Config.EnableAmbulanceCommand then RegisterCommand(Config.AmbulanceCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local length = string.len(Config.AmbulanceCommand) local message = rawCommand:sub(length + 1) local time = os.date(Config.DateFormat) local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname local playerNameAdmins = xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" local job = xPlayer.PlayerData.job.name if mutedList[source] ~= nil then TriggerClientEvent('chat:addMessage', source, { template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', args = { SecondsToClock(mutedList[source].timeLeft), time } }) return end if message:gsub("%s+", "") == "" then return end if chatsHidden[source] == nil then if job == Config.AmbulanceJobName then showAll(function(players) TriggerClientEvent('chat:addMessage', players, { template = '
{0} {2}
{1}
', args = { playerName, message, time } }) end) if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['ambulance'], message = message, } discordWebhook(data) end if Config.ShowIDOnMessage then showOnlyForAdmins(function(admins) TriggerClientEvent('chat:addMessage', admins, { template = '
{0} {2}
{1}
', args = { playerNameAdmins, message, time } }) end) end end end end) end ------------------------- -- [Jobs] if Config.JobChat then RegisterCommand(Config.JobCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local length = string.len(Config.JobCommand) local message = rawCommand:sub(length + 1) local time = os.date(Config.DateFormat) local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname local playerNameAdmin = playerName.." ["..source.."]" local job = xPlayer.PlayerData.job if mutedList[source] ~= nil then TriggerClientEvent('chat:addMessage', source, { template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', args = { SecondsToClock(mutedList[source].timeLeft), time } }) return end if message:gsub("%s+", "") == "" then return end if chatsHidden[source] == nil then showForJob(job.name, function(players) TriggerClientEvent('chat:addMessage', players, { template = '
['..job.label..'] {0} {2}
{1}
', args = { playerName, message, time } }) end) if Config.ShowIDOnMessage then showForJobAdmins(job.name, function(players) TriggerClientEvent('chat:addMessage', players, { template = '
['..job.label..'] {0} {2}
{1}
', args = { playerNameAdmin, message, time } }) end) end if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = interp(Config.WebhookText['job_chat'], {job = job.label}), message = message, } discordWebhook(data) end end end) end ------------------------- -- [Private Messages] if Config.EnablePM then RegisterCommand(Config.PMCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local message = table.concat(args, " ",2) local time = os.date(Config.DateFormat) local id = tonumber(args[1]) local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" if mutedList[source] ~= nil then TriggerClientEvent('chat:addMessage', source, { template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', args = { SecondsToClock(mutedList[source].timeLeft), time } }) return end if message:gsub("%s+", "") == "" then return end if id == source then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end xTarget = QBCore.Functions.GetPlayer(id) if xTarget == nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end xTargetName = xTarget.PlayerData.charinfo.firstname.." "..xTarget.PlayerData.charinfo.lastname if chatsHidden[id] ~= nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['is_muted'], Config.NotificationsText['is_muted'].message) return end TriggerClientEvent('chat:addMessage', source, { template = '
['..Config.PMMessageTitle..'] {0} {2}
{1}
', args = { playerName, message, time } }) TriggerClientEvent('chat:addMessage', id, { template = '
['..Config.PMMessageTitle..'] {0} {2}
{1}
', args = { playerName, message, time } }) if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = interp(Config.WebhookText['pm_chat'], {name = xTargetName, id = id}), message = message, } discordWebhook(data) end end) end ------------------------- -- [OOC] if Config.EnableOOC then function OOC(source, message) local xPlayer = QBCore.Functions.GetPlayer(source) local time = os.date(Config.DateFormat) local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname local playerNameAdmin = playerName.." ["..source.."]" if mutedList[source] ~= nil then TriggerClientEvent('chat:addMessage', source, { template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', args = { SecondsToClock(mutedList[source].timeLeft), time } }) return end if message:gsub("%s+", "") == "" then return end if chatsHidden[source] == nil then showToClosePlayers(xPlayer, function(players) TriggerClientEvent('chat:addMessage', players, { template = '
['..Config.OOCMessageTitle..'] {0} {2}
{1}
', args = { playerName, message, time } }) end) if Config.ShowIDOnMessage then showToClosePlayersAdmins(xPlayer, function(players) TriggerClientEvent('chat:addMessage', players, { template = '
['..Config.OOCMessageTitle..'] {0} {2}
{1}
', args = { playerNameAdmin, message, time } }) end) end if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['ooc'], message = message, } discordWebhook(data) end end end RegisterCommand(Config.OOCCommand, function(source, args, rawCommand) local length = string.len(Config.OOCCommand) local message = rawCommand:sub(length + 1) OOC(source, message) end) end ------------------------- -- [Time out] if Config.TimeOutPlayers then RegisterCommand(Config.TimeOutCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local id = tonumber(args[1]) local muteTime = tonumber(args[2]) local time = os.date(Config.DateFormat) local xTarget = nil local xTargetName = nil if not isAdmin(xPlayer) then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_not_adm'], Config.NotificationsText['mute_not_adm'].message) return end if id == nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end if muteTime == nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_time_inv'], Config.NotificationsText['mute_time_inv'].message) return end if id == source then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end xTarget = QBCore.Functions.GetPlayer(id) if xTarget == nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end xTargetName = xTarget.PlayerData.charinfo.firstname.." "..xTarget.PlayerData.charinfo.lastname if mutedList[id] ~= nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['alr_muted'], Config.NotificationsText['alr_muted'].message) return end mutedList[id] = { time = muteTime * 60, pastTime = 0, timeLeft = muteTime * 60 } if Config.ShowTimeOutMessageForEveryone then showMuteMessageToEveryone(id, function(players) TriggerClientEvent('chat:addMessage', players, { template = '
{0} {2}
'..Config.TimeOutMessages['muted_for']..'
', args = { Config.MessageTitle, muteTime, time, xTargetName } }) end) else TriggerClientEvent('chat:addMessage', source, { template = '
{0} {2}
'..Config.TimeOutMessages['you_muted_for']..'
', args = { Config.MessageTitle, muteTime, time, xTargetName } }) end TriggerClientEvent('chat:addMessage', id, { template = '
SERVER {1}
'..Config.TimeOutMessages['been_muted_for']..'
', args = { muteTime, time } }) if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = interp(Config.WebhookText['muted'], {id = id}), message = interp(Config.WebhookText['muted_for'], {muteTime = muteTime}), } discordWebhook(data) end while (mutedList[id].time > mutedList[id].pastTime) do Citizen.Wait(1000) mutedList[id].pastTime = mutedList[id].pastTime + 1 mutedList[id].timeLeft = mutedList[id].time - mutedList[id].pastTime end mutedList[id] = nil end) RegisterCommand(Config.RemoveTimeOutCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local id = tonumber(args[1]) local time = os.date(Config.DateFormat) local xTarget = nil local xTargetName = nil if not isAdmin(xPlayer) then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_not_adm'], Config.NotificationsText['mute_not_adm'].message) return end if id == nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end if id == source then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end xTarget = QBCore.Functions.GetPlayer(id) if xTarget == nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end xTargetName = xTarget.PlayerData.charinfo.firstname.." "..xTarget.PlayerData.charinfo.lastname if mutedList[id] == nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['alr_unmuted'], Config.NotificationsText['alr_unmuted'].message) return end TriggerClientEvent('chat:addMessage', source, { template = '
{0} {1}
'..Config.TimeOutMessages['you_unmuted']..'
', args = { Config.MessageTitle, time, xTargetName } }) TriggerClientEvent('chat:addMessage', id, { template = '
{0} {1}
'..Config.TimeOutMessages['been_unmuted']..'
', args = { Config.MessageTitle, time } }) if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = interp(Config.WebhookText['unmuted'], {id = id}), message = Config.WebhookText['p_unmuted'], } discordWebhook(data) end mutedList[id] = nil end) end function SecondsToClock(seconds) local seconds = tonumber(seconds) if seconds <= 0 then return "00"; else local timeString = "" hours = string.format("%02.f", math.floor(seconds/3600)); mins = string.format("%02.f", math.floor(seconds/60 - (hours*60))); secs = string.format("%02.f", math.floor(seconds - hours*3600 - mins *60)); timeString = hours..":"..mins..":"..secs..Config.TimeOutMessages['hours'] if hours == "00" then timeString = mins..":"..secs..Config.TimeOutMessages['minutes'] end if hours == "00" and mins == "00" then timeString = math.floor(seconds)..Config.TimeOutMessages['seconds'] end return timeString end end ------------------------- -- [Anonymous] if Config.EnableAnonymousCommand then RegisterCommand(Config.AnonymousCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local length = string.len(Config.AnonymousCommand) local message = rawCommand:sub(length + 1) local time = os.date(Config.DateFormat) local bankMoney = xPlayer.PlayerData.money.bank local playerName = "Anonymous" local playerNameAdmins = xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" if mutedList[source] ~= nil then TriggerClientEvent('chat:addMessage', source, { template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', args = { SecondsToClock(mutedList[source].timeLeft), time } }) return end if chatsHidden[source] == nil then if message:gsub("%s+", "") ~= "" then if not isAnonymousChatBlacklisted(xPlayer) then if anonymousList[source] == nil then if bankMoney >= Config.AnonymousPrice then xPlayer.Functions.RemoveMoney('bank', Config.AnonymousPrice) showOnlyForAnonymous(function(anonymous) TriggerClientEvent('chat:addMessage', anonymous, { template = '
{0} {2}
{1}
', args = { playerName, message, time } }) end) if Webhook ~= '' then local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) local data = { playerid = xPlayer.PlayerData.source, identifier = identifierlist.license:gsub("license2:", ""), discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", type = Config.WebhookText['anon'], message = message, } discordWebhook(data) end if Config.ShowIDOnMessage then showOnlyForAdminsAnonymous(function(admins) TriggerClientEvent('chat:addMessage', admins, { template = '
{0} {2}
{1}
', args = { playerNameAdmins, message, time } }) end) end TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['an_success'], Config.NotificationsText['an_success'].message) anonymousList[source] = { time = Config.AdvertisementCooldown * 2, pastTime = 0, timeLeft = Config.AdvertisementCooldown * 2 } while (anonymousList[source].time > anonymousList[source].pastTime) do Citizen.Wait(1000) anonymousList[source].pastTime = anonymousList[source].pastTime + 1 anonymousList[source].timeLeft = anonymousList[source].time - anonymousList[source].pastTime end anonymousList[source] = nil else TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['an_no_money'], Config.NotificationsText['an_no_money'].message) end else TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['an_too_quick'], Config.NotificationsText['an_too_quick'].message) end else TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['an_not_allowed'], Config.NotificationsText['an_not_allowed'].message) end end end end) end -- [DOC] if Config.EnableDocCommand then RegisterCommand(Config.DocCommand, function(source, args, rawCommand) local xPlayer = QBCore.Functions.GetPlayer(source) local time = os.date(Config.DateFormat) local playerName = Config.ShowIDOnMessageForEveryone and getName(xPlayer.identifier).." ["..source.."]" or getName(xPlayer.identifier) local playerNameAdmin = playerName.." ["..source.."]" local length = string.len(Config.DocCommand) local message = tonumber(rawCommand:sub(length + 1)) local number = 1 if mutedList[source] ~= nil then TriggerClientEvent('chat:addMessage', source, { template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', args = { SecondsToClock(mutedList[source].timeLeft), time } }) return end while number <= message do local toShow = number .. '/' ..message Wait(1000) if chatsHidden[source] == nil then showToClosePlayers(xPlayer, function(players) TriggerClientEvent('chat:addMessage', players, { template = '
['..Config.DocMessageTitle..'] {0} {2}
{1}
', args = { playerName, toShow, time } }) end) end if Config.ShowIDOnMessage then showToClosePlayersAdmins(xPlayer, function(players) TriggerClientEvent('chat:addMessage', players, { template = '
['..Config.DocMessageTitle..'] {0} {2}
{1}
', args = { playerNameAdmin, toShow, time } }) end) end number = number + 1 end end) end function isAnonymousChatBlacklisted(xPlayer) if xPlayer ~= nil then for k,v in ipairs(Config.WhatJobsCantSeeAnonymousChat) do if xPlayer.PlayerData.job.name == v then return true end end end return false end function showOnlyForAnonymous(anonymous) for k,v in ipairs(onlinePlayers) do local xPlayer = QBCore.Functions.GetPlayer(v) if xPlayer ~= nil then if not Config.ShowIDOnMessage and chatsHidden[xPlayer.PlayerData.source] == nil and not isAnonymousChatBlacklisted(xPlayer) then anonymous(v) elseif Config.ShowIDOnMessage and chatsHidden[xPlayer.PlayerData.source] == nil and not isAdmin(xPlayer) and not isAnonymousChatBlacklisted(xPlayer) then anonymous(v) end end end end function showOnlyForAdminsAnonymous(admins) for k,v in ipairs(onlinePlayers) do local xPlayer = QBCore.Functions.GetPlayer(v) if xPlayer ~= nil then if isAdmin(xPlayer) and chatsHidden[xPlayer.PlayerData.source] == nil and not isAnonymousChatBlacklisted(xPlayer) then admins(v) end end end end ------------------------- -- [Functions] function isAdmin(xPlayer) if xPlayer ~= nil then local playerGroup = QBCore.Functions.GetPermission(xPlayer.PlayerData.source) if Config.QBPermissionsUpdate then for group, value in pairs(playerGroup) do if value then for k,v in ipairs(Config.StaffGroups) do if group == v then return true end end end end else for k,v in ipairs(Config.StaffGroups) do if playerGroup == v then return true end end end end return false end function showOnlyForAdmins(admins) for k,v in ipairs(onlinePlayers) do local xPlayer = QBCore.Functions.GetPlayer(v) if xPlayer ~= nil then if isAdmin(xPlayer) and chatsHidden[xPlayer.PlayerData.source] == nil then admins(v) end end end end function showAll(players) for k,v in ipairs(onlinePlayers) do local xPlayer = QBCore.Functions.GetPlayer(v) if xPlayer ~= nil then if not Config.ShowIDOnMessage and chatsHidden[xPlayer.PlayerData.source] == nil then players(v) elseif Config.ShowIDOnMessage and chatsHidden[xPlayer.PlayerData.source] == nil and not isAdmin(xPlayer) then players(v) end end end end function showToEveryoneNotHidden(players) for k,v in ipairs(onlinePlayers) do local xPlayer = QBCore.Functions.GetPlayer(v) if xPlayer ~= nil then if chatsHidden[xPlayer.PlayerData.source] == nil then players(v) end end end end function showMuteMessageToEveryone(id, players) for k,v in ipairs(onlinePlayers) do local xPlayer = QBCore.Functions.GetPlayer(v) if xPlayer ~= nil then if chatsHidden[xPlayer.PlayerData.source] == nil and id ~= v then players(v) end end end end function showForJob(job, players) for k,v in ipairs(onlinePlayers) do local xPlayer = QBCore.Functions.GetPlayer(v) if xPlayer ~= nil then if not Config.ShowIDOnMessage and xPlayer.PlayerData.job.name == job and chatsHidden[xPlayer.PlayerData.source] == nil then players(v) elseif Config.ShowIDOnMessage and not isAdmin(xPlayer) and xPlayer.PlayerData.job.name == job and chatsHidden[xPlayer.PlayerData.source] == nil then players(v) end end end end function showForJobAdmins(job, players) for k,v in ipairs(onlinePlayers) do local xPlayer = QBCore.Functions.GetPlayer(v) if xPlayer ~= nil then if xPlayer.PlayerData.job.name == job and chatsHidden[xPlayer.PlayerData.source] == nil and isAdmin(xPlayer) then players(v) end end end end function showToClosePlayers(xPlayer, admins) local ped = GetPlayerPed(xPlayer.PlayerData.source) local playerCoords = GetEntityCoords(ped, false) for k,v in ipairs(onlinePlayers) do local xTarget = QBCore.Functions.GetPlayer(v) if xTarget ~= nil then if not Config.ShowIDOnMessage and chatsHidden[xTarget.source] == nil then local tped = GetPlayerPed(v) local targetCoords = GetEntityCoords(tped, false) if #(vector3(playerCoords.x, playerCoords.y, playerCoords.z) - vector3(targetCoords.x, targetCoords.y, targetCoords.z)) < Config.Distance then admins(v) end elseif Config.ShowIDOnMessage and not isAdmin(xTarget) and chatsHidden[xTarget.source] == nil then local tped = GetPlayerPed(v) local targetCoords = GetEntityCoords(tped, false) if #(vector3(playerCoords.x, playerCoords.y, playerCoords.z) - vector3(targetCoords.x, targetCoords.y, targetCoords.z)) < Config.Distance then admins(v) end end end end end function showToClosePlayersAdmins(xPlayer, admins) local ped = GetPlayerPed(xPlayer.PlayerData.source) local playerCoords = GetEntityCoords(ped, false) for k,v in ipairs(onlinePlayers) do local xTarget = QBCore.Functions.GetPlayer(v) if xTarget ~= nil then if chatsHidden[xTarget.source] == nil and isAdmin(xTarget) then local tped = GetPlayerPed(v) local targetCoords = GetEntityCoords(tped, false) if #(vector3(playerCoords.x, playerCoords.y, playerCoords.z) - vector3(targetCoords.x, targetCoords.y, targetCoords.z)) < Config.Distance then admins(v) end end end end end -------------------------- IDENTIFIERS function ExtractIdentifiers(id) local identifiers = { steam = "", ip = "", discord = "", license = "", xbl = "", live = "" } for i = 0, GetNumPlayerIdentifiers(id) - 1 do local playerID = GetPlayerIdentifier(id, i) if string.find(playerID, "steam") then identifiers.steam = playerID elseif string.find(playerID, "ip") then identifiers.ip = playerID elseif string.find(playerID, "discord") then identifiers.discord = playerID elseif string.find(playerID, "license") then identifiers.license = playerID elseif string.find(playerID, "xbl") then identifiers.xbl = playerID elseif string.find(playerID, "live") then identifiers.live = playerID end end return identifiers end -------------------------- DISCORD WEBHOOK function discordWebhook(data) local information = { { ["color"] = Config.WebhookColor, ["author"] = { ["icon_url"] = Config.IconURL, ["name"] = Config.ServerName..' - Logs', }, ["title"] = 'CHAT', ["description"] = '**Type:** '..data.type..'\n**Message:** '..data.message..'\n\n**ID:** '..data.playerid..'\n**Identifier:** '..data.identifier..'\n**Discord:** '..data.discord, ["footer"] = { ["text"] = os.date(Config.DateFormat), } } } PerformHttpRequest(Webhook, function(err, text, headers) end, 'POST', json.encode({username = Config.BotName, embeds = information}), {['Content-Type'] = 'application/json'}) return end