WinryChat | Open-Source Chat UI for TextChatService

WinryChat - Open Source (No License) is a new Chat UI for TextChatService designed for use in experiences that require ChatChannel support and more customization settings of the Chat UI than the default ROBLOX solutions allow for. We’ve open-sourced it completely for free.

  • No License Required
  • No Attribution Required
  • No Forum Reply Required
  • Feedback Optional (but helpful)

Current Version: WinryChat 1.3

This is a client-side only Chat UI. The management of Channels and Commands are left to the developer.


Setting Up Winry Chat:

The new Chat UI can be found at StarterGui.PlayerChat.Chat and can be copied or moved anywhere without interference. You can also customize the appearance and behaviour of WinryChat using the list of attributes attached to the Chat UI - see the “Appearance and Behaviour Settings” tab for more.

Appearance & Behaviour Settings

AudioFeedbackEnabled:
Whether or not to play audio when the Chat is opened and closed or a button is clicked.

AutocompleteEnabled:
Whether to enable the autocomplete feature to show TextChatCommands. This respects TextChatCommand.AutocompleteVisible.

AutocompleteResultBackground:
The background color that is used for autocomplete result buttons. Transparency is used for the mouse entering and exiting the button.

AutocompleteResultTextColor:
The text color to use for autocomplete result buttons. Transparency is used to show the typing progress.

AutoHideChatIfPlayerIsInNoChannels :
If the player isn’t in any chat channels, this determines whether or not to hide the chat channel to prevent confusion from players. Default: True

BackgroundColor:
The background color of the major elements of the Chat UI.

ChannelButtonFont:
The font (and style) to use for text channel buttons on the top row.

ChannelButtonFontSize:
The size of the font used for each text channel button.

ChannelButtonTextColor:
The text color to use for channel buttons. Transparency is used for the mouse entering and exiting the button.

ChannelListHeight:
The height (in pixels) of the list of text channels - the buttons at the top.

ClearTextBoxOnFocus:
Whether to clear the TextBox when the player uses the Focus Chat shortcut or clicks on the TextBox.

DragCornerColor:
The color to use for the drag resize corner.

FocusChatKeyCodeId:
The ID of a KeyCode to use as the Focus Chat shortcut.

InputAreaColor:
The color of the TextBox area.

InputAreaPlaceholderTextColor:
The color of placeholder text in the TextBox.

InputAreaTextColor:
The color of player-typed text in the TextBox.

MaxResizeSafeZone:
An offset in pixels from the viewport’s bottom right corner to limit resizing to.

ScrollbarColor:
The color of all scrollbars in the Text Chat UI.

ScrollbarTransparency:
The transparency of all scrollbars in the Text Chat UI.

SelectedChannelRibbonColor:
The color of the ribbon that highlights the currently selected channel.

SystemMessageSenderName:
The name to display as the sender of system messages.

TextFieldHeight:
The height (in pixels) of the TextBox area - the field at the bottom.

TextMessageFont:
The font (and style) to use for text messages sent in a channel.

TextMessageFontSize:
The size of the font used for each text message.

TextMessageTextColor:
The color of text messages.

UICornersEnabled:
Whether UI Corners are enabled on the CanvasGroup, TextBox and Autocomplete results (if AutocompleteEnabled is true).

UISpacing:
The spacing (in pixels) between each chat channel button, as well as between the list of buttons and chat view.

UIStrokeColor:
The color for the UIStroke around the TextBox and around each Autocomplete result.

UIStrokeTransparency:
The transparency for the UIStroke around the TextBox and around each Autocomplete result.

UnreadMessagesSymbolColor
Changes the color of the unread messages symbol next to a chat channel’s name, which appears when a channel receives a new message. Default: 10, 185, 225


Example Themes
THA Theme Images




Light-mode Theme Images





How WinryChat Works

WinryChat searches through (and listens for new) descendants in TextChatService to get TextChannels and TextChatCommands.

  • When a player is added to a TextChannel, a new view and channel button are created for the player.

  • When a player is removed from a TextChannel, the view and channel button are cleaned up, then deleted.

  • If a Text Channel is given a Default tag (via Luau or In Studio), it is treated as the first channel a player should see when joining the game.

  • If a Text Channel has a LayoutOrder (number) attribute, that number is then used to set it’s order in the Channels List.


