Files
webRtc/Assets/Script/WebRtc/MessageChannel.cs

108 lines
3.5 KiB
C#
Raw Normal View History

2026-05-12 17:45:40 +08:00
// Assets/Script/MessageChannel.cs
2026-05-12 23:04:08 +08:00
2026-05-12 17:45:40 +08:00
using System;
2026-05-12 23:04:08 +08:00
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
2026-05-12 17:45:40 +08:00
using UnityEngine;
namespace Unity.RenderStreaming
{
public class MessageChannel : DataChannelBase
{
private const int MAX_HISTORY = 100;
2026-05-12 23:04:08 +08:00
[Header("消息记录")] [SerializeField] [TextArea(1, 3)]
2026-05-12 23:04:08 +08:00
private string lastReceivedMessage;
[SerializeField] private int receivedMessageCount;
[SerializeField] private List<MessageRecord> messageHistory = new();
2026-05-12 23:04:08 +08:00
public IReadOnlyList<MessageRecord> MessageHistory => messageHistory;
public int ReceivedMessageCount => receivedMessageCount;
private void Start()
{
label = "on-message";
}
public event Action<string, UserInfo> OnUserInfoMessageReceived;
public event Action<string, MediaStateChange> OnMediaStateChangeReceived;
2026-05-12 23:04:08 +08:00
public override void OnMessage(string message)
2026-05-12 17:45:40 +08:00
{
try
{
2026-05-12 23:04:08 +08:00
Debug.Log($"[MessageChannel] Received: {message}");
var record = JsonConvert.DeserializeObject<MessageRecord>(message);
if (record == null) record = new MessageRecord { type = "raw", data = message };
2026-05-14 21:25:42 +08:00
record.timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
ConnectionId = record.connectionId;
2026-05-12 23:04:08 +08:00
JObject json = null;
switch (record.type)
{
case MessageTypes.Chat:
var chat = record.data as ChatData;
break;
case MessageTypes.UserInfo:
json = record.data as JObject;
var info = json.ToObject<UserInfo>();
2026-05-14 21:25:42 +08:00
OnUserInfoMessageReceived?.Invoke(ConnectionId, info);
2026-05-12 23:04:08 +08:00
break;
case MessageTypes.MediaStateChange:
json = record.data as JObject;
var mediaState = json.ToObject<MediaStateChange>();
OnMediaStateChangeReceived?.Invoke(ConnectionId, mediaState);
break;
}
messageHistory.Add(record);
if (messageHistory.Count > MAX_HISTORY)
messageHistory.RemoveAt(0);
lastReceivedMessage = message;
receivedMessageCount++;
2026-05-12 17:45:40 +08:00
}
catch (Exception e)
{
Debug.LogError($"[MessageChannel] Parse error: {e.Message}");
}
}
2026-05-12 23:04:08 +08:00
public void SendMessage<T>(string type, T data)
{
var record = new MessageRecord
{
type = type,
data = data
2026-05-12 23:04:08 +08:00
};
var json = JsonConvert.SerializeObject(record);
2026-05-12 23:04:08 +08:00
Send(json);
record.isSent = true;
messageHistory.Add(record);
if (messageHistory.Count > MAX_HISTORY)
messageHistory.RemoveAt(0);
}
public void ClearHistory()
{
messageHistory.Clear();
receivedMessageCount = 0;
lastReceivedMessage = "";
}
[Serializable]
public class MessageRecord
{
public string type;
public bool isSent;
public string timestamp = DateTime.Now.ToString();
2026-05-14 21:25:42 +08:00
public string connectionId;
public string participantId;
public object data;
2026-05-12 23:04:08 +08:00
}
2026-05-12 17:45:40 +08:00
}
}