تُطبق على مصادر ومدخلات متنوعة، تصفية النصوص تمنع المستخدمين من رؤية اللغة غير المناسبة والمعلومات الشخصية القابلة للتحديد مثل أرقام الهواتف. تقوم Roblox تلقائيًا بتصفية المخرجات النصية الشائعة مثل الرسائل التي مرت عبر دردشة النص داخل اللعبة، ولكن أنت مسؤول عن تصفية أي نص معروض لا تملك تحكمًا صريحًا عليه.
سيناريوهات التصفية
يمكن جمع النصوص و/أو عرضها على المستخدمين في مجموعة متنوعة من السيناريوهات، بما في ذلك:
لعبة تولد كلمات من أحرف عشوائية وتعرضها على المستخدمين، حيث هناك احتمال أن تنتج كلمات غير مناسبة.
لعبة تتصل بخادم ويب خارجي لجلب محتوى يتم عرضه داخل اللعبة. غالبًا لن يكون لديك تحكم على محتوى الموقع الخارجي ويمكن لطرف ثالث تعديل المعلومات.
لعبة تخزن نصوصًا مثل أسماء حيوانات المستخدمين باستخدام مخازن البيانات، حيث قد تتضمن النصوص المخزنة كلمات غير مناسبة يجب تصفيتها عند استرجاعها.
عملية التصفية
TextService:FilterStringAsync() تصفّي النصوص داخل اللعبة من خلال أخذ سلسلة نصية وUserId للمستخدم الذي أنشأ النص كمدخلات. تعيد كائن TextFilterResult الذي يحتوي على طريقتين إضافيتين يمكنك استدعاؤهما في سيناريوهات مختلفة:
- TextFilterResult:GetNonChatStringForBroadcastAsync() لتصفية النصوص المرئية لجميع المستخدمين في اللعبة، مثل حوار يسمح للمستخدم بكتابة رسالة على لافتة مرئية لجميع المستخدمين على الخادم.
- TextFilterResult:GetNonChatStringForUserAsync() لعرض نصوص مصفاة لمستخدم محدد واحد، بناءً على العمر وتفاصيل أخرى.
في سياق إدخال TextBox، يجمع المثال التالي المدخلات عند حدث FocusLost ويرسلها إلى الخادم من خلال RemoteEvent. على الخادم، يتم تصفيتها أولاً من خلال FilterStringAsync() ثم GetNonChatStringForBroadcastAsync() مع نية أن يتم عرض النص لجميع المستخدمين على كائن جانب الخادم مثل SurfaceGui في العالم ثلاثي الأبعاد.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local textBox = script.Parent
textBox.ClearTextOnFocus = false
textBox.PlaceholderText = "..."
textBox.TextXAlignment = Enum.TextXAlignment.Left
textBox.TextScaled = true
-- RemoteEvent لإرسال إدخال النص إلى الخادم للتصفية
local inputRemoteEvent = ReplicatedStorage:FindFirstChild("InputRemoteEvent")
-- معالج الحدث لفقدان التركيز وضغط زر الإدخال
local function onFocusLost(enterPressed, inputObject)
if enterPressed then
print("تم الإرسال:", 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 لاستقبال إدخال النص من العميل للتصفية
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("خطأ في توليد TextFilterResult:", errorMessage)
end
end
-- يتم استدعاؤه عندما يقدم العميل الإدخال من 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("تم تصفيته:", filteredText)
else
warn("خطأ في تصفية النص!")
end
end
end
end
inputRemoteEvent.OnServerEvent:Connect(onInputReceived)