Пример #1
0
        //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);
        }