Pycord框架下基于用户选项选择动态调整Slash命令自动补全的技术咨询
实现Pycord Slash命令的动态自动补全
嘿,我完全懂你现在的困扰——想在Pycord里做那种根据用户之前选的选项动态调整自动补全内容的功能,官方文档要么太零散要么讲得太抽象,找不到靠谱的教程确实头疼。别担心,我给你一步步拆解,用实际代码例子帮你搞懂。
先搞懂基础:静态自动补全
先从最简单的静态补全入手,帮你熟悉Pycord的自动补全机制,再过渡到动态的。比如一个选择水果的命令:
import discord from discord import slash_command, Option bot = discord.Bot() @slash_command(name="pick_fruit", description="选一种你喜欢的水果") async def pick_fruit( ctx, fruit: Option(str, description="选择水果", autocomplete=True) ): await ctx.respond(f"你选了{fruit}!") # 静态自动补全函数 @pick_fruit.autocomplete("fruit") async def fruit_autocomplete(ctx, value: str): # 这里返回固定的补全选项列表 fruits = ["苹果", "香蕉", "橙子", "草莓"] # 可以根据用户输入的value过滤(比如用户打了"苹",只返回苹果) return [f for f in fruits if value.lower() in f.lower()] bot.run("你的Bot令牌")
这个例子里,fruit选项的补全是固定的列表,接下来我们升级成依赖其他选项的动态补全。
核心:根据前置选项动态生成补全
假设我们做一个命令:先让用户选「分类」(水果/蔬菜),然后第二个选项「物品」的补全列表会根据选的分类自动变化。关键在于:自动补全函数可以接收前面已经被用户选择的选项值。
看完整代码:
import discord from discord import slash_command, Option, OptionChoice bot = discord.Bot() # 先定义分类对应的物品映射 category_items = { "水果": ["苹果", "香蕉", "橙子", "草莓"], "蔬菜": ["白菜", "胡萝卜", "西兰花", "番茄"] } @slash_command(name="pick_item", description="从分类里选物品") async def pick_item( ctx, category: Option(str, description="选择分类", choices=[ OptionChoice(name="水果", value="水果"), OptionChoice(name="蔬菜", value="蔬菜") ]), item: Option(str, description="选择物品", autocomplete=True) ): await ctx.respond(f"你选了{category}里的{item}!") # 动态自动补全函数:接收category参数(用户已经选的分类) @pick_item.autocomplete("item") async def item_autocomplete(ctx, value: str, category: str): # 如果用户还没选分类(理论上因为category是必填项,不会出现,但保险起见) if not category: return ["请先选择分类"] # 根据分类获取对应的物品列表 items = category_items.get(category, []) # 同样可以根据用户输入的value过滤结果 filtered_items = [item for item in items if value.lower() in item.lower()] # 返回补全选项(可以直接返回字符串列表,或者用OptionChoice更规范) return [OptionChoice(name=item, value=item) for item in filtered_items] bot.run("你的Bot令牌")
关键细节解释:
- 参数传递:在
item_autocomplete函数里,我们加了category: str参数——Pycord会自动把用户已经选择的category选项的值传递给这个参数,这就是动态补全的核心! - 分类映射:用字典
category_items存不同分类对应的物品,这样后续扩展分类只需要修改字典,不用改太多代码。 - 过滤用户输入:
value参数是用户当前在item选项里输入的内容,我们可以用它过滤补全列表,让补全更智能。 - OptionChoice的使用:返回
OptionChoice可以让Discord显示更友好的名称(比如名称和值可以不一样,比如OptionChoice(name="红苹果", value="red_apple")),如果不需要的话直接返回字符串列表也可以。
常见问题排查
- 如果发现补全没生效:检查自动补全函数的名称是否和选项名对应,参数是否正确接收前置选项(注意参数名要和命令里的选项名完全一致)。
- 如果前置选项是可选的:那自动补全函数里要处理
category为None的情况,比如返回一个提示或者空列表。 - 调试技巧:可以在自动补全函数里加
print(category, value),看看Pycord有没有正确传递参数,方便定位问题。
这样一步步来,你就能实现那种根据用户选择动态调整补全的功能啦,比看官方文档直观多了。
内容的提问来源于stack exchange,提问作者Seyedmahdi moosavyan
相关产品推荐
相关产品推荐

