using Cysharp.Threading.Tasks; using MessagePipe; using PMaker.UI; using System; using System.Threading; using UniRx; namespace PMaker.MessagePipe { public static partial class MessageKit { static BuiltinContainerBuilder _builtinContainerBuilder; public static IPublisher GetPublisher() { return GlobalMessagePipe.GetPublisher(); } public static ISubscriber GetSubscriber() { return GlobalMessagePipe.GetSubscriber(); } public static IAsyncPublisher GetAsyncPublisher() { return GlobalMessagePipe.GetAsyncPublisher(); } public static IAsyncSubscriber GetAsyncSubscriber() { return GlobalMessagePipe.GetAsyncSubscriber(); } public static IAsyncPublisher GetAsyncPublisher() { return GlobalMessagePipe.GetAsyncPublisher(); } public static IAsyncSubscriber GetAsyncSubscriber() { return GlobalMessagePipe.GetAsyncSubscriber(); } public static IPublisher GetPublisher() { return GlobalMessagePipe.GetPublisher(); } public static ISubscriber GetSubscriber() { return GlobalMessagePipe.GetSubscriber(); } } public static partial class MessageKit { public static UniTask PublishAsync(TKey key, TMessage message, CancellationToken cancellationToken = default) { return GetAsyncPublisher().PublishAsync(key, message, cancellationToken); } public static void Publish(TKey key, TMessage message) { GlobalMessagePipe.GetPublisher().Publish(key, message); } public static void Publish(TMessage message) { GlobalMessagePipe.GetPublisher().Publish(message); } public static async UniTask PublishFuncAsync(TKey key, TMessage message, CancellationToken cancellationToken = default) { var refHelper = new Ref() { value = message }; await GetAsyncPublisher>().PublishAsync(key, refHelper, cancellationToken); return refHelper.value; } public static TMessage PublishFunc(TKey key, TMessage message) { var refHelper = new Ref(); GlobalMessagePipe.GetPublisher>().Publish(key, refHelper); return refHelper.value; } public static ISubscriber> GetFuncSubscriber() { return GlobalMessagePipe.GetSubscriber>(); } public static IAsyncSubscriber> GetFuncAsyncSubscriber() { return GlobalMessagePipe.GetAsyncSubscriber>(); } } // Init public static partial class MessageKit { static MessageKit() { _builtinContainerBuilder = new BuiltinContainerBuilder(); _builtinContainerBuilder.AddMessagePipe() .AddMessageBroker() .AddMessageBroker() .AddMessageBroker() .AddMessageBroker() // message .AddMessageBroker() .AddMessageBroker>() .AddMessageBroker>() .AddMessageBroker[]>(); GlobalMessagePipe.SetProvider(_builtinContainerBuilder.BuildServiceProvider()); } } public class Ref { public T value; } public abstract class MessageBehaviourBase : BaseBehaviour { protected abstract TKey Key { get; } protected Func asyncHandler; protected Action handler; protected virtual void Awake() { MessageKit.GetAsyncSubscriber() .Subscribe(Key, async (message, token) => { await this.asyncHandler(message, token); }) .AddTo(this); MessageKit.GetSubscriber() .Subscribe(Key, message => { this.handler(message); }) .AddTo(this); } } public class NameMessageBehaviour : MessageBehaviourBase { protected override string Key => this.name; } }