using System; using System.Collections; using System.Collections.Generic; using BITKit; using UnityEngine; namespace BITFALL.InGameInternet { [Serializable] public struct MeChatSingleton:IMeChatService { public event Action OnMessageReceived { add => MeChatService.OnMessageReceived += value; remove => MeChatService.OnMessageReceived -= value; } public void Send(string sender, string receiver, string message) { MeChatService.Send(sender, receiver, message); } } public class MeChatService : MonoBehaviour { [BITCommand] public static void MeChat(string sender, string receiver, string message) { Send(sender, receiver, message); } public static event Action OnMessageReceived; private static Queue<(string, string, string)> _queue = new(); public static void Send(string sender, string receiver, string message) { _queue.Enqueue((sender, receiver, message)); } [SerializeReference, SubclassSelector] private ITicker _ticker; private void Start() { _ticker.Add(OnTick); destroyCancellationToken.Register(Dispose); } private void Dispose() { _ticker.Remove(OnTick); } private void OnTick(float obj) { if(_queue.TryDequeue(out var message)) OnMessageReceived?.Invoke(message.Item1, message.Item2, message.Item3); } } }