[Update] November 7, 2024
[Update] November 1, 2024
Hi Creators,
Chat is essential to the Roblox experience, and we’re committed to ensuring everyone has a safe experience while communicating on the platform. As part of that effort, we are making changes to how in-experience chat works on our platform:
-
Legacy chat system will be removed by April 30th, 2025.
-
Starting November 30th, 2024, new experiences can not be created that use the legacy chat system.
-
We’re updating our Community Standards to require that creators use TextChatService, creators will have until April 30th, 2025 to migrate.
- [Updated Nov 1, 2024]: For experiences that do not migrate by this deadline, we will attempt to automatically migrate experiences that do not comply. If that is unsuccessful, we’ll attempt to disable chat for those experiences until the experience is migrated to TextChatService.
-
If your in-experience chat is built using a modified version of legacy chat system or a custom chat solution not powered by TextChatService,
-
Action needed: You must integrate with CanUserDirectChatAsync (coming by November 15th) API by January 30th, 2025. This API checks whether a user can receive or send direct chats.
-
[Updated Nov 1, 2024] For experiences that do not implement this API by this deadline, we will attempt to automatically migrate experiences that do not comply. If that is unsuccessful, we’ll attempt to disable chat for those experiences until the experience is migrated to TextChatService
-
-
In rare cases, we may have to restrict access to the experience until the experience is migrated to TextChatService if auto-migration and disabling chat does not work.
Why we are making these changes
We are implementing a parental controls update to give parents more control over their children’s in-experience chat. Currently, TextChatService and standard legacy chat systems will support these settings by default but modified legacy or fully custom chat solutions will not, so we are introducing an additional API, CanUserDirectChatAsync, which controls whether users can see direct chat for creators using these systems to integrate. It is important that all experiences on Roblox respect parental settings.
Our rationale for requiring you to migrate to TextChatService goes beyond the parental controls update:
-
As laws and regulations evolve, we want to work with you to ensure your experiences comply with these local laws.
-
We plan to continue evolving our safety platform to ensure we build the most robust safety solutions, especially for our youngest users.
-
Migrating everyone to a Roblox-maintained TextChatService helps us ensure that we can make the needed changes to comply with these requirements on your behalf without having you make changes to your integration.
Ultimately, in the long run, we can save you time from constantly implementing new requirements.
We launched TextChatService and have been focused on improving it to solve your most common use cases including real-time chat translation which helps drive experience engagement. Additionally, we will be adding ChannelTabs and UI gradients support next week. We’re continuing to focus on improving its performance, especially for bubble chat.
[Updated Nov 1, 2024] APIs for Managing Access to In-Experience Chat
Historically, we have had the CanUserChatAsync API for managing whether users can access in-experience chat. This capability has been built into TextChatService and the legacy chat system. If you’ve been using either of those systems, your chat should respect this setting. As mentioned above we’re introducing more parental controls to give even more granular control over whether users can direct chat in-experience. We’re introducing the new API: CanUserDirectChatAsync which will return whether a user can direct chat within experience. This API will be automatically integrated into TextChatService and standard, non-forked legacy chat system. However, creators that have forked legacy chat or built fully custom chat will need to integrate this manually. We spell this out in more detail in the scenarios below.
CanUserChatAsync API | CanUserDirectChatAsync API | |
---|---|---|
Usage | Controls access to all in-experience chat | Controls access to direct chat in-experience |
Availability | Live | Coming November 15th, 2024 |
Built-into TextChatService | Yes | Yes |
Built into standard Legacy Chat | Yes | Yes |
Built into forked legacy chat | Yes | No |
Built into custom chat that doesn’t use legacy chat or TextChatService APis | No | No |
Experiences using a modified legacy chat system or custom chat must integrate with new APIs
Below, we’ve outlined a few scenarios and what actions creators will need to take. We plan to work with you on these changes and provide you with resources on how to migrate.
Scenario 1: You are using the standard legacy chat system - Migrate to TextChatService by April 30th, 2025
If you haven’t modified or forked the legacy chat system, and are using the standard version, you must migrate to TextChatService by April 30th, 2025. The legacy chat system will be removed on that date. You won’t need to take any action to integrate with UserChatAsync or UserDirectChat as the standard version of legacy chat will already support those APIs.
You can verify if you are using the standard unforked version by looking at your explorer and confirming that there aren’t any copies of ChatScript or ChatServiceRunner in Chat, StarterPlayerScripts, or ServerScriptService. Additionally, check that the LoadDefaultChat toggle is set to “true,” as seen in the screenshot below.
Scenario 2 [Updated Nov 1, 2024]: You modified or forked the legacy chat system - integrate APIs by January 30th, 2025 and migrate to TextChatService by April 30th, 2025
Your experience should be already using CanUserChatAsync. You must integrate the CanUserDirectChatAsync APIs by January 30th, 2025. If you integrate those APIs, you can continue using those systems until April 30th, 2025, when you must migrate to TextChatService.
We will make CanUserDirectChatAsync available by November 15th, 2024. We will send additional communications to those of you using a forked version of the legacy chat system.
Scenario 3 [Updated Nov 1, 2024]: You built a chat integration that doesn’t use either the legacy chat system or TextChatService - integrate APIs by January 30th, 2025 and migrate to TextChatService by April 30th, 2025
You must ensure that your chat implementation uses the CanUserChatAsync and CanUserDirectChatAsync APIs by January 30th, 2025. CanUserChatAsync is used to manage overall in-experience chat, and CanUserDirectChatAsync is used for managing direct messaging. If you integrate those APIs, you can continue using those systems until April 30th, 2025, when you must migrate to TextChatService.
Integrating with CanUserDirectChatAsync API
The CanUserDirectChatAsync API is used to determine if a user is allowed to send or receive direct chats. We’ll provide more documentation with the launch of CanUserDirectChatAsync API by November 15, 2024.
Here’s an example of how you could potentially use the CanUserDirectChatAsync API to check if users can be in direct chat with each other.
local directChat =TextChatService:CanUsersDirectChatAsync(UserId, { AnotherUserId })
-- check if we have any eligible participants
if #directChat > 0 then
local directChannel = Instance.new(“TextChannel”)
for _, participant in directChat do
directChannel:AddUserAsync(participant)
end
return directChannel
end
warn(“Could not create Direct TextChannel. Not enough eligible users.“)
return nil
Note: This code is not final but meant to be illustrative of how the API will work.
Tools and documentation to ease your migration
In the upcoming weeks, we plan to introduce improved documentation for TextChatService, focusing on helping you solve use cases. We’ll plan to answer your questions and work on specific guides focused on migration.
Team Chat is being removed from Studio on January 30th, 2025
In keeping with our effort to drive safe chat on the platform, we’re removing support for Team Chat from Studio by January 30th, 2025, as it does not integrate with parental controls. We believe that creator team communication within Studio will be better served by the ability to annotate and add comments directly within the workspace. We plan to enable annotation and comments early next year.
Thank you, and let us know if you have any more questions.
FAQs
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.
[Updated Nov 1, 2024] What happens if I have a custom or modified legacy chat in experience and I don’t take action by January 30th, 2025?
- As mentioned above, we will do our best to try to auto-migrate your experience to TextChatService, but this will likely break any custom functionality you have implemented. If we cannot do so, we will disable chat in your experience entirely until you migrate to TextChatService. If for some reason, likely only in the case of custom chat that doesn’t use legacy or TextChatService, we can not migrate or disable chat access, we will restrict access to your experience.
What will happen to my experience if I continue using the unmodified legacy chat system and don’t migrate to TextChatService by April 30th, 2025?
-
We will attempt to automatically migrate your experience to TextChatService, and any customizations you have developed may not work as expected.
Many experiences have been created over the years that rely on the Legacy Chat System to function properly. Some of these experiences may have deep integrations with their gameplay code where outright preventing the Legacy Chat System scripts from running would break their entire experiences. Some of these experiences may have developers not active on the platform now.
Roblox is committed to preserving these legacy experiences. For transparency, one avenue we are researching is the impact of having methods that custom chats rely on such as TextFilterResult:GetChatForUserAsync return an empty result. Most custom chats at this time are likely using either TextFilterResult:GetChatForUserAsync or Chat:FilterStringAsync and the validity of the use cases these APIs provided will have diminished after April 30th, 2025.
We aim to make additional changes that prevent the Legacy Chat System from functioning, keeping these experiences compliant with the new policy. We plan to do this in a way that protects both the experience and the experience owners. We will have another announcement in the near future with more details on what to expect.
We recommend migrating to TextChatService before the deadline to prevent this from happening.
[Updated Nov 1, 2024] How are chats defined?
-
In this case, we define chats as user-to-user communication within your experience, either in a one-to-many or one-to-one context. To be considered chat, the intent would be to facilitate a responsive conversation.
Items that would be considered chat and required to go through TextChatService by April 30, 2025:
- Direct messages between users
- Chat window with communication across users
- Team-specific messages
Types of items that would not be considered a chat are:
- [Updated Nov 1, 2024] Announcements from “Admin Commands”
- System messages sent from the experience
- Moderation audit logs
- Moderation messages
- Individual comments on posts in an experience.
- However, if the comments support a reply feature, these replies would be considered a conversation and thus would be subject to this policy
- Naming a pet
- A roleplay name
- Writing a post on a bulletin board
- Any user-generated text unrelated to a conversation
For types of user-inputted information that can be seen by other users, you are still required to ensure that user-inputted text that doesn’t go through our TextChatService does go through the TextFilter.
How can I start auditing my code for custom chats right now?
-
We recommend using the “Find All” feature in Studio (default: ctrl+shift+F) and searching for usages of TextFilterResult:GetChatForUserAsync or Chat:FilterStringAsync as it is likely these APIs were previously used to facilitate a custom chat feature.
If you have identified that your code was using these APIs for a non-chat feature, consider migrating to either TextFilterResult:GetNonChatStringForBroadcastAsync or TextFilterResult:GetNonChatStringForUserAsync — whichever is more appropriate for your use case — instead.
Intentionally using these TextFilerResults inappropriately for a chat feature may lead to your experience being moderated after the April 30, 2025 deadline.
[Updated Nov 1, 2024] Why are you making us invoke new APIs with the legacy chat system if you are going to remove the legacy chat system?
- Our goal is to ensure that all experiences comply with our parental controls. We’re implementing these APIs as an interim solution for creators who may need more time to migrate from legacy chat to TextChatService. Implementing this APIs, provides you with another 3 months to migrate if you need to do so.
Can I customize the default TextChatService UI?
- Yes, you can customize the look of the default chat window in Studio including fonts, colors, and sizes. Additionally, you can customize the messages using rich text, coloring usernames, and adding tags like VIP status. You can read more about how to customize in-experience chat here.
Can I make my own UI with TextChatService?
- Yes, you may disable the default TextChatService UI and replace visual elements with your designs that best integrate with your experiences. Roblox’s policy is that all messages are sent and delivered through TextChatService’s TextChannels. Developers have the option and freedom to render those messages as long as they comply with our Community Standards.
Can I send system messages with TextChatService?
- Yes, here’s an example of how to send system messages.
Can I customize the chat bubbles?
- Yes, you can customize the chat bubbles. Follow the guide here.
Can I create tabs in the chat with TextChatService?
- This is coming very soon. We expect to add this in the next few weeks.
Can I create UIGradients in chat with TextChatService?
- This is coming very soon. We expect to add this in the next few weeks.
What about older experiences that may not be actively maintained?
- We plan to email or message all impacted creators and work with creators to provide tools and education for migration.