レガシーチャットシステム

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

階層

レガシーチャットシステムは クライアント-サーバーモデル を使用します。サーバー側のチャットモジュールコンポーネント ChatChannelChatSpeaker の管理は、サーバー上の ChatService によって処理され、クライアントはメッセージの入力と表示の責任を負っています。サーバーとクライアントの間の通信は、RemoteEvents を使用して自動的に処理されます。

エンジンサービス自体は、チャットシステムの必須のストレージユニットです:Roblox 場所がロードされると (クライアントまたは Studio で実行またはプレイ中に)、次のコンポーネントが自動的に サービスにロードされます。

  • チャットモジュール — この Folder は、 ChatServiceRunner に必要なモジュールのコレクションです。このフォルダのすべてのコンテンツは、スクリプトによって必須であり、サーバー上でカスタム動作を作成するのに使用されます。
  • クライアントチャットモジュール — このフォルダには、ModuleScripts に必要な様々な が含まれています
    • コマンドモジュール — クライアント側のチャットコマンドを実装するモジュールを含む
    • MessageCreatorModules — メッセージを処理およびフォーマットするモジュールを含む
    • チャットConstants — サーバーとクライアントが共有する定数を含む
    • ChatSettings — さまざまな設定を保存して、ChatWindowの異なる側面を構成します。
  • ChatLocalization — テキスト翻訳を保存するデータ構造。
  • ChatServiceRunner — この Script は、チャットのサーバーコンポーネントを実行します。一般的に、カスタムチャットの動作と機能を作成するために修正する必要はありません。
  • バブルチャット — ゲーム内のアバター上にユーザーのチャットメッセージを表示 (有効にすると)。
  • ChatScript — この LocalScript は、チャットのクライアントコンポーネントを実行します。ChatServiceRunner と同様、チャットをカスタマイズするために修正する必要はありません。ゲームが実行されると、自動的に StarterPlayerScripts にクローンされます。

チャットシステムを変更する

レガシーチャットシステムを変更またはカスタマイズするには、まず上の階層のコピーを作成する必要があります。

  1. In the エクスプローラ window, locate TextChatService .次に、プロパティ ウィンドウで、 ChatVersion プロパティを LegacyChatService に設定します。

  2. プレイ ボタンを使用してエクスペリエンスを実行します ( ).

  3. Select and copy ( Ctrl C または C ) に追加されるオブジェクトを選択し、コピーします( Chat )。

  4. 停止 ボタンを使用してエクスペリエンスを停止します ( ).

  5. Select と paste into ( または ) コピーされたオブジェクトを選択します (経験が実行されている間、親になっていた必要があります)。

  6. Make sure that Chat.LoadDefaultChat が有効になっていることを確認してください。

チャットワークフロー

チャットをカスタマイズするモジュールを作成する前に、チャットメッセージが通過するワークフローを理解することが重要です。テキストメッセージの送信とともに、チャットシステムに組み込まれたさまざまなコマンドがあるため、すべてのメッセージがチェックされて、コマンドまたは単なテキストメッセージとして解釈する必要があるかどうかを確認する必要があります。テキストメッセージさえも、プロセスで修正およびフィルタリングできます。

ユーザーがチャット入力に焦点を合わせ、キャラクターを入力すると、クライアント上ですぐに複数のチェックが行われます。キャラクターが Esc である場合、入力ボックスが閉じてアクションは行われません。キャラクターが Enter 以外のものである場合、テキストは 進行中のコマンドプロセッサーを通過する 。これらは、テキストを評価して、アクションが必要かどうかを確認するために使用されます。たとえば、ユーザーが /whisper コマンドでささやきを開始すると、コマンドの後、ユーザー名が入力されるとすぐに、入力ボックスが変更され、ユーザーが現在ささやきチャネチャンネルに入っていることを示します。

チャットのクライアント側には、2種類のプロセッサーがあります: 進行中完了。前者は、すべての文字が入力された後に評価され、後者はユーザーが入力を終えて Enter にヒットしたときにのみ評価されます。

