------------------------------------
--- Discord Chat Roles by Badger ---
------------------------------------
--[[
List in order of least priority to highest with
highest priority overtaking role before it if
they have that discord role.
]]--
-- CONFIG --
roleList = {
{0, "👱 ^3Member | "}, -- 1
{434472452328783893, "👨🔬 ^3Verified Member | "}, -- 2
{807398679937417237, "🛠️ ^1Mechanic | "}, -- 3
{807381509195300905, '👨⚕️ ^1SAFD | '}, -- 4
{807381508167565352, '👮 ^2BCSO | '}, -- 5
{807381508859887667, '👮 ^8SASP | '}, -- 6
{807381507622305852, '👮 ^4LSPD | '}, -- 7
{807381510284902451, '👮 ^4FBI | '}, -- 8
{807381510026035240, '📶 ^6Dispatch | '}, -- 9
{585557857827815429, '🔥 ^9Nitro Booster | '}, -- 10
{596414797977878530, "🥈 ^7Silver Supporter | "}, -- 11
{742482159851536455, '🥇 ^3Gold Supporter | '}, -- 12
{742482158945566771, "💠 ^4Platinum Supporter | "}, -- 13
{742482161680122047, "💎 ^5Diamond Supporter | "}, -- 14
{608583076037001225, "🛂 ️^2Staff | "},
{789551229549281331, "🛂 ️^2Sr. Staff | "},
{517060882686279701, "🛃 ^4Moderator | "},
{789538166536798248, "🛃 ^4Sr. Moderator | "},
{635155687688634399, "🔰 ^2Administrator | "},
{556158473981788176, "🔰 ^2Senior Administrator | "},
{650653280275267591, "🔰 ^2Head of Staff | "},
{671141073728307228, "👨💻 ^8Server Developer | "},
{361899298209923075, "🐉 ^8EGRP Dev | "},
}
sendBlockMessages = false;
-- CODE --
function sendMsg(firstline, msg, to)
TriggerClientEvent('chat:addMessage', to, {
template = '
{0}
{1}
',
args = { firstline, msg }
});
end
-- For allowing colored chat
allowedColors = {3, 4, 10, 11, 12, 13, 14}
allowedRed = {10, 11, 12, 13, 14}
--- Code ---
function sleep (a)
local sec = tonumber(os.clock() + a);
while (os.clock() < sec) do
end
end
local function has_value (tab, val)
for index, value in ipairs(tab) do
if value == val then
return true
end
end
return false
end
function stringsplit(inputstr, sep)
if sep == nil then
sep = "%s"
end
local t={} ; i=1
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
t[i] = str
i = i + 1
end
return t
end
function get_index (tab, val)
local counter = 1
for index, value in ipairs(tab) do
if value == val then
return counter
end
counter = counter + 1
end
return nil
end
roleTracker = {}
roleAccess = {}
chatcolorTracker = {}
local availColors =
{
['DiscordChatRoles.Access.Donator'] = {
['White'] = {'^0'},
['Green'] = {'^2'},
['Yellow'] = {'^3'},
['Blue'] = {'^4'},
['Light Blue'] = {'^5'},
['Purple'] = {'^6'},
['White'] = {'^7'},
['Pink'] = {'^9'},
['Police'] = {'^1', '^4'},
['Police2'] = {'^4', '^1'},
['Christmas'] = {'^2', '^1'},
['Christmas2'] = {'^1', '^2'},
},
['DiscordChatRoles.Access.Elite'] = {
['RainbowYGB'] = {'^3', '^2', '^4'},
['RainbowFull'] = {'^3', '^4', '^1', '^5', '^6', '^7', '^9'},
},
['DiscordChatRoles.Access.Staff'] = {
['Red'] = {'^1'},
}
}
RegisterCommand('chatcolor', function(source, args, rawCommand)
local theirList = {}
local colorList = {}
for k, v in pairs(availColors) do
-- k = Permission
-- v = Array of color-selections
if IsPlayerAceAllowed(source, k) then
-- They have permission to use these colors:
for colorName, colorArr in pairs(availColors[k]) do
table.insert(theirList, colorName);
table.insert(colorList, colorArr);
end
end
end
if #args == 0 then
-- List out which ones they have access to
if #theirList > 0 then
TriggerClientEvent('chatMessage', source, prefix .. 'You have access to the following Chat-Colors:');
for i = 1, #theirList do
local arr = colorList[i];
local example = 'Example'
local ex = '';
local indCount = 1
for j = 1, #example do
if indCount > #arr then
indCount = 1;
end
local char = example:sub(j, j);
ex = ex .. arr[indCount] .. char;
indCount = indCount + 1;
end
TriggerClientEvent('chatMessage', source, '^9[^4' .. i .. '^9] ^0' .. theirList[i] .. " ---> " .. ex);
end
else
TriggerClientEvent('chatMessage', source, prefix .. '^1ERROR: You have no Chat-Colors :( - Consider donating for some :)');
end
else
local selection = args[1]
if tonumber(selection) ~= nil then
local sel = tonumber(selection);
if sel <= #theirList then
chatcolorTracker[source] = colorList[sel];
TriggerClientEvent('chatMessage', source, prefix .. 'You have set your Chat-Color to ^4' .. theirList[sel]);
else
-- Invalid selection
TriggerClientEvent('chatMessage', source, '^1ERROR: That is not a valid selection...')
end
else
-- Print it's not a number
TriggerClientEvent('chatMessage', source, '^1ERROR: You did not put in a number...')
end
end
end)
RegisterCommand('cc', function(source, args, rawCommand)
local theirList = {}
local colorList = {}
for k, v in pairs(availColors) do
-- k = Permission
-- v = Array of color-selections
if IsPlayerAceAllowed(source, k) then
-- They have permission to use these colors:
for colorName, colorArr in pairs(availColors[k]) do
table.insert(theirList, colorName);
table.insert(colorList, colorArr);
end
end
end
if #args == 0 then
-- List out which ones they have access to
if #theirList > 0 then
TriggerClientEvent('chatMessage', source, prefix .. 'You have access to the following Chat-Colors:');
for i = 1, #theirList do
local arr = colorList[i];
local example = 'Example'
local ex = '';
local indCount = 1
for j = 1, #example do
if indCount > #arr then
indCount = 1;
end
local char = example:sub(j, j);
ex = ex .. arr[indCount] .. char;
indCount = indCount + 1;
end
TriggerClientEvent('chatMessage', source, '^9[^4' .. i .. '^9] ^0' .. theirList[i] .. " ---> " .. ex);
end
else
TriggerClientEvent('chatMessage', source, prefix .. '^1ERROR: You have no Chat-Colors :( - Consider donating for some :)');
end
else
local selection = args[1]
if tonumber(selection) ~= nil then
local sel = tonumber(selection);
if sel <= #theirList then
chatcolorTracker[source] = colorList[sel];
TriggerClientEvent('chatMessage', source, prefix .. 'You have set your Chat-Color to ^4' .. theirList[sel]);
else
-- Invalid selection
TriggerClientEvent('chatMessage', source, '^1ERROR: That is not a valid selection...')
end
else
-- Print it's not a number
TriggerClientEvent('chatMessage', source, '^1ERROR: You did not put in a number...')
end
end
end)
function setContains(set, key)
return set[key] ~= nil
end
function msg(src, mesg)
TriggerClientEvent('chatMessage', src, prefix .. mesg)
end
function msgRaw(src, mesg)
TriggerClientEvent('chatMessage', src, mesg)
end
prefix = '^9[^5DiscordChatRoles^9] ^3'
RegisterCommand('chattag', function(source, args, rawCommand)
local steamID = GetPlayerIdentifiers(source)[1];
local accessChat = roleAccess[steamID]
if accessChat == nil then
-- Need them to say something in chat first 1 time
msg(source, 'You need to say something in chat before you run this command...')
return;
end
if #args == 0 then
-- Just list their chat tags
msg(source, "You have access to the following Chat-Tags:")
for i = 1, #accessChat do
msgRaw(source, '^9[^4' .. i .. '^9] ^r' .. roleList[accessChat[i]][2])
end
msg(source, "Use /chattag to change your Chat-Tag")
elseif #args == 1 then
-- Change their chat tag
if tonumber(args[1]) ~= nil then
if accessChat[tonumber(args[1])] ~= nil then
-- Set their chatTag
roleTracker[steamID] = accessChat[tonumber(args[1])]
msg(source, 'Your Chat-Tag has now been set to:^r ' .. roleList[accessChat[tonumber(args[1])]][2])
else
-- Not a valid chat tag ID
msg(source, '^1ERROR: This is not a valid Chat-Tag id')
end
else
-- It's not a valid number
msg(source, '^1ERROR: This is not a number...')
end
else
-- Not correct syntax
msg(source, '^1ERROR: Not proper usage. /chattag ')
end
end)
chatNotEnabled = {}
RegisterNetEvent('DiscordChatRoles:DisableChat')
AddEventHandler('DiscordChatRoles:DisableChat', function(src)
chatNotEnabled[src] = true;
end)
RegisterNetEvent('DiscordChatRoles:EnableChat')
AddEventHandler('DiscordChatRoles:EnableChat', function(src)
chatNotEnabled[src] = nil;
end)
AddEventHandler('chatMessage', function(source, name, msg)
local args = stringsplit(msg)
CancelEvent()
local src = source
if not string.find(args[1], "/") and setContains(roleTracker, GetPlayerIdentifiers(source)[1]) and
not has_value(inStaffChat, GetPlayerIdentifiers(source)[1]) and not (chatNotEnabled[src] ~= nil) then
local roleStr = roleList[roleTracker[GetPlayerIdentifiers(source)[1]]][2]
local colors = {'^0', '^2', '^3', '^4', '^5', '^6', '^7', '^8', '^9'}
local staffColors = {'^1', '^8'}
local hasColors = false
local hasRed = false
local roleNum = roleTracker[GetPlayerIdentifiers(source)[1]]
for i = 1, #colors do
local checkFor = "%" .. tostring(colors[i])
if string.match(msg, checkFor) ~= nil then
hasColors = true
end
end
for i = 1, #staffColors do
if string.find(msg, "%" .. staffColors[i]) ~= nil then
hasRed = true
end
end
local dontSend = false
if hasColors then
-- Check if they have required role
if not has_value(allowedColors, tonumber(roleNum)) then
dontSend = true
TriggerClientEvent('chatMessage', source, "^7[^1DiscordChatRoles^7] ^1You cannot use colored chat since you are not a donator...")
end
end
if hasRed then
-- Check if they have required role
if not has_value(allowedRed, tonumber(roleNum)) then
dontSend = true
TriggerClientEvent('chatMessage', source, "^7[^1DiscordChatRoles^7] ^1You cannot use the color RED in chat since you are not staff...")
end
end
local theirColor = chatcolorTracker[source];
local finalMessage = msg;
if theirColor ~= nil then
finalMessage = ''
local indCount = 1;
for j = 1, #msg do
if indCount > #theirColor then
indCount = 1;
end
local char = msg:sub(j, j);
finalMessage = finalMessage .. theirColor[indCount] .. char;
indCount = indCount + 1;
end
end
if not dontSend then
--TriggerClientEvent('chatMessage', -1, roleStr .. name .. "^7: " .. finalMessage)
if sendBlockMessages then
sendMsg(roleStr .. name .. "^7: ", finalMessage, -1);
else
TriggerClientEvent('chatMessage', -1, roleStr .. name .. "^7: " .. finalMessage);
end
end
end
if not string.find(args[1], "/") and not has_value(inStaffChat, GetPlayerIdentifiers(source)[1]) and
not setContains(roleTracker, GetPlayerIdentifiers(source)[1]) and not (chatNotEnabled[src] ~= nil) then
CancelEvent()
roleTracker[GetPlayerIdentifiers(source)[1]] = 1
for k, v in ipairs(GetPlayerIdentifiers(src)) do
if string.sub(v, 1, string.len("discord:")) == "discord:" then
identifierDiscord = v
end
end
local roleStr = roleList[1][2]
local roleNum = 1
local hasAccess = {}
table.insert(hasAccess, roleNum)
if identifierDiscord then
local roleIDs = exports.discord_perms:GetRoles(src)
-- Loop through roleList and set their role up:
if not (roleIDs == false) then
for i = 1, #roleList do
for j = 1, #roleIDs do
local roleID = roleIDs[j]
if (tostring(roleList[i][1]) == tostring(roleID)) then
roleStr = roleList[i][2]
table.insert(hasAccess, i)
roleNum = i
end
end
end
roleAccess[GetPlayerIdentifiers(source)[1]] = hasAccess;
else
print(GetPlayerName(src) .. " has not gotten their permissions cause roleIDs == false")
end
end
roleTracker[GetPlayerIdentifiers(source)[1]] = roleNum
local colors = {'^0', '^2', '^3', '^4', '^5', '^6', '^7', '^8', '^9'}
local staffColors = {'^1', '^8'}
local hasColors = false
local hasRed = false
for i = 1, #colors do
local checkFor = "%" .. tostring(colors[i])
if string.match(msg, checkFor) ~= nil then
hasColors = true
end
end
for i = 1, #staffColors do
if string.find(msg, "%" .. staffColors[i]) ~= nil then
hasRed = true
end
end
local dontSend = false
if hasColors then
-- Check if they have required role
if not has_value(allowedColors, tonumber(roleNum)) then
dontSend = true
TriggerClientEvent('chatMessage', source, "^7[^1DiscordChatRoles^7] ^1You cannot use colored chat since you are not a donator...")
end
end
if hasRed then
-- Check if they have required role
if not has_value(allowedRed, tonumber(roleNum)) then
dontSend = true
TriggerClientEvent('chatMessage', source, "^7[^1DiscordChatRoles^7] ^1You cannot use the color RED in chat since you are not staff...")
end
end
local theirColor = chatcolorTracker[source];
local finalMessage = msg;
if theirColor ~= nil then
finalMessage = ''
local indCount = 1;
for j = 1, #msg do
if indCount > #theirColor then
indCount = 1;
end
local char = msg:sub(j, j);
finalMessage = finalMessage .. theirColor[indCount] .. char;
indCount = indCount + 1;
end
end
if not dontSend then
--TriggerClientEvent('chatMessage', -1, roleStr .. name .. "^7: " .. finalMessage)
if (sendBlockMessages) then
sendMsg(roleStr .. name .. "^7: ", finalMessage, -1);
else
TriggerClientEvent('chatMessage', -1, roleStr .. name .. "^7: " .. finalMessage);
end
end
elseif has_value(inStaffChat, GetPlayerIdentifiers(source)[1]) and not string.find(args[1], "/") and not (chatNotEnabled[src] ~= nil) then
-- Run client event for all and check perms
CancelEvent()
msg = "^7[^1StaffChat^7] ^5(^1" .. name .. "^5) ^9" .. msg
TriggerClientEvent('Permissions:CheckPermsClient', -1, msg)
--print("It gets here 1")
end
end)
RegisterNetEvent('Print:PrintDebug')
AddEventHandler('Print:PrintDebug', function(msg)
print(msg)
TriggerClientEvent('chatMessage', source, "^7[^1Badger's Scripts^7] ^1DEBUG ^7" .. msg)
end)
inStaffChat = {}
RegisterNetEvent("DiscordChatRoles:CheckPerms")
AddEventHandler("DiscordChatRoles:CheckPerms", function(msg)
-- Check if they have permissions
--print("It gets to start")
local src = source
if IsPlayerAceAllowed(src, "StaffChat.Toggle") then
TriggerClientEvent('chatMessage', src, msg)
--print("It gets to end")
else
-- Doesn't have perms
end
end)
RegisterCommand("staffchat", function(source, args, rawCommand)
-- Check if they can run the command
if IsPlayerAceAllowed(source, "StaffChat.Toggle") then
if #args == 1 then
if args[1] == "toggle" then
-- Turn off their staffchat and return
TriggerClientEvent('DiscordChatRoles:StaffChat:Toggle', source)
return
end
end
if not has_value(inStaffChat, GetPlayerIdentifiers(source)[1]) then
table.insert(inStaffChat, GetPlayerIdentifiers(source)[1])
TriggerClientEvent('chatMessage', source, "^7[^1StaffChat^7] ^5StaffChat has been toggled ^2ON")
else
table.remove(inStaffChat, get_index(inStaffChat, GetPlayerIdentifiers(source)[1]))
TriggerClientEvent('chatMessage', source, "^7[^1StaffChat^7] ^5StaffChat has been toggled ^1OFF")
end
end
end)
RegisterCommand("sc", function(source, args, rawCommand)
-- Check if they can run the command
if IsPlayerAceAllowed(source, "StaffChat.Toggle") then
if #args == 1 then
if args[1] == "toggle" then
-- Turn off their staffchat and return
TriggerClientEvent('DiscordChatRoles:StaffChat:Toggle', source)
return
end
end
if not has_value(inStaffChat, GetPlayerIdentifiers(source)[1]) then
table.insert(inStaffChat, GetPlayerIdentifiers(source)[1])
TriggerClientEvent('chatMessage', source, "^7[^1StaffChat^7] ^5StaffChat has been toggled ^2ON")
else
table.remove(inStaffChat, get_index(inStaffChat, GetPlayerIdentifiers(source)[1]))
TriggerClientEvent('chatMessage', source, "^7[^1StaffChat^7] ^5StaffChat has been toggled ^1OFF")
end
end
end)
AddEventHandler("playerDropped", function()
if has_value(inStaffChat, GetPlayerIdentifiers(source)[1]) then
table.remove(inStaffChat, get_index(inStaffChat, GetPlayerIdentifiers(source)[1]))
end
end)