Website Summary Files Commits Branches @commit @diff @stats
path: root / src / Web / PUSG.Web / Events / EventService.cs
blob: 8ab1b68c766771f850c0d57ad08f0e089ca203f9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using PUSG.Web.Events.Api;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace PUSG.Web.Events
{
    public class EventService : IEventService
    {
        private List<IEventHandler> eventHandlers;

        public EventService()
        {
            this.eventHandlers = new List<IEventHandler>();
        }
        
        private void DisposeUnavailable()
        {
            this.eventHandlers.RemoveAll(eventHandler => !eventHandler.IsAvailable());
        }

        public IEnumerable<IEventHandler> EventHandlers => this.eventHandlers;

        public async Task Publish(string eventName, params object[] args)
        {
            List<IEventHandler> availableHandlers = this.EventHandlers.Where(eventHandler => eventHandler.IsAvailable()).ToList();

            foreach (var eventHandler in availableHandlers)
            {
                await eventHandler.HandleEvent(eventName, args);
            }

            this.DisposeUnavailable();
        }

        public void Subscribe(IEventHandler eventHandler)
        {
            this.eventHandlers.Add(eventHandler);
        }
    }
}