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.
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)
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
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.
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.
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:
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.
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.