Python开发Discord Bot:实现命令参数选择与可选参数
Discord Bot 命令功能解决方案
问题1:实现参数可选选项(Heads/Tails/Random)
你之前用commands.Option(choices=["Heads", "Tails", "Random"])的方式不符合discord.py应用命令的规范,正确做法是使用discord.app_commands.Choice类定义可选选项,修正后的代码如下:
import discord from discord import app_commands @bot.tree.command(name="createcoinflip", description="Creates a coinflip based on the arguments.") @app_commands.describe(amount="The amount of gems to bet", side="Choose your side") async def createcoinflip(interaction: discord.Interaction, amount: int, side: app_commands.Choice[str]): await interaction.response.send_message(f"You chose {side.value} with an amount of {amount} gems.")
关键说明:
- 必须导入
discord.app_commands模块,用app_commands.Choice[str]指定选项的字符串类型 - 配置后Discord会自动在输入命令时弹出
Heads、Tails、Random三个可选值,用户无需手动输入 - 获取选中的选项值时要使用
side.value,因为side是一个Choice对象,而非直接的字符串
问题2:实现可选参数的默认值(自动使用发起命令的用户)
对于/balance命令,只需将玩家参数设置为可选(指定default=None),然后在函数内判断参数是否为空,为空则自动使用发起命令的用户作为目标:
@bot.tree.command(name="balance", description="Check a user's gem balance") @app_commands.describe(player="The user to check balance for (optional)") async def balance(interaction: discord.Interaction, player: discord.Member = None): # 若未指定player,默认使用发起命令的用户 target_user = player or interaction.user # 替换为你实际的余额查询逻辑 balance_amount = 1000 # 示例余额值 await interaction.response.send_message(f"{target_user.display_name}'s balance: {balance_amount} gems")
关键说明:
- 将
player参数的默认值设为None,Discord会自动识别这是可选参数,用户输入命令时可选择不填写 - 使用
player or interaction.user简化判断逻辑:有传入参数则用传入的用户,否则用发起命令的用户
内容的提问来源于stack exchange,提问作者xNick
相关产品推荐
相关产品推荐

