1521 lines
		
	
	
		
			No EOL
		
	
	
		
			62 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			1521 lines
		
	
	
		
			No EOL
		
	
	
		
			62 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| 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 = '<div class="chat-message" style="background: {0};"><i class="{2}" style="color: #fff; background-color: {1}; padding: 0.3125rem; border-radius: 0.3125rem; vertical-align: middle;"></i> <b><span style="color: {1}">[{3}]{4}</span> <span class="time">{6}</span></b><div class="message">'..message..'</div></div>',
 | |
| 			args = { background, color, icon, title, playername, message, time }
 | |
| 		})
 | |
| 	else
 | |
| 		TriggerClientEvent('chat:addMessage', target, {
 | |
| 			template = '<div class="chat-message" style="background: {0};"><i class="{2}" style="color: #fff; background-color: {1}; padding: 0.3125rem; border-radius: 0.3125rem; vertical-align: middle;"></i> <b><span style="color: {1}">[{3}]{4}</span> <span class="time">{6}</span></b><div class="message">'..message..'<br><img src="'..image..'" width="100%"></img></div></div>',
 | |
| 			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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">'..Config.MessageTitle..'</span> <span class="time">{1}</span></b><div class="message">You are muted for <b>{0}</b></div></div>',
 | |
| 				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 = '<div class="chat-message me"><i class="'..Config.MeIcon..'"></i> <b><span style="color: #79b8fa">['..Config.MeMessageTitle..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 					args = { playerName, message, time }
 | |
| 				})
 | |
| 			end)
 | |
| 
 | |
| 			if Config.ShowIDOnMessage then
 | |
| 				showToClosePlayersAdmins(xPlayer, function(players)
 | |
| 					TriggerClientEvent('chat:addMessage', players, {
 | |
| 						template = '<div class="chat-message me"><i class="'..Config.MeIcon..'"></i> <b><span style="color: #79b8fa">['..Config.MeMessageTitle..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 						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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">'..Config.MessageTitle..'</span> <span class="time">{1}</span></b><div class="message">You are muted for <b>{0}</b></div></div>',
 | |
| 				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 = '<div class="chat-message do"><i class="'..Config.DoIcon..'"></i> <b><span style="color: #79faa4">['..Config.DoMessageTitle..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 					args = { playerName, message, time }
 | |
| 				})
 | |
| 			end)
 | |
| 
 | |
| 			if Config.ShowIDOnMessage then
 | |
| 				showToClosePlayersAdmins(xPlayer, function(players)
 | |
| 					TriggerClientEvent('chat:addMessage', players, {
 | |
| 						template = '<div class="chat-message do"><i class="'..Config.DoIcon..'"></i> <b><span style="color: #79faa4">['..Config.DoMessageTitle..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 						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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">'..Config.MessageTitle..'</span> <span class="time">{1}</span></b><div class="message">You are muted for <b>{0}</b></div></div>',
 | |
| 				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 = '<div class="chat-message try"><i class="'..Config.TryIcon..'"></i> <b><span style="color: #f34971">['..Config.TryMessageTitle..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 					args = { playerName, message, time }
 | |
| 				})
 | |
| 			end)
 | |
| 
 | |
| 			if Config.ShowIDOnMessage then
 | |
| 				showToClosePlayersAdmins(xPlayer, function(players)
 | |
| 					TriggerClientEvent('chat:addMessage', players, {
 | |
| 						template = '<div class="chat-message try"><i class="'..Config.TryIcon..'"></i> <b><span style="color: #f34971">['..Config.TryMessageTitle..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 						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 = '<div class="chat-message server-msg"><i class="'..Config.AnnouncementIcon..'"></i> <b><span style="color: #cc3d3d;">['..Config.AnnouncementMessageTitle..']</span> <span class="time">{1}</span></b><div class="message">{0}</div></div>',
 | |
| 			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 = '<div class="chat-message system"><i class="fas fa-cog"></i> <b><span style="color: #df7b00">'..Config.ClearChatMessageTitle..'</span> <span class="time">{0}</span></b><div class="message">'..Config.ClearChatMessage..'</div></div>',
 | |
| 					args = { time }
 | |
| 				})
 | |
| 			end)
 | |
| 
 | |
| 			if Config.ShowIDOnMessage then
 | |
