I don't understand the Roblox Chat Filter even with the wiki. If anyone has the time, please sit down and help me with this code and explain filtering to me. The code below is my current chat script but it has more in the GUI, I just need to know how to add a Filter. I appreciate it!

local Chat = {
	ChatColors = {
		BrickColor.new("Bright red");
		BrickColor.new("Bright blue");
		BrickColor.new("White");
		BrickColor.new("Bright violet");
		BrickColor.new("Bright orange");
		BrickColor.new("Bright yellow");
		BrickColor.new("Light reddish violet");
		BrickColor.new("Brick yellow");
	};

	Gui = nil;
	Frame = nil;
	RenderFrame = nil;
	TapToChatLabel = nil;
	ClickToChatButton = nil;
	Templates = nil;
	EventListener = nil;
	MessageQueue = {};
	
	Configuration = {								
		FontSize = Enum.FontSize.Size12;	
		NumFontSize = 12;
		HistoryLength = 20;
		Size = UDim2.new(0.38, 0, 0.20, 0);
		MessageColor = Color3.new(1, 1, 1);
		AdminMessageColor = Color3.new(1, 215/255, 0);
		XScale = 0.025;
		LifeTime = 45;
		Position = UDim2.new(0, 2, 0.05, 0);
		DefaultTweenSpeed = 0.15;							
	};
	
	CachedSpaceStrings_List = {};
	Messages_List = {};
	MessageThread = nil;
	TempSpaceLabel = nil;
}

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%8
end 

function Chat:ComputeChatColor(pName)
	return self.ChatColors[GetNameValue(pName) + 1].Color
end 

function Chat:UpdateQueue(field, diff)	 				
	for i = #self.MessageQueue, 1, -1 do 			
		if self.MessageQueue[i] then 						
			for _, label in pairs(self.MessageQueue[i]) do 						
				if label and type(label) ~= 'table' and type(label) ~= 'number' then					
					if label:IsA('TextLabel') or label:IsA('TextButton') then 	
						if diff then 
							label.Position = label.Position - UDim2.new(0, 0, diff, 0) 
						else											
							if field == self.MessageQueue[i] then 						
								label.Position = UDim2.new(self.Configuration.XScale, 0, label.Position.Y.Scale - field['Message'].Size.Y.Scale , 0)
								Spawn(function()
									wait(0.05)							
									while label.TextTransparency >= 0 do 
										label.TextTransparency = label.TextTransparency - 0.2
										wait() 
									end 	
									label.TextStrokeTransparency = (label == field['Message']) and .8 or 1	
								end)
							else 							
								label.Position = UDim2.new(self.Configuration.XScale, 0, label.Position.Y.Scale - field['Message'].Size.Y.Scale, 0)							
							end  
							if label.Position.Y.Scale < -0.01 then 							
								label.Visible = false 						
								label:Destroy() 
							end 
						end 
					end 
				end 						
			end 
		end 
	end	
end 

function Chat:ComputeSpaceString(pLabel)
	local nString = " "
	if not self.TempSpaceLabel then 
		self.TempSpaceLabel = self.Templates.SpaceButton
		self.TempSpaceLabel.Size = UDim2.new(0, pLabel.AbsoluteSize.X, 0, pLabel.AbsoluteSize.Y); 
	end
	self.TempSpaceLabel.Text = nString
	while self.TempSpaceLabel.TextBounds.X < pLabel.TextBounds.X do 
		nString = nString .. " "
		self.TempSpaceLabel.Text = nString 				
	end 
	nString = nString .. " "
	self.CachedSpaceStrings_List[pLabel.Text] = nString 
	self.TempSpaceLabel.Text = ""
	return nString	
end


function Chat:UpdateChat(cPlayer, message)
	local messageField = {['Player'] = cPlayer,['Message'] = message}	
	if coroutine.status(Chat.MessageThread) == 'dead' then 				
		table.insert(Chat.Messages_List, messageField)				
		Chat.MessageThread = coroutine.create(function ()
			for i = 1, #Chat.Messages_List do 	
				local field = Chat.Messages_List[i]																														
				Chat:CreateMessage(field['Player'], field['Message']) 						
			end 
			Chat.Messages_List = {}									
		end)
		coroutine.resume(Chat.MessageThread)
	else 
		table.insert(Chat.Messages_List, messageField)
	end 
end 