ユーザーがタイプを終えて Enter テキストを押すと、入力は複数のコマンドプロセッサーを通じて送信されます。進行中の コマンド がカスタムチャット状態を作成した場合、チャットは状態をチェックして、最終コマンドが実行されるか、メッセージが続行するかを確認します。メッセージが続行できるようにすると、テキストは 完了 プロセッサと呼ばれる別のセットのプロセッサを介して送信されます。これらのプロセッサーのいずれかが true を返すと、メッセージの送信が停止します。そうでないと、メッセージはサーバーに送信されます。

メッセージがサーバーに到達すると、別のコマンドプロセッサーのセットを通過します。クライアント上の 完了 プロセッサーと同様、これらのプロセッサーのいず並べ替えかが真実を返すと、メッセージの実行が停止します。そうでなければ、メッセージはフィルタのセットを通過し(デフォルトの Roblox チャットフィルターを含む)、これが全て完了すると、メッセージはすべてのチャネルと適切なスピーカーに送信されます。

サーバーモジュール

チャットモジュール に入れられたモジュールは、さまざまな目的で使用できます。これらのモジュールは、チャットチャネルとスピーカーを管理し、フィルタとコマンド機能を追加し、チャットボットを実行し、またはサーバーで処理する必要がある他のものを追加することができます。チャットシステムと対話するには、各モジュールに ChatService オブジェクトが渡されます。

ChatServiceRunner が起動すると、ChatModules 内の各モジュールが必要になります。それは、各モジュールがそれからそれぞれのモジュールを呼び出し、それの ChatService オブジェクトをそれぞれの機能にパスして、それをそれぞれの機能に返すことを期待します。モジュールが行うことを問わず (ボットの実行、フィルター機能の追加など)、機能するにはこの形式に従う必要があります。

サンプルモジュールフレームワーク

local function Run(ChatService)
-- コードはここに行く
end
return Run

チャンネルを追加

チャットモジュール ができる最も簡単なことの 1つは、チャネル を管理することです。チャンネルオブジェクトは、ChatServiceAddChannel() メソッドで作成できます。チャネルオブジェクトは、そのチャネルのメンバー (プロパティや機能など) を呼び出すときにのみ使用する必要があることに注意してください。ChatService または ChatSpeakers のコンテキストからチャネルを参照すると、チャネルの名前がそれを参照するために使用されます。


local function Run(ChatService)
local myChannel = ChatService:AddChannel("MyChannel")
end
return Run

基本チャネル構成

チャンネルには、彼らをわずかに変更するために使用できる複数のプロパティがあります。たとえば、このモジュールはチャネルを作成し、歓迎メッセージを設定し、ユーザーがエクスペリエンスに入ると自動的にチャネルに参加させます。


local function Run(ChatService)
local myChannel = ChatService:AddChannel("MyChannel")
-- ユーザーがチャネルに参加すると表示されるメッセージを設定すチャンネル
myChannel.WelcomeMessage = "Welcome to my channel!"
-- プレイヤーがゲームに入ると、チャネルに自動的に参加する原因
myChannel.AutoJoin = true
end
return Run

チャネルイベント

チャンネルにはサブスクライブできる複数のイベントがあります。これらのイベントは、チャットメッセージがチャネルに投稿されたとき、チャットスピーカーが退出または参加したとき、またはスピーカーがミュートまたは解除されたときに発動します。たとえば、このモジュールは、名前 MyChannel のチャンネルを作成します。スピーカーがチャネルに参加したり、離れたりするたびに、チャネル内のすべてのスピーカーにイベントについて通知するシステムメッセージが送信されます。


local function Run(ChatService)
local myChannel = ChatService:AddChannel("MyChannel")
local function onSpeakerJoined(speakerName)
myChannel:SendSystemMessage(speakerName .. " has joined the channel.")
end
local function onSpeakerLeft(speakerName)
myChannel:SendSystemMessage(speakerName .. " has left the channel.")
end
myChannel.SpeakerJoined:Connect(onSpeakerJoined)
myChannel.SpeakerLeft:Connect(onSpeakerLeft)
end
return Run

コマンド機能