| 				showOnlyForAdmins(function(admins)
 | |
| 					TriggerClientEvent('chat:addMessage', admins, {
 | |
| 						template = '<div class="chat-message system"><i class="fas fa-cog"></i> <b><span style="color: #df7b00">'..Config.ClearChatMessageTitle..'</span> <span class="time">{0}</span></b><div class="message">'..Config.ClearChatMessage..'</div></div>',
 | |
| 						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 = '<div class="chat-message staff"><i class="'..Config.StaffIcon..'"></i> <b><span style="color: #1ebc62;">['..Config.StaffMessageTitle..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 						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 = '<div class="chat-message staffonly"><i class="'..Config.StaffOnlyIcon..'"></i> <b><span style="color: #1ebc62">['..Config.StaffOnlyMessageTitle..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 							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 = '<div class="chat-message server-msg"><i class="'..Config.AnnouncementIcon..'"></i> <b><span style="color: #cc3d3d;">['..Config.AnnouncementMessageTitle..']</span> <span class="time">{1}</span></b><div class="message">{0}</div></div>',
 | |
| 					args = { message, time }
 | |
| 				})
 | |
| 			elseif isAdmin(xPlayer) then
 | |
| 				TriggerClientEvent('chat:addMessage', -1, {
 | |
| 					template = '<div class="chat-message server-msg"><i class="'..Config.AnnouncementIcon..'"></i> <b><span style="color: #cc3d3d;">['..Config.AnnouncementMessageTitle..']</span> <span class="time">{1}</span></b><div class="message">{0}</div></div>',
 | |
| 					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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">'..Config.MessageTitle..'</span> <span class="time">{1}</span></b><div class="message">You are muted for <b>{0}</b></div></div>',
 | |
| 				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 = '<div class="chat-message advertisement"><i class="'..Config.AdvertisementIcon..'"></i> <b><span style="color: #81db44">{0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 							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 = '<div class="chat-message advertisement"><i class="'..Config.AdvertisementIcon..'"></i> <b><span style="color: #81db44">{0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 								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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">'..Config.MessageTitle..'</span> <span class="time">{1}</span></b><div class="message">You are muted for <b>{0}</b></div></div>',
 | |
| 				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 = '<div class="chat-message twitch"><i class="'..Config.TwitchIcon..'"></i> <b><span style="color: #9c70de">{0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 						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 = '<div class="chat-message twitch"><i class="'..Config.TwitchIcon..'"></i> <b><span style="color: #9c70de">{0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 							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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">'..Config.MessageTitle..'</span> <span class="time">{1}</span></b><div class="message">You are muted for <b>{0}</b></div></div>',
 | |
| 				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 = '<div class="chat-message youtube"><i class="'..Config.YoutubeIcon..'"></i> <b><span style="color: #ff0000">{0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 						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 = '<div class="chat-message youtube"><i class="'..Config.YoutubeIcon..'"></i> <b><span style="color: #ff0000">{0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 							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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">'..Config.MessageTitle..'</span> <span class="time">{1}</span></b><div class="message">'..Config.TimeOutMessages['muted_message']..'</div></div>',
 | |
| 				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 = '<div class="chat-message twitter"><i class="'..Config.TwitterIcon..'"></i> <b><span style="color: #2aa9e0">{0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 					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 = '<div class="chat-message twitter"><i class="'..Config.TwitterIcon..'"></i> <b><span style="color: #2aa9e0">{0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 						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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">'..Config.MessageTitle..'</span> <span class="time">{1}</span></b><div class="message">You are muted for <b>{0}</b></div></div>',
 | |
| 				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 = '<div class="chat-message police"><i class="'..Config.PoliceIcon..'"></i> <b><span style="color: #4a6cfd">{0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 						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 = '<div class="chat-message police"><i class="'..Config.PoliceIcon..'"></i> <b><span style="color: #4a6cfd">{0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 							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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">'..Config.MessageTitle..'</span> <span class="time">{1}</span></b><div class="message">You are muted for <b>{0}</b></div></div>',
 | |
| 				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 = '<div class="chat-message ambulance"><i class="'..Config.AmbulanceIcon..'"></i> <b><span style="color: #e3a71b">{0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 						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 = '<div class="chat-message ambulance"><i class="'..Config.AmbulanceIcon..'"></i> <b><span style="color: #e3a71b">{0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 							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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">'..Config.MessageTitle..'</span> <span class="time">{1}</span></b><div class="message">You are muted for <b>{0}</b></div></div>',
 | |
| 				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 = '<div class="chat-message jobchat"><i class="'..Config.JobIcon..'"></i> <b><span style="color: #35dbc2">['..job.label..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 					args = { playerName, message, time }
 | |
| 				})
 | |
| 			end)
 | |
| 
 | |
| 			if Config.ShowIDOnMessage then
 | |
| 				showForJobAdmins(job.name, function(players)
 | |
| 					TriggerClientEvent('chat:addMessage', players, {
 | |
| 						template = '<div class="chat-message jobchat"><i class="'..Config.JobIcon..'"></i> <b><span style="color: #35dbc2">['..job.label..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 						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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">'..Config.MessageTitle..'</span> <span class="time">{1}</span></b><div class="message">You are muted for <b>{0}</b></div></div>',
 | |
| 				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 = '<div class="chat-message pm"><i class="'..Config.PMIcon..'"></i> <b><span style="color: #916db0">['..Config.PMMessageTitle..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 			args = { playerName, message, time }
 | |
| 		})
 | |
| 
 | |
| 		TriggerClientEvent('chat:addMessage', id, {
 | |
| 			template = '<div class="chat-message pm"><i class="'..Config.PMIcon..'"></i> <b><span style="color: #916db0">['..Config.PMMessageTitle..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 			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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">'..Config.MessageTitle..'</span> <span class="time">{1}</span></b><div class="message">You are muted for <b>{0}</b></div></div>',
 | |
| 				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 = '<div class="chat-message ooc"><i class="'..Config.OOCIcon..'"></i> <b><span style="color: #ababab">['..Config.OOCMessageTitle..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 					args = { playerName, message, time }
 | |
| 				})
 | |
| 			end)
 | |
| 
 | |
| 			if Config.ShowIDOnMessage then
 | |
| 				showToClosePlayersAdmins(xPlayer, function(players)
 | |
| 					TriggerClientEvent('chat:addMessage', players, {
 | |
| 						template = '<div class="chat-message ooc"><i class="'..Config.OOCIcon..'"></i> <b><span style="color: #ababab">['..Config.OOCMessageTitle..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 						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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">{0}</span> <span class="time">{2}</span></b><div class="message">'..Config.TimeOutMessages['muted_for']..'</div></div>',
 | |
| 					args = { Config.MessageTitle, muteTime, time, xTargetName }
 | |
| 				})
 | |
| 			end)
 | |
| 		else
 | |
| 			TriggerClientEvent('chat:addMessage', source, {
 | |
| 				template = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">{0}</span> <span class="time">{2}</span></b><div class="message">'..Config.TimeOutMessages['you_muted_for']..'</div></div>',
 | |
| 				args = { Config.MessageTitle, muteTime, time, xTargetName }
 | |
| 			})
 | |
| 		end
 | |
| 
 | |
| 		TriggerClientEvent('chat:addMessage', id, {
 | |
| 			template = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">SERVER</span> <span class="time">{1}</span></b><div class="message">'..Config.TimeOutMessages['been_muted_for']..'</div></div>',
 | |
| 			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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">{0}</span> <span class="time">{1}</span></b><div class="message">'..Config.TimeOutMessages['you_unmuted']..'</div></div>',
 | |
| 			args = { Config.MessageTitle, time, xTargetName }
 | |
| 		})
 | |
| 
 | |
| 		TriggerClientEvent('chat:addMessage', id, {
 | |
| 			template = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">{0}</span> <span class="time">{1}</span></b><div class="message">'..Config.TimeOutMessages['been_unmuted']..'</div></div>',
 | |
| 			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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">'..Config.MessageTitle..'</span> <span class="time">{1}</span></b><div class="message">You are muted for <b>{0}</b></div></div>',
 | |
| 				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 = '<div class="chat-message anonymous"><i class="'..Config.AnonymousIcon..'"></i> <b><span style="color: #2e874d">{0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 									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 = '<div class="chat-message anonymous"><i class="'..Config.AnonymousIcon..'"></i> <b><span style="color: #2e874d">{0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
| 										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 = '<div class="chat-message muted"><i class="'..Config.TimeOutIcon..'"></i> <b><span style="color: #df7b00">'..Config.MessageTitle..'</span> <span class="time">{1}</span></b><div class="message">You are muted for <b>{0}</b></div></div>',
 | |
|                 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 = '<div class="chat-message me"><i class="'..Config.DocIcon..'"></i> <b><span style="color: #79b8fa">['..Config.DocMessageTitle..'] {0}</span> <span class="time">{2}</span></b><div class="message">{1}</div></div>',
 | |
|                         args = { playerName, toShow, time }
 | |
|                     })
 | |
|                 end)
 | |
| 
 | |
|             end
 | |
| 
 | |
|             if Config.ShowIDOnMessage then
 | |
|                 showToClosePlayersAdmins(xPlayer, function(players)
 | |
|                     TriggerClientEvent('chat:addMessage', players, {
 | |
|                         template = '<div class="chat-message me"><i class="'..Config.DocIcon..'"></i> <b><span style="color: #79b8fa">['..Config.DocMessageTitle..'] {0}</span> <span class="time">{2}</span></span></b><div class="message">{1}</div></div>',
 | |
|                         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 | 
