You missed a very important step in your script.
FilterStringAsync doesn't return String, it returns an Instance (I like to call it "TextObject")
And then, you have to use :GetChatForUserAsync() or :GetNonChatStringForBroadcastAsync() to get the filtered String.
Example script:
local function getTextObject(message, fromPlayerId)
local textObject
local success, errorMessage = pcall(function()
textObject = TextService:FilterStringAsync(message, fromPlayerId)
end)
if success then
return textObject
end
return false
end
local function getFilteredBCMessage(textObject)
local filteredMessage
local success, errorMessage = pcall(function()
filteredMessage = textObject:GetNonChatStringForBroadcastAsync()
end)
if success then
return filteredMessage
end
return false
end
local function FilterString(senderName, msg)
if msg then
local sender = game.Players:FindFirstChild(senderName)
local messageObject = getTextObject(msg, sender.UserId)
if messageObject then
local filteredMessage = getFilteredBCMessage(messageObject)
return filteredMessage
end
else return nil
end
end
print(FilterString("Hello! This String is filtered for boardcast! 123456 <-- This should be tagged!"))
P.S. Text filtering doesn't work in studio, it only works in-game.