チャットモジュール が行うことができるもう一つの強力な機能は、チャット コマンド です。メッセージがサーバーに送信されると、チャットは ChatService に登録された各コマンド機能と関連するチャネルを通じてメッセージを送信します。これらの機能は、メッセージが送信されているスピーカー、メッセージ、チャネルを送信します。機能は、必要なアクションを実行してから、真または偽を返すことができます。機能が true を返すと、チャットシステムでメッセージの処理が停止します。他のコマンド機能に送信されたり、チャットウィンドウに表示されたりはしません。機能が false を返す場合、メッセージは他のすべてのコマンド機能を通り抜けます。コマンド機能のいずれも true を返さない場合、メッセージはフィルターを通じて送信され、表示されます。

コマンド機能は、チャットで言及された特定のテキストを介してエクスペリエンス状態を操作することができる 管理コマンド を実装するためによく使用されます。

この例では、ユーザーがチャットで ChatModule をタイプすると、Part が生成されるように /part を使用しています。この機能は、パーツが作成されてメッセージが進行を停止し、メッセージが表示されない場合は、真を返すことに注意してください。パーツが作成されていない場合、この機能はメッセージがシステムを通じて継続して作業できるように、 false を返す必要があります。


local Workspace = game:GetService("Workspace")
local function Run(ChatService)
local function createPart(speakerName, message, channelName)
if string.sub(message, 1, 5) == "/part" then
local newPart = Instance.new("Part")
newPart.Parent = Workspace
return true
end
return false
end
ChatService:RegisterProcessCommandsFunction("createPart", createPart)
end
return Run

両方の チャットチャンネルChatService 自体には、チャットコマンドがあることができます。 ChatService コマンドプロセッサは、サーバーに送信されたすべてのメッセージで実行されますが、チャネルコマンドは、コマンドが登録されたチャネルにメッセージが送信された場合にのみ実行されます。

フィルタ機能

コマンド機能 によって停止されないメッセージは、ChatService に登録されたすべてのフィルター機能と関連するチャネルを通過します。それぞれのフィルター機能は、スピーカー、メッセージオブジェクト、およびチャネル名を渡されます。メッセージオブジェクトに行われた変更は継続し、次のフィルター機能は更新されたメッセージを見ることになります。フィルタ機能は値を返す必要はありません。

この例では、すべてのメッセージを小文字で表示するために、単純なフィルター機能が登録されています。


local function Run(ChatService)
local function makeLowercase(sender, messageObject, channelName)
messageObject.Message = string.lower(messageObject.Message)
end
ChatService:RegisterFilterMessageFunction("makeLowercase", makeLowercase)
end
return Run

客側モジュール

クライアントチャットモジュール に入れられたモジュールは、クライアントのカスタム動作を作成するのに使用できます。これらのモジュールは、2つの異なるフォルダに分割されます:コマンドモジュールメッセージクリエーターモジュール

コマンドモジュール

コマンドモジュール は、コマンド機能を登録するサーバーのモジュールと非常に似た方法で動作します。これらのモジュールは、ユーザーがテキストを入力した後に発動する機能を定義します。そのテキストは読み込まれ、コマンドはメッセージをサーバーに通すか、メッセージの進行を停止することができます。メッセージの最後で評価されるコマンドは、COMPLETED_MESSAGE_PROCESSOR でタグ付けされ、各文字の後で評価されるコマンドは、IN_PROGRESS_MESSAGE_PROCESSOR でタグ付けされます。

両方のコマンドタイプでは、モジュールは、コマンドが使用するプロセッサの種類と、プロセッサが呼び出されたときに実行する機能を言う辞書を返す必要があります。たとえば、 完了メッセージプロセッサー は次の形式であるべきです:


local util = require(script.Parent:WaitForChild("Util"))
function ProcessMessage(message, ChatWindow, ChatSettings)
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.COMPLETED_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}

Note that the 枚数は、 コマンドモジュール 内の フォルダ内で定義されています。

完了メッセージコマンド

完了メッセージコマンド は、ユーザーがタイプを終えて Enter にヒットしたときに評価されます。プロセッサーの機能は、ChatMessage オブジェクト、クライアントの ChatWindow、および ChatSettings テーブルを通過します。機能が true を返すと、メッセージの処理が停止し、サーバーに送信されなくなります。そうでないと、他のプロセッサーすべてを通じて送信され、最終的にサーバーに送信されますが、他のプロセッサーのいずれも停止しない場合があります。

