Chat - Code
Allow players to communicate in-game [SOCL-Chat-02]
API
Unlike many Beamable FeatureFeature - An individual aspect of the Beamable product used to create a great user experiences, Chat does not require a specific Beamable Feature PrefabFeature Prefab - The drag-and-drop template for a specific Beamable product feature to be used. The main entry point to this feature is C# programming.
Learning Fundamentals
Game makers who are new to Unity and C# can review the fundamentals here.
• See Beamable: Asynchronous Programming for more info
Here are API highlights for beamableAPI.ChatService
.
Method Name | Detail |
---|---|
Subscribe | Callback to observe changes |
CreateRoom | Create a new room |
GetMyRooms | Get list of all current rooms |
LeaveRoom | Leave the current room |
SendMessage | Send a text message to all room players |
Examples
Here are examples which cover common programming needs.
Beamable SDK Examples
• The following example code is available for download at GitHub.com/Beamable_SDK_Examples
In this example, the player may create a room and send a chat message.
using System.Collections.Generic;
using System.Threading.Tasks;
using Beamable.Common.Api;
using UnityEngine;
using Beamable.Experimental.Api.Chat;
using UnityEngine.Events;
namespace Beamable.Examples.Labs.ChatService
{
/// <summary>
/// Holds data for use in the <see cref="ChatServiceExampleUI"/>.
/// </summary>
[System.Serializable]
public class ChatServiceExampleData
{
public List<string> RoomNames = new List<string>();
public List<string> RoomPlayers = new List<string>();
public List<string> RoomMessages = new List<string>();
public string RoomToCreateName = "";
public string RoomToLeaveName = "";
public bool IsInRoom = false;
public string MessageToSend = "";
}
[System.Serializable]
public class RefreshedUnityEvent : UnityEvent<ChatServiceExampleData> { }
/// <summary>
/// Demonstrates <see cref="ChatService"/>.
/// </summary>
public class ChatServiceExample : MonoBehaviour
{
// Events ---------------------------------------
[HideInInspector]
public RefreshedUnityEvent OnRefreshed = new RefreshedUnityEvent();
// Fields ---------------------------------------
private ChatView _chatView = null;
private IBeamableAPI _beamableAPI = null;
private ChatServiceExampleData _data = new ChatServiceExampleData();
// Unity Methods --------------------------------
protected void Start()
{
Debug.Log("Start()");
SetupBeamable();
}
// Methods --------------------------------------
private async void SetupBeamable()
{
_beamableAPI = await Beamable.API.Instance;
Debug.Log($"beamableAPI.User.id = {_beamableAPI.User.id}");
// Observe ChatService Changes
_beamableAPI.Experimental.ChatService.Subscribe(chatView =>
{
_chatView = chatView;
// Clear data when ChatService changes
_data.RoomNames.Clear();
_data.RoomMessages.Clear();
_data.RoomPlayers.Clear();
foreach(RoomHandle room in chatView.roomHandles)
{
room.OnRemoved += Room_OnRemoved;
string roomName = $"{room.Name}";
_data.RoomNames.Add(roomName);
room.Subscribe().Then(_ =>
{
// Clear data (again) when Room changes
_data.RoomMessages.Clear();
_data.RoomPlayers.Clear();
_data.RoomToLeaveName = room.Name;
foreach(var message in room.Messages)
{
string roomMessage = $"{message.gamerTag}: {message.content}";
_data.RoomMessages.Add(roomMessage);
}
foreach(var player in room.Players)
{
string playerName = $"{player}";
_data.RoomPlayers.Add(playerName);
}
Refresh();
});
room.OnMessageReceived += Room_OnMessageReceived;
}
Refresh();
});
}
public async Task<bool> IsProfanity(string text)
{
bool isProfanityText = true;
try
{
var result = await _beamableAPI.Experimental.ChatService.ProfanityAssert(text);
isProfanityText = false;
} catch{}
return isProfanityText;
}
public async Task<EmptyResponse> SendRoomMessage()
{
string messageToSend = _data.MessageToSend;
bool isProfanity = await IsProfanity(messageToSend);
if (isProfanity)
{
// Disallow (or prompt Player to resubmit)
messageToSend = "Message Not Allowed";
}
foreach(RoomHandle room in _chatView.roomHandles)
{
if (room.Players.Count > 0)
{
await room.SendMessage(messageToSend);
}
}
return new EmptyResponse();
}
public async Task<EmptyResponse> CreateRoom ()
{
string roomName = _data.RoomToCreateName;
bool keepSubscribed = false;
List<long> players = new List<long>{_beamableAPI.User.id};
var result = await _beamableAPI.Experimental.ChatService.CreateRoom(
roomName, keepSubscribed, players);
Refresh();
return new EmptyResponse();
}
public async Task<EmptyResponse> LeaveRoom()
{
var roomInfos = await _beamableAPI.Experimental.ChatService.GetMyRooms();
foreach(var roomInfo in roomInfos)
{
var result = await _beamableAPI.Experimental.ChatService.LeaveRoom(roomInfo.id);
}
Refresh();
return new EmptyResponse();
}
public void Refresh()
{
_data.IsInRoom = _data.RoomPlayers.Count > 0;
// Create new mock message
int messageIndex = _data.RoomMessages.Count;
_data.MessageToSend = $"Hello World {messageIndex:000}!";
// Create new mock group name
int groupIndex = _data.RoomNames.Count;
_data.RoomToCreateName = $"Room{groupIndex:000}";
// Create temp name for pretty UI
if (string.IsNullOrEmpty(_data.RoomToLeaveName))
{
_data.RoomToLeaveName = _data.RoomToCreateName;
}
// Log
Debug.Log($"Refresh()");
Debug.Log($"\tRoomNames.Count = {_data.RoomNames.Count}");
Debug.Log($"\tRoomPlayers.Count = {_data.RoomPlayers.Count}");
Debug.Log($"\tRoomMessages.Count = {_data.RoomMessages.Count}");
Debug.Log($"\tIsInRoom = {_data.IsInRoom}");
// Send relevant data to the UI for rendering
OnRefreshed?.Invoke(_data);
}
// Event Handlers -------------------------------
private void Room_OnMessageReceived(Message message)
{
string roomMessage = $"{message.gamerTag}: {message.content}";
Debug.Log($"Room_OnMessageReceived() roomMessage = {roomMessage}");
_data.RoomMessages.Add(roomMessage);
Refresh();
}
private void Room_OnRemoved()
{
Debug.Log($"Room_OnRemoved");
Refresh();
}
}
}
Advanced
This section contains any advanced configuration options and workflows.
Group Chat
Players can create groups, interact, and chat to group members in real-time. See Groups for more info.
Filtering Chat Messages
Beamable supports filtering chat messages to help keep the game chat safe.
public async void IsProfanity()
{
string text = "pornography"; // Ex. This string is profane
bool isProfanityText = true;
try
{
var result = await _beamableAPI.Experimental.ChatService.ProfanityAssert(text);
isProfanityText = false;
} catch{}
Debug.Log($"isProfanityText = {isProfanityText} for {text}");
}
Updated 4 months ago