コード例 #1
0
        private void Client_OnInteraction(DiscordSocketClient client, DiscordInteractionEventArgs args)
        {
            if (args.Interaction.Type == DiscordInteractionType.ApplicationCommand && args.Interaction.ApplicationId == ApplicationId)
            {
                foreach (var cmd in _commands)
                {
                    if (cmd.Name == args.Interaction.Data.CommandName)
                    {
                        if (cmd.Options.Count > 0 && cmd.Options[0].Type == CommandOptionType.SubCommand)
                        {
                            var subCommand = args.Interaction.Data.CommandArguments[0];
                            Handle($"{cmd.Name}.{subCommand.Name}", args.Interaction, subCommand.Options == null ? null : subCommand.Options.ToList());
                        }
                        else
                        {
                            Handle(cmd.Name, args.Interaction, args.Interaction.Data.CommandArguments.ToList());
                        }

                        break;
                    }
                }
            }
        }
コード例 #2
0
        private void Client_OnInteraction(DiscordSocketClient client, DiscordInteractionEventArgs args)
        {
            if (args.Interaction.Type == DiscordInteractionType.ApplicationCommand && args.Interaction.ApplicationId == ApplicationId)
            {
                foreach (var cmd in _commands)
                {
                    if (cmd.Name == args.Interaction.Data.CommandName)
                    {
                        var localCommand = _handlerDict[cmd.Name];

                        var handler = (SlashCommand)Activator.CreateInstance(localCommand.HandlerType);
                        handler.Prepare(args.Interaction);

                        if (args.Interaction.Data.CommandArguments != null)
                        {
                            foreach (var suppliedArg in args.Interaction.Data.CommandArguments)
                            {
                                foreach (var param in cmd.Options)
                                {
                                    if (param.Name == suppliedArg.Name)
                                    {
                                        var    property = localCommand.Parameters[param.Name];
                                        object value    = suppliedArg.Value;

                                        switch (param.Type)
                                        {
                                        case CommandOptionType.Channel:
                                            value = args.Interaction.Data.Resolved.Channels[ulong.Parse(suppliedArg.Value)];
                                            break;

                                        case CommandOptionType.Role:
                                            value = args.Interaction.Data.Resolved.Roles[ulong.Parse(suppliedArg.Value)];
                                            break;

                                        case CommandOptionType.User:
                                            if (property.PropertyType == typeof(DiscordUser))
                                            {
                                                value = args.Interaction.Data.Resolved.Users[ulong.Parse(suppliedArg.Value)];
                                            }
                                            else
                                            {
                                                value = args.Interaction.Data.Resolved.Members[ulong.Parse(suppliedArg.Value)];
                                            }
                                            break;

                                        case CommandOptionType.Mentionable:
                                            value = ResolveObject(args.Interaction.Data.Resolved, ulong.Parse(suppliedArg.Value));
                                            break;

                                        default:
                                            value = Convert.ChangeType(value, property.PropertyType);
                                            break;
                                        }

                                        property.SetValue(handler, value);

                                        break;
                                    }
                                }
                            }
                        }

                        if (localCommand.Delayed)
                        {
                            args.Interaction.Respond(InteractionCallbackType.DelayedMessage);
                            args.Interaction.ModifyResponse(handler.Handle());
                        }
                        else
                        {
                            args.Interaction.Respond(InteractionCallbackType.RespondWithMessage, handler.Handle());
                        }

                        break;
                    }
                }
            }
        }