たとえば、次のプロセッサは、ユーザーがコマンド /last を入力すると、現在のチャネルで最古のメッセージを削除します。


local util = require(script.Parent:WaitForChild("Util"))
function ProcessMessage(message, ChatWindow, ChatSettings)
if string.sub(message, 1, 5) == "/last" then
local currentChannel = ChatWindow:GetCurrentChannel()
if currentChannel then
currentChannel:RemoveLastMessageFromChannel()
end
return true
end
return false
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.COMPLETED_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}

進行中のコマンド

進行中のコマンド は、ユーザーがチャット入力に文字を入力するたびに評価されます。たとえば、次のコードは、すべてのキープレスの後にクラックを再生し、ユーザーがタイプライターに入力しているように聞こえさせます:


local util = require(script.Parent:WaitForChild("Util"))
local keyEffect = Instance.new("Sound")
keyEffect.SoundId = "rbxassetid://12221976"
keyEffect.Parent = script
function ProcessMessage(message, ChatWindow, ChatBar, ChatSettings)
keyEffect:Play()
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.IN_PROGRESS_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}

進行中のコマンドは、通常、チャットが現在のチャネルだけでなく特定のユーザーにメッセージを送るための カスタム状態 を作成するために使用されます。たとえば、Whisper とチームチャットシステムは、ユーザーがそれぞれ /whisper または /team をタイプしたかどうかをチェックし、完了したメッセージを適切なユーザーにのみ送信します。

カスタム状態は、次の機能を持つテーブルであることが期待されます:

  • TextUpdated() — 入力ボックスのテキストが変更されたときに呼び出されます。
  • GetMessage() — ユーザーがメッセージの入力を終えて Enter にヒットした後に呼び出されます。この関文字列は、ストリングを返すことが期待されます。
  • ProcessCompletedMessage() — メッセージが処理されているときに呼び出されます。カスタム状態処理プロセッサは、完了したメッセージ処理プロセッサよりも常に発射します。他のプロセッサーと同様、この機能はメッセージが送信を停止する場合は真、そうでない場合は false を返す必要があります。
  • Destroy() — メッセージが送信された後に呼び出されます。カスタム状態によって設定されたものをクリーンアップするのに使用されます。

カスタム状態を使用するには、コマンドモジュールの ProcessMessage() 機能が状態を返す必要があります。基本的なカスタム状態は次の形式を取ります:


local util = require(script.Parent:WaitForChild("Util"))
local oneLineState = {}
oneLineState.__index = oneLineState
function oneLineState:TextUpdated()
local text = self.TextBox.Text
local length = string.len(text)
if length > 20 then
local chopLength = length - 20
local addToPrefix = string.sub(text, 1, chopLength)
self.Prefix = self.Prefix .. addToPrefix
self.TextBox.Text = string.sub(text, chopLength + 1)
end
end
function oneLineState:GetMessage()
local fullString = self.Prefix .. self.TextBox.Text
return fullString
end
function oneLineState:ProcessCompletedMessage()
return false
end
function oneLineState:Destroy()
self.Destroyed = true
end
function oneLineState.new(ChatWindow, ChatBar, ChatSettings)
local obj = {}
setmetatable(obj, oneLineState)
obj.Destroyed = false
obj.ChatWindow = ChatWindow
obj.ChatBar = ChatBar
obj.ChatSettings = ChatSettings
obj.TextBox = ChatBar:GetTextBox()
obj.MessageModeLabel = ChatBar:GetMessageModeTextLabel()
obj.Prefix = ""
return obj
end
local function ProcessMessage(message, ChatWindow, ChatBar, ChatSettings)
return oneLineState.new(ChatWindow, ChatBar, ChatSettings)
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.IN_PROGRESS_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}

カスタム状態を使用するメリットの 1つは、ユーザーが機能と外見の両方で入力している間、モジュールがチャットバーとその含まれたテキストを編集でき、その後簡単にリセットできることです(メッセージが送信されるとカスタム状態は自動的に削除され、すべてが正常に戻されます)。たとえば、このコードは、テキストボックスに一度に表示できるのは 20 文字だけのカスタム状態を設定します。ユーザーが入力を続けると、文字列の始めの文字が一時的に削除されます。ユーザーがメッセージを送信すると、削除されたすべての文字がメッセージに戻されます。