Autocompelete for Commands

Text Chat Commands are automatically setup by the Autocomplete system, if AutocompleteEnabled is set to true. Autocomplete for Arguments is also supported.

WinryChat’s Autocomplete feature is also dynamic. It will show any TextChatCommand and it’s arguments if the AutocompleteVisible property is set to true, even if this is changed after it’s setup. This allows for the visibility of commands to be changed when a player is granted admin, or developer, status in-game.

Any type is supported for Argument Autocomplete, however, only boolean and Player types provide a list of buttons for autofilling values. Additionally, the byte type provides a custom message instead of the default message. This will expand over time.

Setting up Arguments for Autocomplete
  1. Create a new NumberValue instance as a child of your TextChatCommand.
    image

  2. Set the Name property of the new NumberValue to that of the name of the argument.
    image

  3. Set the Value property of the new NumberValue to that of which argument it is in line. This can start at any number. So long as the order of arguments is correct, WinryChat will handle the rest for you.
    image

  4. Add a new attribute called Type, with it’s type set to string. WinryChat will use this as the expected type if applicable. Then set the attribute’s value to the desired type, which will be Player for this example.


    image

If set up correctly, you'll see either:


Final Notes
If you have any features to suggest, or find any bugs, please leave a comment and we’ll try to respond with either a fix or update for you. We want to make a reliable system that anyone can use in their workflows.

Context

If you’re wondering why we decided to do this (in the event there are multiple chat UIs like ours), the answer is simply both:

  1. We didn’t know, sometimes multiple people make different variations of the same idea.
  2. We were disheartened by the issues plaguing the default UI and felt like we had to do something.

During the development of Winry 4.1, a server system for clanning, we were hoping for ROBLOX’s Chat Channel support update to be completely functional. However, it was not. Channels you were not a part of would stay and you couldn’t customize everything we wanted to.

In response, after the rest of Outpost Gambit was already complete, we spent the last week before this Chat UI originally launched just writing, bugfixing and extending it so that we could have a reliable chat UI. Our goal was to keep it as vanilla as possible. To make things that we felt comfortable with, and could use for various projects without it being restrictive.

A week and a bit later, after approval from @TigerValdos, we felt it was at a point where we could open-source it for others to benefit from. And that’s where we are now.


ASSET ATTRIBUTIONS

While we ourselves don’t require any specific accreditation, we cannot be sure of that of the Audio Effects we’ve used in place of our privately used ones. The placeholder UIClick, UIOpen and UIClose sound effects have been uploaded by ROBLOX, Z9R and ProSoundEffects.

If these assets require unique licenses, and you wish to use them, you may need to contact the individual owners.


20 Likes

Super cool! This works flawlessly, I like the work you have contributed.

2 Likes

Thank you!

We’re actively looking for feedback on WinryChat too. Anything that can help the experience feel better for developers and users alike. We really want to prioritize a smooth, easy chat experience for a variety of devices.

1 Like

I really like the way this module is build, if I find any bugs or inconsistencies I’ll let you guys know! :smiley:

1 Like

We’ll release more open-source technologies when we can!

We’re digging into how ROBLOX’s UI/UX works, how common interactions and reactions occur in ROBLOX’s UI/UX and similar happen. We’ve got a few ideas already and we want to make a manual for editing WinryChat exists as soon as we can ensure a high quality of a production-ready PDF/AFPUB file can be released.

We’ve integrated ROBLOX’s new intellisense-like features as a starting point for documentation, and hopefully it will improve over time so that we can push how much we can communicate to developers further.

1 Like

Winry Chat - Update Log for Version 1.1

Hello? Hello Hello? Uh, I wanted to record a message for you guys- ahem. Anywayyyy, yes this is still in development. I’ve been very busy this christmas season tending to quite a few projects and gatherings! But Winry Chat is still chugging along and there are plenty of bugs I wish to address over time.

