diff options
Diffstat (limited to 'Impostor-dev/src/Impostor.Server/Plugins/PluginLoaderService.cs')
-rw-r--r-- | Impostor-dev/src/Impostor.Server/Plugins/PluginLoaderService.cs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/Impostor-dev/src/Impostor.Server/Plugins/PluginLoaderService.cs b/Impostor-dev/src/Impostor.Server/Plugins/PluginLoaderService.cs new file mode 100644 index 0000000..0afbc22 --- /dev/null +++ b/Impostor-dev/src/Impostor.Server/Plugins/PluginLoaderService.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Impostor.Api.Plugins; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +namespace Impostor.Server.Plugins +{ + public class PluginLoaderService : IHostedService + { + private readonly ILogger<PluginLoaderService> _logger; + private readonly IServiceProvider _serviceProvider; + private readonly List<PluginInformation> _plugins; + + public PluginLoaderService(ILogger<PluginLoaderService> logger, IServiceProvider serviceProvider, List<PluginInformation> plugins) + { + _logger = logger; + _serviceProvider = serviceProvider; + _plugins = plugins; + } + + public async Task StartAsync(CancellationToken cancellationToken) + { + _logger.LogInformation("Loading plugins."); + + foreach (var plugin in _plugins) + { + _logger.LogInformation("Enabling plugin {0}.", plugin); + + // Create instance and inject services. + plugin.Instance = (IPlugin) ActivatorUtilities.CreateInstance(_serviceProvider, plugin.PluginType); + + // Enable plugin. + await plugin.Instance.EnableAsync(); + } + + _logger.LogInformation( + _plugins.Count == 1 + ? "Loaded {0} plugin." + : "Loaded {0} plugins.", _plugins.Count); + } + + public async Task StopAsync(CancellationToken cancellationToken) + { + // Disable all plugins with a valid instance set. + // In the case of a failed startup, some can be null. + foreach (var plugin in _plugins.Where(plugin => plugin.Instance != null)) + { + _logger.LogInformation("Disabling plugin {0}.", plugin); + + // Disable plugin. + await plugin.Instance.DisableAsync(); + } + } + } +}
\ No newline at end of file |