Aplicado a diversas fuentes y entradas, el filtrado de texto evita que los usuarios vean lenguaje inapropiado e información de identificación personal como números de teléfono. Roblox filtra automáticamente salidas de texto comunes, como mensajes que han pasado por el chat de texto en la experiencia, pero tú eres responsable de filtrar cualquier texto mostrado sobre el que no tienes control explícito.
Escenarios de filtrado
El texto puede ser recopilado y/o mostrado a los usuarios en una variedad de escenarios, incluyendo:
Una experiencia que recopila la entrada de texto de los usuarios a través de entradas de TextBox, una GUI personalizada con botones como una interfaz de teclado/pad, o un modelo de teclado interactivo en el espacio 3D.
Una experiencia que genera palabras a partir de caracteres aleatorios y las muestra a los usuarios, ya que existe la posibilidad de que cree palabras inapropiadas.
Una experiencia que se conecta a un servidor web externo para recuperar contenido que se muestra dentro de la experiencia. A menudo no tendrás control sobre el contenido del sitio externo y un tercero puede editar la información.
Una experiencia que almacena texto, como los nombres de las mascotas de los usuarios, utilizando almacenes de datos, donde el texto almacenado puede incluir palabras inapropiadas que deben ser filtradas al recuperarlas.
Proceso de filtrado
TextService:FilterStringAsync() filtra el texto dentro de la experiencia tomando un string de texto y el UserId del usuario que creó el texto como entrada. Devuelve un objeto TextFilterResult que tiene dos métodos adicionales que puedes llamar en diferentes escenarios:
- TextFilterResult:GetNonChatStringForBroadcastAsync() para filtrar texto visible para todos los usuarios en una experiencia, como para un diálogo que permite a un usuario escribir un mensaje en un cartel visible para todos los usuarios en el servidor.
- TextFilterResult:GetNonChatStringForUserAsync() para mostrar texto filtrado para un usuario específico, basado en la edad y otros detalles.
En el contexto de la entrada de TextBox, el siguiente ejemplo recoge la entrada en el evento FocusLost y la envía al servidor a través de un RemoteEvent. En el servidor, primero se filtra a través de FilterStringAsync() y luego GetNonChatStringForBroadcastAsync() con la intención de que el texto se muestre a todos los usuarios en un objeto del lado del servidor como un SurfaceGui en el mundo 3D.
Filtrado de entrada de texto - Script del cliente
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 la entrada de texto al servidor para filtrado
local inputRemoteEvent = ReplicatedStorage:FindFirstChild("InputRemoteEvent")
-- Manejador de eventos para cuando se pierde el foco y se presiona enter
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)
Filtrado de entrada de texto - Script del servidor
local TextService = game:GetService("TextService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- RemoteEvent para recibir la entrada de texto del cliente para filtrado
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("Error generando TextFilterResult:", errorMessage)
end
end
-- Se activa cuando el cliente envía la entrada del 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("Error filtrando texto!")
end
end
end
end
inputRemoteEvent.OnServerEvent:Connect(onInputReceived)