Ejemplo n.º 1
0
        public async Task HandleEventAsync(IExportEvent exportEvent, CancellationToken token)
        {
            if (exportEvent == null)
            {
                throw new ArgumentNullException(nameof(exportEvent));
            }

            var handlerType = GetHandlerType(exportEvent);

            if (handlerType == null)
            {
                return;
            }

            var handlers = (IEnumerable <object>)_services.GetService(handlerType);

            if (!handlers.Any())
            {
                return;
            }

            var method = GetHandlerMethod(exportEvent);

            await method(handlers, exportEvent, token);
        }
Ejemplo n.º 2
0
        private void Handle(IExportEvent <UpdateObjectPayload> exportEvent, CancellationToken token)
        {
            if (exportEvent.Event != EventType.UpdateObject)
            {
                return;
            }

            var id       = exportEvent.Payload.Id;
            var position = exportEvent.Payload.Position;

            var isUpdated = false;

            do
            {
                if (!_state.Objects.TryGetValue(id, out var obj))
                {
                    return;
                }

                var updated = obj with
                {
                    Position = position
                };

                isUpdated = _state.Objects.TryUpdate(id, updated, obj);
            } while (!isUpdated);
        }
    }
Ejemplo n.º 3
0
        private static GenericHandlerDelegate GetHandlerMethod(IExportEvent exportEvent)
        {
            return(HandlerMethodMap.GetOrAdd(exportEvent.GetType(), type =>
            {
                var payloadType = GetPayloadType(type);
                if (payloadType == null)
                {
                    return null;
                }

                var handlersType = typeof(IEnumerable <>).MakeGenericType(
                    typeof(IExportEventHandler <>).MakeGenericType(payloadType)
                    );
                var eventType = typeof(IExportEvent <>).MakeGenericType(payloadType);
                var method = HandleGenericEventMethod.MakeGenericMethod(payloadType);

                var handlersParam = Expression.Parameter(typeof(object), "handlers");
                var eventParam = Expression.Parameter(typeof(IExportEvent), "exportEvent");
                var tokenParam = Expression.Parameter(typeof(CancellationToken), "token");

                var castHandlers = Expression.Convert(handlersParam, handlersType);
                var castEvent = Expression.Convert(eventParam, eventType);

                var callExpression = Expression.Call(method, castHandlers, castEvent, tokenParam);
                var lambda = Expression.Lambda <GenericHandlerDelegate>(callExpression, handlersParam, eventParam, tokenParam);

                return lambda.Compile();
            }));
        }
Ejemplo n.º 4
0
        private void Handle(IExportEvent <AddObjectPayload> exportEvent, CancellationToken token)
        {
            if (exportEvent.Event != EventType.AddObject)
            {
                return;
            }

            _state.Objects.TryAdd(exportEvent.Payload.Id, exportEvent.Payload);
        }
        Task IExportEventHandler.HandleEventAsync(IExportEvent exportEvent, CancellationToken token)
        {
            lock (_syncRoot)
            {
                _events.Add(exportEvent);
            }

            return(Task.CompletedTask);
        }
Ejemplo n.º 6
0
        private void Handle(IExportEvent <RemoveObjectPayload> exportEvent, CancellationToken token)
        {
            if (exportEvent.Event != EventType.RemoveObject)
            {
                return;
            }

            _state.Objects.TryRemove(exportEvent.Payload.Id, out _);
        }
Ejemplo n.º 7
0
        public Task HandleEventAsync(IExportEvent <InitPayload> exportEvent, CancellationToken token)
        {
            _state.IsRunning = true;

            _state.MissionName = exportEvent.Payload.MissionName;
            _state.Theatre     = exportEvent.Payload.Theatre;
            _state.MapCenter   = exportEvent.Payload.MapCenter;

            return(Task.CompletedTask);
        }
Ejemplo n.º 8
0
        public Task HandleEventAsync(IExportEvent <MissionEndPayload> exportEvent, CancellationToken token)
        {
            _state.IsRunning = false;

            _state.Objects.Clear();
            _state.Airbases.Clear();
            _state.MissionName = null;
            _state.Theatre     = null;
            _state.MapCenter   = null;
            _state.Time        = default;

            return(Task.CompletedTask);
        }
Ejemplo n.º 9
0
        private static Type GetHandlerType(IExportEvent exportEvent)
        {
            return(EventHandlerTypeMap.GetOrAdd(exportEvent.GetType(), type =>
            {
                var payloadType = GetPayloadType(type);
                if (payloadType == null)
                {
                    return null;
                }

                var handlerType = typeof(IExportEventHandler <>).MakeGenericType(payloadType);
                var enumerableType = typeof(IEnumerable <>).MakeGenericType(handlerType);

                return enumerableType;
            }));
        }
Ejemplo n.º 10
0
 private void Handle(IExportEvent <TimePayload> exportEvent, CancellationToken token)
 {
     _state.Time = exportEvent.Payload.Time;
 }
Ejemplo n.º 11
0
 public Task HandleEventAsync(IExportEvent <TimePayload> exportEvent, CancellationToken token)
 {
     Handle(exportEvent, token);
     return(Task.CompletedTask);
 }
Ejemplo n.º 12
0
 private static async Task HandleGenericEventAsync <T>(IEnumerable <IExportEventHandler <T> > handlers, IExportEvent <T> exportEvent, CancellationToken token)
 {
     foreach (var handler in handlers)
     {
         await handler.HandleEventAsync(exportEvent, token);
     }
 }
Ejemplo n.º 13
0
 private void Handle(IExportEvent <AddAirbasePayload> exportEvent)
 {
     _liveState.Airbases[exportEvent.Payload.Id] = exportEvent.Payload;
 }