Discord.py - 检查 Slash 命令是否存在

问题描述 投票:0回答:1

我需要帮助检查斜线命令是否存在。 我的目标是添加一个斜杠命令,让您禁用其他斜杠命令。因此我需要检查命令是否存在。 这是我现在拥有的代码:

@tree.command(guild = discord.Object(id=1129737425653071992), name='disable', description='Disable a specified Command')
async def disable(interaction: discord.Interaction, command: str):
    print(tree.get_commands(guild=discord.Object(id=1129737425653071992)))
    if command in tree.get_commands(guild=discord.Object(id=1129737425653071992)):
        await tree.remove_command(command)
        await interaction.response.send_message(f"{command} was disabled. You can reenable it by running /enable {command}")
    else:
        await interaction.response.send_message(f"Command could not be found: {command}")

当命令不存在时,确实如此。但当它这样做时,它仍然说它不存在。

我尝试过,正如你在上面的代码中看到的那样

tree.get_commands(guild=discord.Object(id=1129737425653071992)

打印,就像这样:

如何检查斜杠命令是否存在?

python discord.py command
1个回答
0
投票

首先是小事,

tree.remove_command(command)
不是异步。

tree.get_commands
返回:

List[Union[ContextMenu, Command, Group]]

这意味着如果您想专门检查

Command
,则必须对其进行解析。
command
参数也是一个字符串,这就是它一开始没有返回 true 的原因。但是,我们可以在命令树中使用一个更简单的命令。

tree.get_command
(单数而非复数)返回:

Optional[Union[Command, ContextMenu, Group]]

是的,这是同一件事。但参数不同。

command (str) – 要获取的根命令的名称。

guild (可选[Snowflake]) – 从中获取命令的公会。如果没有给出或没有,那么它会得到一个全局命令。

type (AppCommandType) – 要获取的命令类型。默认为 chat_input,即斜杠命令。

您可以将之前的

command
字符串参数传入此命令中。然后你可以检查它是否返回了任何东西。这比解析快得多(如前所述)。您也不检查是否存在多个命令,所以这是最好的选择。

下面我有一个代码示例(作为参考,我之前做了另一个命令):

@tree.command(guild=discord.Object(id=pretendtheressomethinghere), name='disable', description='Disable a specified Command')
async def disable(interaction: discord.Interaction, command: str):
    if tree.get_command(command, guild=discord.Object(id=pretendtheressomethinghere)):
        tree.remove_command(command)
        await interaction.response.send_message(
            f"{command} was disabled. You can reenable it by running /enable {command}")
    else:
        await interaction.response.send_message(f"Command could not be found: {command}")

但是,这实际上并没有禁用该命令。为什么是这样?嗯,

tree.remove_command
需要同步树。只需添加以下行:

await tree.sync(guild=discord.Object(id=inserthingyhere))

它应该可以工作!

完整代码:

@tree.command(guild=discord.Object(id=1044711937956651089), name='disable', description='Disable a specified Command')
async def disable(interaction: discord.Interaction, command: str):
    await interaction.response.defer()
    if tree.get_command(command, guild=discord.Object(id=1044711937956651089)):  # check if the command exists
        tree.remove_command(command, guild=discord.Object(id=1044711937956651089))  # remove the command
        print("command removed!")
        await tree.sync(guild=discord.Object(id=1044711937956651089))  # sync the tree
        print("tree synced!")
        await interaction.followup.send(
            f"{command} was disabled. You can reenable it by running /enable {command}")
    else:
        await interaction.followup.send(f"Command could not be found: {command}")

在本地进行了测试,斜杠命令

say
不再出现。

© www.soinside.com 2019 - 2024. All rights reserved.