local util = require(script.Parent:WaitForChild("Util"))
local oneLineState = {}
oneLineState.__index = oneLineState
function oneLineState:TextUpdated()
local text = self.TextBox.Text
local length = string.len(text)
if length > 20 then
local chopLength = length - 20
local addToPrefix = string.sub(text, 1, chopLength)
self.Prefix = self.Prefix .. addToPrefix
self.TextBox.Text = string.sub(text, chopLength + 1)
end
end
function oneLineState:GetMessage()
local fullString = self.Prefix .. self.TextBox.Text
return fullString
end
function oneLineState:ProcessCompletedMessage()
return false
end
function oneLineState:Destroy()
self.Destroyed = true
end
function oneLineState.new(ChatWindow, ChatBar, ChatSettings)
local obj = {}
setmetatable(obj, oneLineState)
obj.Destroyed = false
obj.ChatWindow = ChatWindow
obj.ChatBar = ChatBar
obj.ChatSettings = ChatSettings
obj.TextBox = ChatBar:GetTextBox()
obj.MessageModeLabel = ChatBar:GetMessageModeTextLabel()
obj.Prefix = ""
return obj
end
local function ProcessMessage(message, ChatWindow, ChatBar, ChatSettings)
return oneLineState.new(ChatWindow, ChatBar, ChatSettings)
end
return {
[util.KEY_COMMAND_PROCESSOR_TYPE] = util.IN_PROGRESS_MESSAGE_PROCESSOR,
[util.KEY_PROCESSOR_FUNCTION] = ProcessMessage
}

以前にも述べたように、メッセージが送信されると、カスタム状態は削除され、チャットは通常に戻されます。メッセージを送信する前にカスタム状態をリセットする必要がある場合、状態は ChatBar:ResetCustomState() でリセットできます。これにより、チャットバーのテキストボックスからも焦点が削除されます。

メッセージ作成モジュール

クライアントコンポーネントで使用できる別のモジュールの種類は、 メッセージクリエーター モジュールです。このタイプのモジュールは、チャットウィンドウでメッセージを表示するために GUI 要素を作成するのに使用されます。各種メッセージ作成者は、新しいメッセージタイプを定義し、異なる形入力で異なるメッセージを作成できます。さらに、GUI 要素をメッセージの表示にこの方法で追加でき、画像、ボタンなどが可能になります。

これらのモジュー入力は、複数の異なる場所で設定が必要です。各メッセージタイプには、ModuleScript 内に **** がある必要があります。また、 チャットステート ModuleScript は、新しいメッセージタイプを含めるために編集する必要がある。最後に、チャットサーバーのコンポーネントが指定されたメッセージタイプの新し入力メッセージを作成した場合にのみ、モジュー入力が使用されます。

次の例では、5秒ごとに時間を言うボットを作成し、送信されたメッセージに赤い背景が付与される過程を説明します。

開始めるには、 チャットステート ModuleScript に新しいタイプのメッセージのフィールドを追加する必要があります。


-- チャットConstants
local module = {}
--[[メッセージタイプ]]
module.MessageTypeDefault = "Message"
module.MessageTypeSystem = "System"
module.MessageTypeMeCommand = "MeCommand"
module.MessageTypeWelcome = "Welcome"
module.MessageTypeSetCore = "SetCore"
module.MessageTypeWhisper = "Whisper"
module.MessageTypeTime = "Time"
module.MajorVersion = 0
module.MinorVersion = 2
return module

ボット自体は、サーバー上の新しい チャットモジュール に作成されます。フィルター関数は、ボットが送信するメッセージに新しいメッセージタイプを追加するために使用されることに注意してください。


