ChatColor script not working, no errors or warning displayed

Hello. I’m using Roblox’s ExtraDataInitializer script in order to make some chat scripts for my group. I’ve completed it all, no errors in the script editor and no errors or warnings in the output. If someone can take a look at this it’ll be awesome!

--	// FileName: ExtraDataInitializer.lua
--	// Written by: Xsitsu
--	// Description: Module that sets some basic ExtraData such as name color, and chat color.

local SpecialChatColors = {
	Groups = {
		{
			--- ROBLOX Interns group
			GroupId = 2868472,
			Rank = 100,
			ChatColor = Color3.new(175/255, 221/255, 1),
			
			{
			},
			
			--- ROBLOX Admins group
			GroupId = 1200769,
			ChatColor = Color3.new(1, 215/255, 0),
			
			{
			},
			
			-- Names Association Moderator team
			GroupId = 5446607,
			Rank = 207,
			ChatColor = Color3.new(89, 34, 89),
			
			{
			},
			
			-- Names Association Administration team
			GroupId = 5446607,
			Rank = 212,
			ChatColor = Color3.new(13, 105, 172),
			
			{
			},

			-- Names Association Super High Rank (SHR)
			GroupId = 5446607,
			Rank = 215,
			ChatColor = Color3.new(196, 40, 28),
			
			{
			},

			-- Names Association Developer team
			GroupId = 5446607,
			Rank = 218,
			ChatColor = Color3.new(177, 229, 166),
			
			{
			},
	
			-- Names Vice-Chairman
			GroupId = 5446607,
			Rank = 254,
			ChatColor = Color3.new(255, 255, 0),
			
			{
			},
	
			-- Names Chairman
			GroupId = 5446607,
			Rank = 255,
			ChatColor = Color3.new(255, 176, 0),
		}
	},
	Players = {
		{
			-- Left as an example
			-- UserId = 12345678,
			-- ChatColor = Color3.new(255,255,255)
		}
	}
}

local function MakeIsInGroup(groupId, requiredRank)
	assert(type(requiredRank) == "nil" or type(requiredRank) == "number", "requiredRank must be a number or nil")

	return function(player)
		if player and player.UserId then
			local userId = player.UserId

			local inGroup = false
			local success, err = pcall(function() -- Many things can error is the IsInGroup check
				if requiredRank then
					inGroup = player:GetRankInGroup(groupId) > requiredRank
				else
					inGroup = player:IsInGroup(groupId)
				end
			end)
			if not success and err then
				print("Error checking in group: " ..err)
			end

			return inGroup
		end

		return false
	end
end

local function ConstructIsInGroups()
	if SpecialChatColors.Groups then
		for _, group in pairs(SpecialChatColors.Groups) do
			group.IsInGroup = MakeIsInGroup(group.GroupId, group.Rank)
		end
	end
end
ConstructIsInGroups()

local Players = game:GetService("Players")

local function GetSpecialChatColor(speakerName)
	if SpecialChatColors.Players then
		local playerFromSpeaker = Players:FindFirstChild(speakerName)
		if playerFromSpeaker then
			for _, player in pairs(SpecialChatColors.Players) do
				if playerFromSpeaker.UserId == player.UserId then
					return player.ChatColor
				end
			end
		end
	end
	if SpecialChatColors.Groups then
		for _, group in pairs(SpecialChatColors.Groups) do
			if group.IsInGroup(Players:FindFirstChild(speakerName)) then
				return group.ChatColor
			end
		end
	end
end