I will say that I recommend this chat system right now if you plan to use custom chat channels instead of ROBLOX’s defaults. However, for default chat, there seems to be an issue that’s spawned in due to recent updates to ROBLOX’s default channels causing RBXSystem and RBXGeneral to behave strangely and I need more time to investigate that (sorry!). Right now, there’s only a few changes while I get back in the saddle.


New Settings (Attributes)


ClearTextBoxOnFocus : Boolean
Changes whether the text box is cleared or not when using the keyboard shortcut for focusing chat or clicking on the text area of chat. Default: True

FocusChatKeyCodeId : Number
Changes the keybind used for focusing chat. The keybind is also displayed (by name for now) in the PlaceholderText area of the TextBox. Using integers, as listed in KeyCode is the only way to currently get this in. Properties Window says that we can use EnumItems. I don’t know if this is working or not because I can’t see a KeyCode option myself in the new beta or legacy Studio UIs.


New Functions


GetKeyCodeIdAsEnumValue : (number) → (Enum.KeyCode)
Returns the Enum.KeyCode value, if one exists for the given id.


Old Verisons


If an update to WinryChat does somehow break a feature or something you were using previously. We’ll still keep old versions stored in their own corresponding folder here:
image

We don’t go around with the intention to break things (at least I think not), but sometimes things go sideways and a backup plan is always a good option.


These changes should be live now!

2 Likes

Winry Chat - Update Log for Version 1.2

This is a small update to address a missing feature and a bug that occurred from a oversight. Players will now see a small circle next to chat channels they aren’t viewing, if a new message has been sent to the chat channel. Developers now have the option to auto-hide the chat if the local player doesn’t have any channels to view or type in.

Unread Messages - Default Appearance

On an important note: WinryChat will no longer be recommended for users looking to only change the chat appearance while retaining the default ROBLOX Chat channels. It’s heartbreaking to me to say that, and hopefully this is only temporary, but the Default Chat Channels keep breaking and I am unable to reliably reproduce and isolate the bug. This issue hasn’t been reproducible so far with custom chat channels created by developers.

If you find a fix, please let me know immediately. I would love for the full set of default channels to work as intended.


New Settings (Attributes)


AutoHideChatIfPlayerIsInNoChannels : boolean
If the player isn’t in any chat channels, this determines whether or not to hide the chat channel to prevent confusion from players. Default: True

UnreadMessagesSymbolColor : Color3
Changes the color of the unread messages symbol next to a chat channel’s name, which appears when a channel receives a new message. Default: 10, 185, 225


Bugfixes

  • Fixed an error message that would occur when a player tried to send a message through WinryChat when the player wasn’t added to any channels. Instead, the player will not be able to send a message. If you wish for the player to not see any chat, in the event they can’t view a channel or send messages in a channel, then set AutoHideChatIfPlayerIsInNoChannels to true.

  • The default keybind for FocusChatKeyCodeId has been reverted back to 47 for Slash “/”, instead of 53 for “5”. This was for testing purposes only and wasn’t reverted in Version 1.1 for public use by mistake.


These changes should be live now!

1 Like

Love the slick modernize design! Well done and keep up the good work

1 Like

really cool module, any plans to continue expanding it yourself or is it a free for all
having chat rescale and drag and drop theming would be cool, rather than attributes, module script perhaps

other than that, really good base for a chat system, might use it

1 Like

We plan to do these things over time.

WinryChat is actively expanding as and when we can facilitate resources to it, and there are some issues (notably documentation) I’d personally like to work out with the code.

Looking forward to it!
There are many new systems out there and this could be one of the best.

1 Like

Thank you!

We’ve developed the system in the scope of clanning, but the goal is to release more systems that we’re developing for completely free. As we speak, WinryChat Version 1.3 is already in development from internal and external feedback.

And if anyone’s curious or suspicious as to why this is free: We want feedback, suggestions and perspective from everyone, so that we can improve our tools for our own community, other communities and improve how we build our internal (clan-specific) and free tools. That’s the trade we look to make with the games development community.

