using EventBus; using ICommunication; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Threading.Tasks; namespace ActiveMQCommunication { [CommunicationType(false)] public class Communication : ICommunication.ICommunication { public string IP => bus == null ? "" : bus.Host; public int Port => bus == null ? 0 : bus.Port; public bool IsLan { get; } = false; private readonly Dictionary> _list = new Dictionary>(); string GetHash() { return DateTime.Now.Ticks.ToString(); } EasyMQ.IBus bus; public bool IsConnected { get; private set; } public bool IsService{ get; private set; } public event EventHandler Connected; public event EventHandler Disconnected; public void Close() { bus?.Dispose(); IsConnected = false; } public void Connect(string ip, int port) { IsService = false; try { bus = EasyMQ.ActiveHutch.Default.CreateBus(ip, port, new EasyMQ.MessagePackSerializer()); bus.ConnectionInterruptedListener += (_, _) => { IsConnected = false; Disconnected?.Invoke(this, EventArgs.Empty); }; IsConnected = true; } catch { IsConnected = false; } } public IEventData? GetEvent() { lock (_list) { string hash = GetHash(); if (_list.TryGetValue(typeof(MQEventData).FullName!, out List? baseevent)) { baseevent ??= new List(); if (baseevent.Count == 0) baseevent.Add(new MQEventData(bus, hash, hash)); return (IEventData)baseevent.First(); } else { MQEventData eventData = new MQEventData(bus, hash, hash); _list.Add(typeof(MQEventData).FullName!, new List() { eventData }); return eventData; } } } public IEventData? GetEvent() { lock (_list) { string hash = GetHash(); if (_list.TryGetValue(typeof(MQEventData).FullName!, out List? baseevent)) { baseevent ??= new List(); if (baseevent.Count == 0) baseevent.Add(new MQEventData(bus, hash, hash)); return (IEventData)baseevent.First(); } else { MQEventData eventData = new MQEventData(bus, hash, hash); _list.Add(typeof(MQEventData).FullName!, new List() { eventData }); return eventData; } } } public IAnonymousEventData? GetEvent(string eventName) { lock (_list) { string hash = GetHash(); ArgumentNullException.ThrowIfNullOrEmpty(eventName); if (_list.TryGetValue(typeof(MQAnonymousEventData).FullName!, out List? baseevent)) { baseevent ??= new List(); if (!baseevent.Where(x => x is MQAnonymousEventData && x.EventName.Contains(eventName)).Any()) baseevent.Add(new MQAnonymousEventData(bus, eventName, GetHash())); return (IAnonymousEventData)baseevent.Where(x => x is MQAnonymousEventData && (x as MQAnonymousEventData)!.EventName.Contains(eventName)).First(); } else { MQAnonymousEventData eventData = new MQAnonymousEventData(bus, eventName, GetHash()); _list.Add(typeof(MQAnonymousEventData).FullName!, new List() { eventData }); return eventData; } } } public IAnonymousEventData? GetEvent(string eventName) { lock (_list) { string hash = GetHash(); ArgumentNullException.ThrowIfNullOrEmpty(eventName); if (_list.TryGetValue(typeof(MQAnonymousEventData).FullName!, out List? baseevent)) { baseevent ??= new List(); if (!baseevent.Where(x => x is MQAnonymousEventData && x.EventName.Contains(eventName)).Any()) baseevent.Add(new MQAnonymousEventData(bus, eventName, GetHash())); return (IAnonymousEventData)baseevent.Where(x => x is MQAnonymousEventData && (x as MQAnonymousEventData)!.EventName.Contains(eventName)).First(); } else { MQAnonymousEventData eventData = new MQAnonymousEventData(bus, eventName, GetHash()); _list.Add(typeof(MQAnonymousEventData).FullName!, new List() { eventData }); return eventData; } } } public void Start() { } public void StartService(string ip,int port) { IsService = true; try { bus = EasyMQ.ActiveHutch.Default.CreateBus(ip, port, new EasyMQ.MessagePackSerializer()); bus.ConnectionInterruptedListener += (_, _) => { IsConnected = false; Disconnected?.Invoke(this, EventArgs.Empty); }; IsConnected = true; } catch { IsConnected = false; } } } }