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; } } } }
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; } } } }