能否使用List<string>作为Discord.Net斜杠命令的选择参数?
如何在Discord.Net中实现动态选择列表的斜杠命令参数
Discord的斜杠命令不支持直接将List<string>作为参数类型来生成动态选项,但可以通过以下两种官方支持的方式实现动态填充的选择列表:
方案1:使用自动补全(Autocomplete)推荐
自动补全是适合动态场景的最优方案,用户输入时会实时返回匹配的选项,支持从数据库等数据源动态获取数据。
代码示例
public class CharacterChoiceModule : InteractionModuleBase<SocketInteractionContext> { // 模拟从数据库获取动态角色列表的方法 private List<string> GetDynamicCharacterNames() { // 替换为你的数据库查询逻辑 return new List<string> { "Gérard", "Daniel", "Marie", "Pierre" }; } [SlashCommand("personnage", "选择一个角色")] public async Task Choice( [Autocomplete(typeof(CharacterAutocompleteHandler))] string personnage) { await RespondAsync($"你选择了:{personnage}"); } } // 自动补全逻辑处理器 public class CharacterAutocompleteHandler : AutocompleteHandler { public override async Task<AutocompletionResult> GenerateSuggestionsAsync(IInteractionContext context, IAutocompleteInteraction autocompleteInteraction, IParameterInfo parameter, IServiceProvider services) { // 获取动态数据 var characterNames = new List<string> { "Gérard", "Daniel", "Marie", "Pierre" }; // 根据用户输入过滤选项(可选) var input = autocompleteInteraction.Data.Current.Value.ToString(); var filteredNames = characterNames.Where(name => name.StartsWith(input, StringComparison.OrdinalIgnoreCase)).ToList(); // 转换为Discord要求的选项格式,最多返回25个(Discord限制) var options = filteredNames.Select(name => new AutocompleteOptionBuilder().WithName(name).WithValue(name)).ToList(); return AutocompletionResult.FromSuccess(options); } }
注意事项
- 自动补全返回的选项数量上限为25个,超出会被Discord自动截断
- 若使用依赖注入,需确保自动补全处理器已被正确注册
方案2:动态注册命令选项
如果选项列表仅需在程序启动时加载(后续不动态更新),可以通过SlashCommandBuilder手动构建命令并添加动态选项。
代码示例
public async Task RegisterDynamicCommand(DiscordSocketClient client) { // 从数据库获取动态角色列表 var characterNames = new List<string> { "Gérard", "Daniel", "Marie", "Pierre" }; // 构建斜杠命令 var commandBuilder = new SlashCommandBuilder() .WithName("personnage") .WithDescription("选择一个角色") .AddOption("personnage", ApplicationCommandOptionType.String, "角色名称", isRequired: true); // 为参数动态添加选项 foreach (var name in characterNames) { commandBuilder.Options.First().AddChoice(name, name); } // 注册全局命令(生效需约1小时缓存时间) await client.Rest.CreateGlobalApplicationCommandAsync(commandBuilder.Build()); // 或注册服务器命令(立即生效):await client.Rest.CreateGuildApplicationCommandAsync(guildId, commandBuilder.Build()); }
注意事项
- 该方式生成的选项是静态的,需重新注册命令才能更新选项列表
- 全局命令存在缓存延迟,服务器级命令可立即生效
关键说明
枚举能自动生成选项是因为Discord.Net后台会将枚举值转换为静态选项列表,但动态列表无法通过参数类型直接实现,必须通过上述两种方式适配Discord的命令规范。
内容的提问来源于stack exchange,提问作者M. Ozn
相关产品推荐
相关产品推荐

