Update on Legacy Chat Deprecation and TextChatService Migration

Hi Creators,

As we announced last year, we plan to remove the legacy chat system and all creators must migrate to TextChatService by April 30th, 2025. This is to help ensure that all chat on our platform complies with our Parental Controls and Community Standards. We’ve introduced additional guidelines on what is considered chat.

How to Migrate from Legacy Chat To TextChat Service

We’ve updated our guide on how to migrate from Legacy Chat to TextChatService. You can find specific examples of how to implement key chat features inside the guide.

Notifying Affected Creators

We’ve notified affecting creators and will add banners and annotations to Roblox Studio as another way for you to see if you are affected. Below is our plan for auto-migrating experiences that don’t migrate ahead of the deadlines.

Chat Auto-Migration Plan and Timeline

Experiences currently using custom chat or a forked version of legacy chat must implement CanUserDirectChatAsync before January 30th, 2025. We will automatically migrate these experiences in February if creators do not integrate the CanUserDirectChatAsync API or migrate to TextChatService. Experiences on the standard version of the legacy chat service will have until April 30th, 2025 to migrate to TextChatService. We will begin auto-migrating these experiences starting in May.

We recommend migrating manually to TextChatService if you have any custom functionality in your chat system before the auto-migration deadlines to ensure that your experience continues to function as you intended.

Improvements to TextChatService and Added Customization

We have released a number of improvements to TextChatService including releasing UIGradients and ChannelTabs and providing guides on how to customize NPC chat. We’ve also updated our documentation on TextChatService, and added more information on migrating from Legacy Chat to TextChatService. We’re also working on improving the performance of TextChatService as well.

How can I tell if I’m using TextChatService?

If your explorer contains TextChatService and the ChatVersion=TextChatService, you are using TextChatService. We will be sending out emails and messages to creators who are not on TextChatService to notify you of the need to migrate.

Please let us know if you have any questions.

Thanks,
Roblox Chat Team

120 Likes

This topic was automatically opened after 10 minutes.

I love TextChatService, so much better than the old one!

29 Likes

I’m sorry for the developers that are using custom chat :pensive:

44 Likes

I literally just finished reading about the legacy chat :sob:

I wonder if unmaintained games will break.

22 Likes

The new chat system isn’t terrible but does anyone have a better method of figuring out if the chatbox is visible? I have a radio UI that I adjust the height of depending on if the chatbox is visible or not and with the old system I could just check the visibility directly in playergui but dont have an efficient method of doing so in this system

	StarterGui:SetCore("ChatActive", false)

	Player:SetAttribute("chatBoxHidden2", true)
	Player:SetAttribute("chatBoxHiddenConfirmed", true)
	Player:SetAttribute("lastFocus", tick())

	game:GetService("TextChatService"):FindFirstChild("ChatInputBarConfiguration"):GetPropertyChangedSignal("IsFocused"):Connect(function()
		local ChatInputBarConfiguration = game:GetService("TextChatService"):FindFirstChild("ChatInputBarConfiguration")

		if ChatInputBarConfiguration.IsFocused == false then
			local start = tick()
			Player:SetAttribute("lastFocus", start)
			Player:SetAttribute("chatBoxHidden2", false)
			Player:SetAttribute("chatBoxHiddenConfirmed", false)

			repeat
				task.wait()
			until tick() - start > 4 or Player:GetAttribute("lastFocus") ~= start or ChatInputBarConfiguration.IsFocused

			if Player:GetAttribute("lastFocus") ~= start then
				Player:SetAttribute("chatBoxHiddenConfirmed", false)
				return
			elseif ChatInputBarConfiguration.IsFocused then
				Player:SetAttribute("chatBoxHiddenConfirmed", false)
				return
			elseif tick() - start > 4 then
				Player:SetAttribute("chatBoxHidden2", true)
				Player:SetAttribute("chatBoxHiddenConfirmed", true)
			end
		else
			Player:SetAttribute("chatBoxHidden2", false)
			Player:SetAttribute("chatBoxHiddenConfirmed", false)
		end
	end)


	local lastChatActive = StarterGui:GetCore("ChatActive")
	local chatActivatedAt = nil
	local check = nil

	RunService.RenderStepped:Connect(function()
		local chatActiveNow = StarterGui:GetCore("ChatActive")

		if chatActiveNow == true and lastChatActive == false then
			Player:SetAttribute("chatBoxHiddenConfirmed", false)
			chatActivatedAt = tick()
		elseif chatActiveNow == false and lastChatActive == true then
			Player:SetAttribute("chatBoxHiddenConfirmed", true)
		end

		if chatActivatedAt and tick() - chatActivatedAt > 4 then
			local lastFocus = Player:GetAttribute("lastFocus")
			local timeSinceLastFocus = tick() - lastFocus
			local ChatInputBarConfiguration = game:GetService("TextChatService"):FindFirstChild("ChatInputBarConfiguration")

			if timeSinceLastFocus > 4 and not ChatInputBarConfiguration.IsFocused then
				StarterGui:SetCore("ChatActive", false)
				Player:SetAttribute("chatBoxHiddenConfirmed", true)
				chatActivatedAt = nil
				check = nil
			else
				check = tick()
			end
		end

		lastChatActive = chatActiveNow
	end)