function Chat:CreateMessage(cPlayer, message)		
	local pName = cPlayer ~= nil and cPlayer.Name or 'GAME'	
	message = message:gsub("^%s*(.-)%s*$", "%1")		
	self.MessageQueue[#self.MessageQueue] = (#self.MessageQueue > self.Configuration.HistoryLength) and nil or self.MessageQueue[#self.MessageQueue]
	local pLabel = self.Templates.pLabel:clone()
	pLabel.Name = pName;
	pLabel.Text = pName .. ":";
	pLabel.Parent = self.RenderFrame;			
	pLabel.TextColor3 = (cPlayer.Neutral) and Chat:ComputeChatColor(pName) or cPlayer.TeamColor.Color 
	local nString = self.CachedSpaceStrings_List[pName] or Chat:ComputeSpaceString(pLabel)
	local mLabel = self.Templates.mLabel:clone()
	mLabel.Name = pName .. ' - message';					
	mLabel.TextColor3 = Chat.Configuration.MessageColor;					
	mLabel.Text = nString .. message;
	mLabel.Parent = self.RenderFrame;	
	local heightField = mLabel.TextBounds.Y	
	mLabel.Size = UDim2.new(1, 0, heightField/self.RenderFrame.AbsoluteSize.Y, 0)	
	pLabel.Size = mLabel.Size
	local yPixels = self.RenderFrame.AbsoluteSize.Y
	local yFieldSize = mLabel.TextBounds.Y
	local queueField = {}	
	queueField['Player'] = pLabel 
	queueField['Message'] = mLabel 
	queueField['SpawnTime'] = tick()
	table.insert(self.MessageQueue, 1, queueField)		
	Chat:UpdateQueue(queueField)
end

function Chat:CreateChatBar()	
	self.ClickToChatButton = self.Gui:WaitForChild("ClickToChat")
	self.ChatBar = self.Gui:WaitForChild("ChatBar")
	self.ClickToChatButton.Visible = true
	self.ChatBar.Visible = true
	local mouse = game.Players.LocalPlayer:GetMouse()
	mouse.KeyDown:connect(function (key)
		if key == '/' then
			self.ClickToChatButton.Visible = false
			self.ChatBar:CaptureFocus()
		end
	end)
	self.ClickToChatButton.MouseButton1Click:connect(function ()
		self.ClickToChatButton.Visible = false
		self.ChatBar:CaptureFocus()
	end)	
end

function Chat:PlayerChat(message)
	local m = Instance.new("StringValue")
	m.Name = "NewMessage"
	m.Value = message
	m.Parent = game.Players.LocalPlayer
	game:GetService("Debris"):AddItem(m,2)
end

function Chat:CreateGui()
	self.Gui = script.Parent
	self.Frame = self.Gui:WaitForChild("ChatFrame")
	self.RenderFrame = self.Frame:WaitForChild("ChatRenderFrame")
	self.Templates = self.Gui:WaitForChild("Templates")	
	Chat:CreateChatBar()
	self.ChatBar.FocusLost:connect(function(enterPressed)
		if enterPressed and self.ChatBar.Text ~= "" then 
			local cText = self.ChatBar.Text
			if string.sub(self.ChatBar.Text, 1, 1)  == '%' then 
				cText = '(TEAM) ' .. string.sub(cText, 2, #cText)
			end
			Chat:PlayerChat(cText)											
			if self.ClickToChatButton then 
				self.ClickToChatButton.Visible = true 
			end 
			self.ChatBar.Text = ""	
			self.ClickToChatButton.Visible = true							
		end	
	end)	
end

function Chat:TrackPlayerChats()
	local function chatRegister(p)
		p.ChildAdded:connect(function (obj)
			if obj:IsA("StringValue") and obj.Name == "NewMessage" then
				if game.Players.LocalPlayer.Neutral or p.TeamColor == game.Players.LocalPlayer.TeamColor then
					Chat:UpdateChat(p, obj.Value)
				end
			end
		end)
	end
	for _,v in pairs(game.Players:GetPlayers()) do
		chatRegister(v)
	end
	game.Players.PlayerAdded:connect(chatRegister)
end

function Chat:CullThread()
	Spawn(function ()
		while true do 
			if #self.MessageQueue > 0 then 
				for _, field in pairs(self.MessageQueue) do 				
					if field['SpawnTime'] and field['Player'] and field['Message'] and tick() - field['SpawnTime'] > self.Configuration.LifeTime then 
						field['Player'].Visible = false 
						field['Message'].Visible = false 
					end 
				end 
			end 
			wait(5)
		end
	end)
end

function Chat:Initialize()			
	Chat:CreateGui()
	Chat:TrackPlayerChats()
	self.MessageThread = coroutine.create(function () end)
						 coroutine.resume(self.MessageThread)
	Chat:CullThread()
end

Chat:Initialize()

Oh, if you also find any errors in this or something that could make it better, please let me know! I appreciate it!

7 comments

0

I take no credit for this Chat GUI as it is a collaboration between me and another Scripter.

0

I would help you if I had studio but rn I can't use it , but your script is really long and not many people will be willing to help ....

0

246 lines of code with no comments....

0

I understand, I guess.....

0

It should be Color3 instead of BrickColor as it is normally used for Parts only

0

Does not matter. Both of them will work just fine.