]> git.deb.at Git - rhonda/impostor.git/commitdiff
Giving plugin more control over when it should be executed (#74)
authorJonas Kamsker <11245306+JKamsker@users.noreply.github.com>
Sat, 24 Oct 2020 21:06:12 +0000 (23:06 +0200)
committerGitHub <noreply@github.com>
Sat, 24 Oct 2020 21:06:12 +0000 (23:06 +0200)
This pr should give the plugin dev the option to receive all events to his liking without constraining it to a specific type at compile time

Co-authored-by: Weirdo <git.jonas@kamsker.at>
Co-authored-by: AeonLucid <aeonlucid@outlook.com>
.gitignore
src/Impostor.Api/Events/IManualEventListener.cs [new file with mode: 0644]
src/Impostor.Plugins.Example/Impostor.Plugins.Example.csproj
src/Impostor.Server/Events/EventManager.cs
src/Impostor.Server/Events/Register/ManualRegisteredEventListener.cs [new file with mode: 0644]

index 835ced0a756a0ed4df9d9a03da89f11742e4507a..1170bdba0c56e1a0cdb5973aaa99217f02f73dbb 100644 (file)
@@ -4,3 +4,4 @@
 /src/Impostor.Plugins.Debugger/Properties/launchSettings.json
 /tools
 
+.local/
diff --git a/src/Impostor.Api/Events/IManualEventListener.cs b/src/Impostor.Api/Events/IManualEventListener.cs
new file mode 100644 (file)
index 0000000..b5c140e
--- /dev/null
@@ -0,0 +1,13 @@
+using System.Threading.Tasks;
+
+namespace Impostor.Api.Events
+{
+    public interface IManualEventListener : IEventListener
+    {
+        public bool CanExecute<T>();
+
+        public ValueTask Execute(IEvent @event);
+
+        EventPriority Priority { get; set; }
+    }
+}
\ No newline at end of file
index 4d93f83a26d66cd6a3822eda3d6b3296b9e2a2d4..5f88c1ccaf7051d4b337d29cc2c3211ed52f87dd 100644 (file)
@@ -1,11 +1,10 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
     <PropertyGroup>
         <TargetFramework>netstandard2.1</TargetFramework>
     </PropertyGroup>
 
     <ItemGroup>
-      <ProjectReference Include="..\Impostor.Api\Impostor.Api.csproj" />
+        <ProjectReference Include="..\Impostor.Api\Impostor.Api.csproj"/>
     </ItemGroup>
-
 </Project>
index 438c1c2bff2454db8b9345036d25708ceeb71725..6d0a47fe123ffdd67a3af0b5d3c6351698602338 100644 (file)
@@ -98,6 +98,12 @@ namespace Impostor.Server.Events
         {
             foreach (var handler in services.GetServices<IEventListener>())
             {
+                if (handler is IManualEventListener manualEventListener && manualEventListener.CanExecute<TEvent>())
+                {
+                    yield return new EventHandler(handler, new ManualRegisteredEventListener(manualEventListener));
+                    continue;
+                }
+
                 var events = RegisteredEventListener.FromType(handler.GetType());
 
                 foreach (var eventHandler in events)
@@ -120,4 +126,4 @@ namespace Impostor.Server.Events
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/Impostor.Server/Events/Register/ManualRegisteredEventListener.cs b/src/Impostor.Server/Events/Register/ManualRegisteredEventListener.cs
new file mode 100644 (file)
index 0000000..e81e8f8
--- /dev/null
@@ -0,0 +1,30 @@
+using System;
+using System.Threading.Tasks;
+using Impostor.Api.Events;
+
+namespace Impostor.Server.Events.Register
+{
+    internal class ManualRegisteredEventListener : IRegisteredEventListener
+    {
+        public Type EventType { get; } = typeof(object);
+
+        private readonly IManualEventListener _manualEventListener;
+
+        public ManualRegisteredEventListener(IManualEventListener manualEventListener)
+        {
+            _manualEventListener = manualEventListener;
+        }
+
+        public EventPriority Priority => _manualEventListener.Priority;
+
+        public ValueTask InvokeAsync(object eventHandler, object @event, IServiceProvider provider)
+        {
+            if (@event is IEvent typedEvent)
+            {
+                return _manualEventListener.Execute(typedEvent);
+            }
+
+            return ValueTask.CompletedTask;
+        }
+    }
+}