local function Run(ChatService)
	local NAME_COLORS =
	{
		Color3.new(253/255, 41/255, 67/255), -- BrickColor.new("Bright red").Color,
		Color3.new(1/255, 162/255, 255/255), -- BrickColor.new("Bright blue").Color,
		Color3.new(2/255, 184/255, 87/255), -- BrickColor.new("Earth green").Color,
		BrickColor.new("Bright violet").Color,
		BrickColor.new("Bright orange").Color,
		BrickColor.new("Bright yellow").Color,
		BrickColor.new("Light reddish violet").Color,
		BrickColor.new("Brick yellow").Color,
	}

	local function GetNameValue(pName)
		local value = 0
		for index = 1, #pName do
			local cValue = string.byte(string.sub(pName, index, index))
			local reverseIndex = #pName - index + 1
			if #pName%2 == 1 then
				reverseIndex = reverseIndex - 1
			end
			if reverseIndex%4 >= 2 then
				cValue = -cValue
			end
			value = value + cValue
		end
		return value
	end

	local color_offset = 0
	local function ComputeNameColor(pName)
		return NAME_COLORS[((GetNameValue(pName) + color_offset) % #NAME_COLORS) + 1]
	end

	local function GetNameColor(speaker)
		local player = speaker:GetPlayer()
		if player then
			if player.Team ~= nil then
				return player.TeamColor.Color
			end
		end
		return ComputeNameColor(speaker.Name)
	end

	local function onNewSpeaker(speakerName)
		local speaker = ChatService:GetSpeaker(speakerName)
		if not speaker:GetExtraData("NameColor") then
			speaker:SetExtraData("NameColor", GetNameColor(speaker))
		end
		if not speaker:GetExtraData("ChatColor") then
			local specialChatColor = GetSpecialChatColor(speakerName)
			if specialChatColor then
				speaker:SetExtraData("ChatColor", specialChatColor)
			end
		end
		if not speaker:GetExtraData("Tags") then
			--// Example of how you would set tags
			--[[
			local tags = {
				{
					TagText = "VIP",
					TagColor = Color3.new(1, 215/255, 0)
				},
				{
					TagText = "Alpha Tester",
					TagColor = Color3.new(205/255, 0, 0)
				}
			}
			speaker:SetExtraData("Tags", tags)
			]]
			speaker:SetExtraData("Tags", {})
		end
	end

	ChatService.SpeakerAdded:connect(onNewSpeaker)

	for _, speakerName in pairs(ChatService:GetSpeakerList()) do
		onNewSpeaker(speakerName)
	end

	local PlayerChangedConnections = {}
	Players.PlayerAdded:connect(function(player)
		local changedConn = player.Changed:connect(function(property)
			local speaker = ChatService:GetSpeaker(player.Name)
			if speaker then
				if property == "TeamColor" or property == "Neutral" or property == "Team" then
					speaker:SetExtraData("NameColor", GetNameColor(speaker))
				end
			end
		end)
		PlayerChangedConnections[player] = changedConn
	end)

	Players.PlayerRemoving:connect(function(player)
		local changedConn = PlayerChangedConnections[player]
		if changedConn then
			changedConn:Disconnect()
		end
		PlayerChangedConnections[player] = nil
	end)
end

return Run

Thanks,
Schedency

I mean you could use this but I’m not sure if this is what you really wanted

-- Variables
local RunService = game:GetService("RunService")
local ServerScriptService = game:GetService("ServerScriptService")

local ChatService = require(ServerScriptService:WaitForChild("ChatServiceRunner"):WaitForChild("ChatService"))

-- Group Table
local Group_Table = {
    {
        ["Id"] = 123456 -- Change this to the groupId
        ["Rank"] = 255 -- Change this to the rank
        ["Color"] = Color3.fromRGB(255, 255, 255) -- Change this to any color
    }
}

-- Hook to PlayerAdded
ChatService.Speaker:Connect(function(Speaker)
    local Player = Speaker:GetPlayer()

    if (Player) then
        for _, Group in next, Group_Table do
            if (Player:GetRankInGroup(Group["Id"]) == Group["Rank"]) then
                Speaker:SetExtraData("Tags", {{TagText = "Text", TagColor = Group["Color"]}})
            end
        end
    end
end)
2 Likes

Can you gives us exactly what’s not working? It’s not suitable to just throw in a very long script and just say “it’s not working”. What was this script supposed to do? It seems to be taken from somewhere else, so makebsure eveeything is correct.

Also, Color3.new() is supposed to take in 3 components between 0 and 1, use Color3.fromRGB() instead which takes in a number from 0 to 255

2 Likes

It was supposed to when a user sent a message, their text in the chat will be that color.

It is also taken from the Roblox’s Chat Scripts, ExtraDataInitializer.

Mark my reply as a result or tell me what you would like. This helps out other people know that you’ve got your solution.

2 Likes