From a1893c74144eae22100dd1181cdea7b79f3e985e Mon Sep 17 00:00:00 2001 From: Daan Boerlage Date: Sat, 30 Oct 2021 14:46:23 +0200 Subject: [PATCH] Add DI support for interaction commands --- src/Bot/Program.cs | 2 +- src/Core/Interactions/InteractionCommandManager.cs | 13 +++++++------ src/Web/WebApiStartup.cs | 7 ++++--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Bot/Program.cs b/src/Bot/Program.cs index 31b67e0..4b01441 100644 --- a/src/Bot/Program.cs +++ b/src/Bot/Program.cs @@ -229,7 +229,7 @@ namespace Geekbot.Bot } var highscoreManager = new HighscoreManager(_databaseInitializer.Initialize(), _userRepository); - WebApiStartup.StartWebApi(_logger, _runParameters, _commands, _databaseInitializer.Initialize(), _client, _globalSettings, highscoreManager); + WebApiStartup.StartWebApi(_servicesProvider, _logger, _runParameters, _commands, _databaseInitializer.Initialize(), _client, _globalSettings, highscoreManager); } private void RegisterSentry() diff --git a/src/Core/Interactions/InteractionCommandManager.cs b/src/Core/Interactions/InteractionCommandManager.cs index 88285ed..221e7b5 100644 --- a/src/Core/Interactions/InteractionCommandManager.cs +++ b/src/Core/Interactions/InteractionCommandManager.cs @@ -1,25 +1,26 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Net.Http.Headers; using System.Reflection; using System.Threading.Tasks; -using Geekbot.Core.GlobalSettings; using Geekbot.Core.Interactions.ApplicationCommand; using Geekbot.Core.Interactions.Request; using Geekbot.Core.Interactions.Response; -using Geekbot.Core.Logger; +using Microsoft.Extensions.DependencyInjection; namespace Geekbot.Core.Interactions { public class InteractionCommandManager : IInteractionCommandManager { + private readonly IServiceProvider _provider; + private readonly Dictionary _commands = new(); public Dictionary CommandsInfo { get; init; } - public InteractionCommandManager() + public InteractionCommandManager(IServiceProvider provider) { + _provider = provider; var interactions = Assembly.GetCallingAssembly() .GetTypes() .Where(type => type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(InteractionBase))) @@ -29,7 +30,7 @@ namespace Geekbot.Core.Interactions foreach (var interactionType in interactions) { - var instance = (InteractionBase)Activator.CreateInstance(interactionType); + var instance = (InteractionBase)ActivatorUtilities.CreateInstance(provider, interactionType) ; var commandInfo = instance.GetCommandInfo(); _commands.Add(commandInfo.Name, interactionType); CommandsInfo.Add(commandInfo.Name, commandInfo); @@ -39,7 +40,7 @@ namespace Geekbot.Core.Interactions public async Task RunCommand(Interaction interaction) { var type = _commands[interaction.Data.Name]; - var command = (InteractionBase)Activator.CreateInstance(type); + var command = ActivatorUtilities.CreateInstance(_provider, type) as InteractionBase; InteractionResponse response; command.BeforeExecute(); diff --git a/src/Web/WebApiStartup.cs b/src/Web/WebApiStartup.cs index ad84d68..d69fd31 100644 --- a/src/Web/WebApiStartup.cs +++ b/src/Web/WebApiStartup.cs @@ -1,4 +1,5 @@ -using System.Net; +using System; +using System.Net; using System.Reflection; using Discord.Commands; using Discord.WebSocket; @@ -22,7 +23,7 @@ namespace Geekbot.Web // Using the "Microsoft.NET.Sdk.Web" SDK requires a static main function... public static void Main() {} - public static void StartWebApi(IGeekbotLogger logger, RunParameters runParameters, CommandService commandService, + public static void StartWebApi(IServiceProvider commandProvider, IGeekbotLogger logger, RunParameters runParameters, CommandService commandService, DatabaseContext databaseContext, DiscordSocketClient client, IGlobalSettings globalSettings, IHighscoreManager highscoreManager) { WebHost.CreateDefaultBuilder() @@ -43,7 +44,7 @@ namespace Geekbot.Web }); services.AddSentry(); - var interactionCommandManager = new InteractionCommandManager(); + var interactionCommandManager = new InteractionCommandManager(commandProvider); services.AddSingleton(databaseContext); services.AddSingleton(globalSettings);