//Handler private Task InteractionHandler(DiscordClient client, InteractionCreateEventArgs e) { _ = Task.Run(async() => { InteractionContext context = new InteractionContext { Interaction = e.Interaction, Channel = e.Interaction.Channel, Guild = e.Interaction.Guild, User = e.Interaction.User, Client = client, SlashCommandsExtension = this, CommandName = e.Interaction.Data.Name, InteractionId = e.Interaction.Id, Token = e.Interaction.Token, Services = _configuration?.Services }; try { var methods = CommandMethods.Where(x => x.Id == e.Interaction.Data.Id); var groups = GroupCommands.Where(x => x.Id == e.Interaction.Data.Id); var subgroups = SubGroupCommands.Where(x => x.Id == e.Interaction.Data.Id); if (!methods.Any() && !groups.Any() && !subgroups.Any()) { throw new Exception("An interaction was created, but no command was registered for it"); } if (methods.Any()) { var method = methods.First(); var args = await ResloveInteractionCommandParameters(e, context, method.Method); var classinstance = ActivatorUtilities.CreateInstance(_configuration?.Services, method.ParentClass); var task = (Task)method.Method.Invoke(classinstance, args.ToArray()); await task; } else if (groups.Any()) { var command = e.Interaction.Data.Options.First(); var method = groups.First().Methods.First(x => x.Key == command.Name).Value; var args = await ResloveInteractionCommandParameters(e, context, method); var classinstance = ActivatorUtilities.CreateInstance(_configuration?.Services, groups.First().ParentClass); var task = (Task)method.Invoke(classinstance, args.ToArray()); await task; } else if (subgroups.Any()) { var command = e.Interaction.Data.Options.First(); var group = subgroups.First(x => x.SubCommands.Any(y => y.Name == command.Name)).SubCommands.First(x => x.Name == command.Name); var method = group.Methods.First(x => x.Key == command.Options.First().Name).Value; var args = await ResloveInteractionCommandParameters(e, context, method); var classinstance = ActivatorUtilities.CreateInstance(_configuration?.Services, group.ParentClass); var task = (Task)method.Invoke(classinstance, args.ToArray()); await task; } await _executed.InvokeAsync(this, new SlashCommandExecutedEventArgs { Context = context }); } catch (Exception ex) { await _error.InvokeAsync(this, new SlashCommandErrorEventArgs { Context = context, Exception = ex }); } }); return(Task.CompletedTask); }