Add DI support for interaction commands
This commit is contained in:
parent
24749d9009
commit
a1893c7414
3 changed files with 12 additions and 10 deletions
|
@ -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()
|
||||
|
|
|
@ -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<string, Type> _commands = new();
|
||||
|
||||
public Dictionary<string, Command> 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<InteractionResponse> 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();
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue