--///////////////// Internal-Use Methods
--//////////////////////////////////////
--DO NOT REMOVE THIS. Chat must be filtered or your game will face
--moderation.

function methods:InternalApplyRobloxFilter(speakerName, message, toSpeakerName) --// USES FFLAG
	if _SETTINGS.DisableSafeChat == true then
		return message
	else
		if (RunService:IsServer() and not RunService:IsStudio()) then
			local fromSpeaker = self:GetSpeaker(speakerName)
			local toSpeaker = toSpeakerName and self:GetSpeaker(toSpeakerName)
	
			if fromSpeaker == nil then
				return nil
			end
	
			local fromPlayerObj = fromSpeaker:GetPlayer()
			local toPlayerObj = toSpeaker and toSpeaker:GetPlayer()
	
			if fromPlayerObj == nil then
				return message
			end
	
			local filterStartTime = tick()
			local filterRetries = 0
			while true do
				local success, message = pcall(function()
					if toPlayerObj then
						return Chat:FilterStringAsync(message, fromPlayerObj, toPlayerObj)
					else
						return Chat:FilterStringForBroadcast(message, fromPlayerObj)
					end
				end)
				if success then
					return message
				else
					warn("Error filtering message:", message)
				end
				filterRetries = filterRetries + 1
				if filterRetries > MAX_FILTER_RETRIES or (tick() - filterStartTime) > MAX_FILTER_DURATION then
					self:InternalNotifyFilterIssue()
					return nil
				end
				local backoffInterval = FILTER_BACKOFF_INTERVALS[math.min(#FILTER_BACKOFF_INTERVALS, filterRetries)]
				-- backoffWait = backoffInterval +/- (0 -> backoffInterval)
				local backoffWait = backoffInterval + ((math.random()*2 - 1) * backoffInterval)
				wait(backoffWait)
			end
		else
			--// Simulate filtering latency.
			--// There is only latency the first time the message is filtered, all following calls will be instant.
			if not StudioMessageFilteredCache[message] then
				StudioMessageFilteredCache[message] = true
				wait()
			end
			return message
		end
	end
	return nil
end
