Source: gamesetup/Pages/GameSetupPage/Panels/Chat/ChatPanel.js

/**
 * Properties of this prototype are classes that subscribe to one or more events and
 * construct a formatted chat message to be displayed on that event.
 *
 * Important: Apply escapeText on player provided input to avoid players breaking the game for everybody.
 */
class ChatMessageEvents
{
}

class ChatPanel
{
	constructor(setupWindow, gameSettingControlManager, gameSettingsPanel)
	{
		this.statusMessageFormat = new StatusMessageFormat();

		this.chatMessagesPanel = new ChatMessagesPanel(gameSettingsPanel);

		this.chatInputAutocomplete = new ChatInputAutocomplete(
			gameSettingControlManager, setupWindow.controls.gameSettingsController, setupWindow.controls.playerAssignmentsController);

		this.chatInputPanel = new ChatInputPanel(
			setupWindow.controls.netMessages, this.chatInputAutocomplete);

		this.chatMessageEvents = [];
		for (let name in ChatMessageEvents)
			this.chatMessageEvents.push(new ChatMessageEvents[name](setupWindow, this.chatMessagesPanel));
	}
}