From 7ecd7f4ec89c8a6335242dfa16f3d01160e351e7 Mon Sep 17 00:00:00 2001 From: Jonas Kamsker <11245306+JKamsker@users.noreply.github.com> Date: Sat, 24 Oct 2020 23:06:12 +0200 Subject: [PATCH] Giving plugin more control over when it should be executed (#74) 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 Co-authored-by: AeonLucid --- .gitignore | 1 + .../Events/IManualEventListener.cs | 13 ++++++++ .../Impostor.Plugins.Example.csproj | 5 ++-- src/Impostor.Server/Events/EventManager.cs | 8 ++++- .../Register/ManualRegisteredEventListener.cs | 30 +++++++++++++++++++ 5 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 src/Impostor.Api/Events/IManualEventListener.cs create mode 100644 src/Impostor.Server/Events/Register/ManualRegisteredEventListener.cs diff --git a/.gitignore b/.gitignore index 835ced0..1170bdb 100644 --- a/.gitignore +++ b/.gitignore @@ -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 index 0000000..b5c140e --- /dev/null +++ b/src/Impostor.Api/Events/IManualEventListener.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; + +namespace Impostor.Api.Events +{ + public interface IManualEventListener : IEventListener + { + public bool CanExecute(); + + public ValueTask Execute(IEvent @event); + + EventPriority Priority { get; set; } + } +} \ No newline at end of file diff --git a/src/Impostor.Plugins.Example/Impostor.Plugins.Example.csproj b/src/Impostor.Plugins.Example/Impostor.Plugins.Example.csproj index 4d93f83..5f88c1c 100644 --- a/src/Impostor.Plugins.Example/Impostor.Plugins.Example.csproj +++ b/src/Impostor.Plugins.Example/Impostor.Plugins.Example.csproj @@ -1,11 +1,10 @@ - + netstandard2.1 - + - diff --git a/src/Impostor.Server/Events/EventManager.cs b/src/Impostor.Server/Events/EventManager.cs index 438c1c2..6d0a47f 100644 --- a/src/Impostor.Server/Events/EventManager.cs +++ b/src/Impostor.Server/Events/EventManager.cs @@ -98,6 +98,12 @@ namespace Impostor.Server.Events { foreach (var handler in services.GetServices()) { + if (handler is IManualEventListener manualEventListener && manualEventListener.CanExecute()) + { + 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 index 0000000..e81e8f8 --- /dev/null +++ b/src/Impostor.Server/Events/Register/ManualRegisteredEventListener.cs @@ -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; + } + } +} -- 2.39.5