26 Likes

rip any game that needs a custom chat system

31 Likes

For anyone using LegacyChat, that feel like still using LegacyChat:

(Includes a more modern look, bug fixes and features)


Why is TextChannel:SetDirectChatRequester() returning the error “:SetDirectChatRequester() is not enabled”? That api should be working by now, unless (we) got something wrong

22 Likes

One aspect of the “migration” component that’s worth delving into more detail is the mechanics on how it is intended to work.

The current strategy is not to simply set the TextChatService.ChatVersion to TextChatService, as that has a potential of breaking and disrupting many older experiences.

Instead we are exploring a “compatibility mode” that will continue running your old legacy chat scripts in the background but preventing them from being visible. This will work most often if your chats are integrated well into the top bar’s chat button. In case we cannot hide your old chat, we also plan to no-opt the ChatService:FilterStringAsync and TextFilterResult:GetChatForUserAsync responses to be an empty string. The plan is to instead show the default TextChatService UI in place so users can still socialize in experiences that were not able to be updated in time.

Running two versions of chat in an experience is non-ideal, even if one is hidden, so we do ask that if creators can they manually migrate to TextChatService for the best results, however Roblox is committed to backwards compatibility.

31 Likes

finally…

though… where are meshpart emission maps (:pray::pray::pray: please roadblocks i need this)

also how would this be applied? disable chat for those who are on the list? disable messages for those who sent it from the list???

16 Likes

Will the legacy Chatted event be deprecated or broken after the deadline? Whilst my game now uses the new TextChatService, I still rely on the Chatted event in a few places within my game for it to function correctly.

14 Likes

Cue everyone not understanding that you can still use custom chats with this, you just have to pipe messages through TextChatService.

21 Likes

yeah chatted event is completely broken for textchat
so you have to change it to onincomingmessage

14 Likes

Very nice, i love textchatservice. Keep up the good work!!

15 Likes

TextChatService may be new, but some games rely on legacy because of its certain features.

Not a fan of this.

18 Likes

Any hope and plans on fixing this

And adding a feature to update text properties live, instead of each time when hovering over chat?

19 Likes

Re-posting these feature-requests since the current state of TextChatService still unfortunately does not cover my needed use-cases. It’d be ideal to at-the-minmum exclude these sort of cases for needing to use TextChatService until a more solid solution can be implemented:

17 Likes

I really dont like how Roblox have still not achnowledged the lack of functionality parity and huge performance and API issues with the new chat service, despite many developers stating them in the previous post about this change.

No organisation should start a change or migration of a critical service before it can fully replicate all functions of the old system, and yet TextChatService very much fails this key checkbox required for any technical change.

15 Likes

Our released game uses animated UIgradients in the chat, which right now isn’t possible—so I’d like to ask again to keep this as a high-priority feature.
I’d also like to mention that it seems you aren’t able to add UIgradients to the actual message, and only to the prefixed text. We worked around this by setting the text to “ “ (setting it to “” caused it to still render the default text), and setting the prefix text to the actual message content.

17 Likes

Could you please update the dialog ui

15 Likes