]> git.deb.at Git - rhonda/impostor.git/commitdiff
Fixed IsCancelled on interface events (#110)
authorGerard Smit <gsmit1996@gmail.com>
Tue, 3 Nov 2020 01:21:19 +0000 (02:21 +0100)
committerGitHub <noreply@github.com>
Tue, 3 Nov 2020 01:21:19 +0000 (02:21 +0100)
src/Impostor.Server/Events/EventManager.cs
src/Impostor.Server/Events/Register/RegisteredEventListener.cs
src/Impostor.Tests/Events/EventManagerTests.cs

index df8829f4897976b6618b3aa55a0ded4a30ebb910..5625c4dd94373fc58de95112e63900455e40775e 100644 (file)
@@ -146,7 +146,7 @@ namespace Impostor.Server.Events
 
                 foreach (var eventHandler in events)
                 {
-                    if (eventHandler.EventType != typeof(TEvent))
+                    if (eventHandler.EventType != typeof(TEvent) && !interfaces.Contains(eventHandler.EventType))
                     {
                         continue;
                     }
index 100e0f1c2f1213a6a937133714baf0e8e332d181..120a45ed365f0fbdb12ff737e588fd4da607c33f 100644 (file)
@@ -12,6 +12,8 @@ namespace Impostor.Server.Events.Register
 {
     internal class RegisteredEventListener : IRegisteredEventListener
     {
+        private static readonly PropertyInfo IsCancelledProperty = typeof(IEventCancelable).GetProperty(nameof(IEventCancelable.IsCancelled))!;
+
         private static readonly ConcurrentDictionary<Type, RegisteredEventListener[]> Instances = new ConcurrentDictionary<Type, RegisteredEventListener[]>();
         private readonly Func<object, object, IServiceProvider, ValueTask> _invoker;
         private readonly Type _eventListenerType;
@@ -86,7 +88,7 @@ namespace Impostor.Server.Events.Register
                 {
                     invoke = Expression.Block(
                         Expression.IfThenElse(
-                            Expression.Property(@event, nameof(IEventCancelable.IsCancelled)),
+                            Expression.Property(@event, IsCancelledProperty),
                             Expression.Return(returnTarget, Expression.Default(typeof(ValueTask))),
                             Expression.Block(
                                 invoke,
@@ -106,7 +108,7 @@ namespace Impostor.Server.Events.Register
                 {
                     invoke = Expression.Block(
                         Expression.IfThenElse(
-                            Expression.Property(@event, nameof(IEventCancelable.IsCancelled)),
+                            Expression.Property(@event, IsCancelledProperty),
                             Expression.Return(returnTarget, Expression.Default(typeof(ValueTask))),
                             Expression.Return(returnTarget, invoke)),
                         Expression.Label(returnTarget, Expression.Default(typeof(ValueTask))));
@@ -161,4 +163,4 @@ namespace Impostor.Server.Events.Register
             }
         }
     }
-}
\ No newline at end of file
+}
index 12c36b148d487f64f5473dd5b1cacece82e60c85..d222d79b952dbb78d82f3484168d1bbff0ff9bc1 100644 (file)
@@ -118,7 +118,12 @@ namespace Impostor.Tests.Events
             Temporary
         }
 
-        public class SetValueEvent : IEventCancelable
+        public interface ISetValueEvent : IEventCancelable
+        {
+            int Value { get; }
+        }
+
+        public class SetValueEvent : ISetValueEvent
         {
             public SetValueEvent(int value)
             {
@@ -133,7 +138,7 @@ namespace Impostor.Tests.Events
         private class CancelAtHighEventListener : IEventListener
         {
             [EventListener(Priority = EventPriority.High)]
-            public void OnSetCalled(SetValueEvent e) => e.IsCancelled = true;
+            public void OnSetCalled(ISetValueEvent e) => e.IsCancelled = true;
         }
 
         private class EventListener : IEventListener
@@ -141,7 +146,7 @@ namespace Impostor.Tests.Events
             public int Value { get; private set; }
 
             [EventListener]
-            public void OnSetCalled(SetValueEvent e) => Value = e.Value;
+            public void OnSetCalled(ISetValueEvent e) => Value = e.Value;
         }
 
         private class PriorityEventListener : IEventListener
@@ -149,22 +154,22 @@ namespace Impostor.Tests.Events
             public List<EventPriority> Priorities { get; } = new List<EventPriority>();
 
             [EventListener(EventPriority.Lowest)]
-            public void OnLowest(SetValueEvent e) => Priorities.Add(EventPriority.Lowest);
+            public void OnLowest(ISetValueEvent e) => Priorities.Add(EventPriority.Lowest);
 
             [EventListener(EventPriority.Low)]
-            public void OnLow(SetValueEvent e) => Priorities.Add(EventPriority.Low);
+            public void OnLow(ISetValueEvent e) => Priorities.Add(EventPriority.Low);
 
             [EventListener]
-            public void OnNormal(SetValueEvent e) => Priorities.Add(EventPriority.Normal);
+            public void OnNormal(ISetValueEvent e) => Priorities.Add(EventPriority.Normal);
 
             [EventListener(EventPriority.High)]
-            public void OnHigh(SetValueEvent e) => Priorities.Add(EventPriority.High);
+            public void OnHigh(ISetValueEvent e) => Priorities.Add(EventPriority.High);
 
             [EventListener(EventPriority.Highest)]
-            public void OnHighest(SetValueEvent e) => Priorities.Add(EventPriority.Highest);
+            public void OnHighest(ISetValueEvent e) => Priorities.Add(EventPriority.Highest);
 
             [EventListener(EventPriority.Monitor)]
-            public void OnMonitor(SetValueEvent e) => Priorities.Add(EventPriority.Monitor);
+            public void OnMonitor(ISetValueEvent e) => Priorities.Add(EventPriority.Monitor);
         }
     }
-}
\ No newline at end of file
+}