-- チャットモジュールに配置する新しいモジュールスクリプト
local Chat = game:GetService("Chat")
local ReplicatedModules = Chat:WaitForChild("ClientChatModules")
local ChatConstants = require(ReplicatedModules:WaitForChild("ChatConstants"))
local function Run(ChatService)
local timeBot = ChatService:AddSpeaker("TimeBot")
timeBot:JoinChannel("All")
local function addMessageType(speaker, messageObject, channelName)
if speaker == "TimeBot" then
messageObject.MessageType = ChatConstants.MessageTypeTime
end
end
ChatService:RegisterFilterMessageFunction("TimeBotFilter", addMessageType)
task.spawn(function()
while task.wait(5) do
timeBot:SayMessage("The current time is: " .. os.time(), "All", {})
end
end)
end
return Run

最後に、メッセージ作成モジュールが作成されなければなりません。このモジュールは、メッセージの種類、KEY_MESSAGE_TYPE でインデックス化され、メッセージGUI要素を作成するときに呼び出される関数、KEY_CREATOR_FUNCTION でインデックス化される必要があります。

KEY_CREATOR_FUNCTION に保存された機能は、複数のコンポーネントを持つ辞書を返す必要があります。まず、チャットウィンドウに表示される FrameTextLabel を含める必要があります。これらは util:CreateBaseMessage() 関数で作成できます。辞書には、メッセージのテキストが更アップデートされた場合に実行する機能も含まれる必要があります。メッセージが最初にクライアントに表示されると、メッセージが処理およびフィルタリングされている間、空のプレースホルダーテキストがあり、このようなメッセージオブジェクトは、更新の呼び出しを受け取ったときに起こることを処理する必要があります。次に、辞書にはフレームの高さを決定する機能を含める必要があります。この機能はしばしば util:GetMessageHeight() 機能を呼び出します。最後に、辞書には、ウィンドウが消えたときに要素が消える方法を定義する複数の機能を含める必要があります(このためのユーティリティ機能は util:CreateFadeFunctions() )。


-- メッセージクリエータモジュールに含まれる新しいモジュールスクリプト
local messageCreatorModules = script.Parent
local util = require(messageCreatorModules:WaitForChild("Util"))
local clientChatModules = messageCreatorModules.Parent
local ChatSettings = require(clientChatModules:WaitForChild("ChatSettings"))
local ChatConstants = require(clientChatModules:WaitForChild("ChatConstants"))
local function CreateMessageLabel(messageData, channelName)
-- フレームとテキストラベルの GUI オブジェクトを作成して、メッセージを保持する
local BaseFrame, BaseMessage = util:CreateBaseMessage("", ChatSettings.DefaultFont, ChatSettings.ChatWindowTextSize, ChatSettings.DefaultMessageColor)
-- フレームの背景を赤に変更
BaseFrame.BackgroundColor3 = Color3.new(1,0,0)
BaseFrame.BackgroundTransparency = 0
-- 更新プレースホルダーメッセージテキストを処理する
local function UpdateTextFunction(messageObject)
if messageObject.IsFiltered then
BaseMessage.Text = messageObject.Message
end
end
UpdateTextFunction(messageData)
-- フレームの高さを決定するために util 関数を使用
local function GetHeightFunction(xSize)
return util:GetMessageHeight(BaseMessage, BaseFrame, xSize)
end
-- チャットウィンドウが消えたときに呼び出されるフェード機能を作成
local FadeParameters = {}
FadeParameters[BaseMessage] = {
TextTransparency = {FadedIn = 0, FadedOut = 1},
TextStrokeTransparency = {FadedIn = 0.75, FadedOut = 1}
}
local FadeInFunction, FadeOutFunction, UpdateAnimFunction = util:CreateFadeFunctions(FadeParameters)
-- メッセージラベルを定義する辞書を返す
return {
[util.KEY_BASE_FRAME] = BaseFrame,
[util.KEY_BASE_MESSAGE] = BaseMessage,
[util.KEY_UPDATE_TEXT_FUNC] = UpdateTextFunction,
[util.KEY_GET_HEIGHT] = GetHeightFunction,
[util.KEY_FADE_IN] = FadeInFunction,
[util.KEY_FADE_OUT] = FadeOutFunction,
[util.KEY_UPDATE_ANIMATION] = UpdateAnimFunction
}
end
return {
[util.KEY_MESSAGE_TYPE] = ChatConstants.MessageTypeTime,
[util.KEY_CREATOR_FUNCTION] = CreateMessageLabel
}