You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:20:30