We’re testing the drag resize feature now, while we test something relating to TextChatCommands. Drag and Drop Theming is something that may take more time, due to complexity, but here’s some testing images!



We are also working out some issues where the application losing focus keeps the dragging enabled. But this will be shipping with WinryChat 1.3 on your request! (It’s also just handy to have in general.)

1 Like

looks really good, good job!
Let me know when this is public

2 Likes

It’ll be out with the next release. There’s also safeguards built in for a minimum size and restraining the chat window to within the Viewport. This includes a new setting for a Safe Zone if you want some padding between the bottom right corner and the drag resize UI.

Of course, the issues with making drag-and-drop theming is the amount of settings provided to users. So that would take more time, if it is even possible with the existing logic. In the mean time, we’ve been reworking how the settings are applied. We want to make way for a settings panel for users can try out custom themes with in the future (and a developer setting for enabling or disabling custom theming).

1 Like

Winry Chat - Update Log for Version 1.3

Happy New Years folks! We intended to ship this yesterday, yet the Autocomplete feature couldn’t be completed in a single 4 hour sprint… so it took another 4 hour sprint today to debug and address that feature in a way that integrated nicely with the chat.

Our goal with WinryChat as an open-source utility is and always will be the same: Minimize Impact on Developer Workflows.


New Features


  • Drag Resizing (Feature Request) We understand the importance of being able to see and resize your chat window, especially for those moments where someone spills the tea. So, we made it a top priority to get this in first for developers.

  • Autocomplete for Command Arguments (Internal Request)
    Something missing from our server manager, Winry, was the ability to display information for TextChatCommand arguments. While we considered it as an internal feature in settings or in a separate panel, that just wouldn’t cut it. With some careful considerations, we found a way we believe to be unobtrusive to developers’ workflows for this feature.


New Settings (Attributes)


DragCornerColor : Color3
Changes whether the text box is cleared or not when using the keyboard shortcut for focusing chat or clicking on the text area of chat. Default: (10, 185, 255)

MaxResizeSafeZone : Vector2
An offset in pixels from the viewport’s bottom right corner to limit resizing to. Default: {16, 72}


New Functions


BindDragResizeFeature : () → ()
Binds functions to UserInputService and the DragArea (ImageButton) so that players can use the new Drag Resize feature.

CreateCommandInfoForAlias : ( {} , string, {} ) → (ChatCommandInfo)
Consolidated the creation of command info for command aliases into one function, so that redundant code is reduced. First and Third Arguments are custom types with names too long to keep this on a single line.

SetAppearanceAndBehaviourFromSettings : () → ()
Refresh the appearance and behaviour of the Chat UI from it’s settings attributes. This has been added ahead of time, for when we can find an appropriate way to integrate a settings panel for custom theming.

SetInteractableState : (boolean) → ()
Set the interactable property of the Chat Channels list, Channel View and Input Area.


Bugfixes


  • Fixed an issue where MessageTemplate was requesting an attribute called TextMesageFont and not TextMessageFont.

  • Fixed a few conditional statements and added more object clearing / destruction steps where appropriate to prevent memory leaks.

  • Fixed the initial Interactable state of Chat UI elements. Core elements were not reverted to true after testing the dragging feature.


These changes should be live now!

If you’re reading this a few minutes after it’s posted, we’ll be updating the initial forum post to be reflective of the new version. We will also add additional information on how to specify information to display for an argument of a TextChatCommand, so that it can appear with our Autocomplete.

[Update]: We’ve rewritten the original post to reflect the changes, and provide better documentation.

@Wertyhappy27 - Here’s Version 1.3 for you too!

1 Like

As a Ui designer myself, that is very good!
Keep up the great work, looking forward to it! :grin:

2 Likes

Thank you!

We’ve brought our internal version of WinryChat 1.3 up to parity with the open-source version now, and are doing some bug hunting in a live production (good for case studies too). A few small patches to the open-source version should roll out for the argument autocomplete.


Update: This seems to be specific to our project’s object creation pipeline, but if we can identify a cause that’s caused by WinryChat’s scripting, we’ll push a patch as soon as possible.

1 Like