using System; using System.Collections.Generic; using Newtonsoft.Json; using WalletConnectSharp.Core.Events.Request; using WalletConnectSharp.Core.Events.Response; using WalletConnectSharp.Core.Models; namespace WalletConnectSharp.Core.Events { public class EventDelegator : IDisposable { private Dictionary> Listeners = new Dictionary>(); public void ListenForGenericResponse(object id, EventHandler> callback) { ListenFor("response:" + id, callback); } public void ListenForResponse(object id, EventHandler> callback) where T : JsonRpcResponse { ListenFor("response:" + id, callback); } public void ListenFor(string eventId, EventHandler> callback) { EventManager>.Instance.EventTriggers[eventId] += callback; SubscribeProvider(eventId, EventFactory.Instance.ProviderFor()); } public void ListenFor(string eventId, EventHandler> callback) where T : JsonRpcResponse { EventManager>.Instance.EventTriggers[eventId] += callback; SubscribeProvider(eventId, EventFactory.Instance.ProviderFor()); } public void ListenFor(string eventId, EventHandler> callback) where T : JsonRpcRequest { EventManager>.Instance.EventTriggers[eventId] += callback; SubscribeProvider(eventId, EventFactory.Instance.ProviderFor()); } private void SubscribeProvider(string eventId, IEventProvider provider) { List listProvider; if (!Listeners.ContainsKey(eventId)) { //Debug.Log("Adding new EventProvider list for " + eventId); listProvider = new List(); Listeners.Add(eventId, listProvider); } else { listProvider = Listeners[eventId]; } listProvider.Add(provider); } public bool Trigger(string topic, T obj) { return Trigger(topic, JsonConvert.SerializeObject(obj)); } public bool Trigger(string topic, string json) { if (Listeners.ContainsKey(topic)) { var providerList = Listeners[topic]; for (int i = 0; i < providerList.Count; i++) { var provider = providerList[i]; provider.PropagateEvent(topic, json); } return providerList.Count > 0; } return false; } public void Dispose() { Clear(); } public void Clear() { Listeners.Clear(); } } }