Pycord斜杠命令:如何实现上下文依赖的自定义自动补全?
实现依赖上下文的斜杠命令自定义自动补全(Pycord)
可以通过Pycord的自定义自动补全函数实现需求,核心是把频道列表的生成逻辑从命令初始化阶段移到用户触发命令输入时执行,既能避免Bot启动时bot.guilds为空的问题,又能获取服务器内所有频道(包括用户未加入的私密频道)。
步骤1:编写自定义自动补全函数
这个函数会在用户开始输入命令的频道参数时触发,实时获取当前服务器的所有文本频道并生成补全选项:
async def channel_autocomplete(ctx: discord.AutocompleteContext): # 获取当前命令所在的服务器 guild = ctx.interaction.guild # 筛选服务器内所有文本频道(含私密频道) all_text_channels = guild.text_channels # 生成补全选项:名称显示频道名,值传入频道ID(Pycord会自动转换为TextChannel对象) return [ discord.OptionChoice(name=channel.name, value=str(channel.id)) for channel in all_text_channels ]
步骤2:定义带自定义补全的斜杠命令
在命令的频道参数中指定autocomplete参数为上面的补全函数:
@bot.slash_command(name="ping_channel", guild_ids=[...]) async def ping_channel( ctx: discord.ApplicationContext, channel: discord.TextChannel = discord.SlashOption( name="channel", description="选择要发送消息的频道", autocomplete=channel_autocomplete ) ): # 向目标频道发送消息 await channel.send("ping") # 回复用户操作结果 await ctx.respond(f"已向频道 {channel.mention} 发送消息")
关键说明
- 自动补全函数实时触发:仅当用户开始输入命令参数时执行,此时Bot已完成服务器加载,能正常获取所有频道信息。
- 权限要求:确保Bot拥有
Manage Channels或足够查看所有频道的权限,否则无法获取私密频道数据。 - 重名处理:若存在同名频道,可修改补全选项名称,比如
name=f"{channel.name} ({channel.id})",帮助用户区分不同频道。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

