Aplicada a várias fontes e entradas, a filtragem de texto impede que os usuários vejam linguagem inadequada e informações pessoalmente identificáveis, como números de telefone. O Roblox filtra automaticamente saídas de texto comuns, como mensagens que passaram pelo chat de texto no jogo, mas você é responsável por filtrar qualquer texto exibido que você não tenha controle explícito.
Cenários de filtragem
O texto pode ser coletado e/ou exibido para os usuários em uma variedade de cenários, incluindo:
Um jogo que coleta a entrada de texto dos usuários através de entradas TextBox, uma GUI personalizada com botões, como uma interface de teclado/painel numérico, ou um modelo de teclado interativo no espaço 3D.
Um jogo que gera palavras a partir de caracteres aleatórios e as exibe para os usuários, já que há a chance de criar palavras inadequadas.
Um jogo que se conecta a um servidor web externo para buscar conteúdo que é exibido no jogo. Muitas vezes, você não terá controle sobre o conteúdo do site externo e um terceiro pode editar as informações.
Um jogo que armazena texto, como os nomes dos pets dos usuários, usando data stores, onde o texto armazenado pode incluir palavras inadequadas que devem ser filtradas ao recuperá-las.
Processo de filtragem
TextService:FilterStringAsync() filtra o texto no jogo, recebendo uma string de texto e o UserId do usuário que criou o texto como entrada. Ele retorna um objeto TextFilterResult que possui dois métodos adicionais que você pode chamar em diferentes cenários:
- TextFilterResult:GetNonChatStringForBroadcastAsync() para filtrar texto visível para todos os usuários em um jogo, como para um diálogo que permite que um usuário escreva uma mensagem em uma placa visível para todos os usuários no servidor.
- TextFilterResult:GetNonChatStringForUserAsync() para exibir texto filtrado para um usuário específico, com base na idade e outros detalhes.
No contexto da entrada TextBox, o seguinte exemplo coleta a entrada no evento FocusLost e a envia para o servidor através de um RemoteEvent. No servidor, ela é filtrada primeiro através de FilterStringAsync() e depois GetNonChatStringForBroadcastAsync() com a intenção de que o texto seja exibido para todos os usuários em um objeto do lado do servidor, como um SurfaceGui no mundo 3D.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local textBox = script.Parent
textBox.ClearTextOnFocus = false
textBox.PlaceholderText = "..."
textBox.TextXAlignment = Enum.TextXAlignment.Left
textBox.TextScaled = true
-- RemoteEvent para enviar a entrada de texto para o servidor para filtragem
local inputRemoteEvent = ReplicatedStorage:FindFirstChild("InputRemoteEvent")
-- Manipulador de eventos para foco perdido e tecla enter pressionada
local function onFocusLost(enterPressed, inputObject)
if enterPressed then
print("ENVIADO:", textBox.Text)
if inputRemoteEvent then
inputRemoteEvent:FireServer(textBox.Text)
end
end
end
textBox.FocusLost:Connect(onFocusLost)local TextService = game:GetService("TextService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- RemoteEvent para receber a entrada de texto do cliente para filtragem
local inputRemoteEvent = ReplicatedStorage:FindFirstChild("InputRemoteEvent")
local function getFilterResult(text, fromUserId)
local filterResult
local success, errorMessage = pcall(function()
filterResult = TextService:FilterStringAsync(text, fromUserId)
end)
if success then
return filterResult
else
warn("Erro ao gerar TextFilterResult:", errorMessage)
end
end
-- Disparado quando o cliente envia a entrada do TextBox
local function onInputReceived(player, text)
if text ~= "" then
local filterResult = getFilterResult(text, player.UserId)
if filterResult then
local success, filteredText = pcall(function()
return filterResult:GetNonChatStringForBroadcastAsync()
end)
if success then
print("FILTRADO:", filteredText)
else
warn("Erro ao filtrar texto!")
end
end
end
end
inputRemoteEvent.OnServerEvent:Connect(onInputReceived)