返回

Discord机器人: 隐藏DM中的分组斜杠命令 - 实战指南

python

Discord机器人:隐藏DM中的分组斜杠命令

在构建Discord机器人时,我们常利用斜杠命令(slash commands)来提供友好的用户交互界面。 然而,一个常见的需求是如何控制这些命令的可见性,比如,有些命令只应在服务器(guild)内使用,而不希望在用户的私信(DM)中显示。针对单个斜杠命令,@discord.app_commands.guild_only()装饰器通常能解决这个问题,但对于分组斜杠命令(grouped slash commands),情况稍有不同。

问题剖析

一个开发者可能会尝试对分组斜杠命令应用@discord.app_commands.guild_only(),希望它也能达到隐藏命令的效果。 但是实际情况并非如此。尽管对单个斜杠命令使用这个装饰器时效果良好,但在组级别的装饰并不会按预期隐藏整个命令组。 这是因为 guild_only 作用于具体命令,而不是其所属的组。 所以在DM中依旧可以看到这个分组的入口命令,这往往不符合预期。

解决方案:分别控制

隐藏分组斜杠命令的核心在于:需要对组内的每个具体命令都应用@discord.app_commands.guild_only()装饰器 。这确保了组内的每个命令,只有在服务器环境中才是可用的。分组命令的入口也会因此而被正确地隐藏。

示例代码(Python):

import discord
from discord.ext import commands
from discord import app_commands


intents = discord.Intents.all()
bot = commands.Bot(command_prefix="!", intents=intents)

@bot.event
async def on_ready():
    await bot.tree.sync()
    print(f"{bot.user} is online!")


@bot.tree.command(name="hidden-test", description="仅服务器可用")
@app_commands.guild_only()
async def hidden_command(interaction: discord.Interaction):
    await interaction.response.send_message("此命令只能在服务器中使用!", ephemeral=True)


class TestGroup(app_commands.Group):
    def __init__(self):
        super().__init__(name="hidden", description="这些命令只能在服务器中使用!")


    @app_commands.command(name="true", description="仅服务器可用")
    @app_commands.guild_only()
    async def true_command(self, interaction: discord.Interaction):
        await interaction.response.send_message("此命令只能在服务器中使用!(假的 :d)", ephemeral=True)


    @app_commands.command(name="false", description="这个也只能在服务器使用!")
    @app_commands.guild_only()
    async def false_command(self, interaction: discord.Interaction):
        await interaction.response.send_message("此命令只能在服务器中使用!", ephemeral=True)

bot.tree.add_command(TestGroup())


bot.run("YOUR-TOKEN")

操作步骤:

  1. 将上面的 YOUR-TOKEN 替换成你的机器人令牌。
  2. 运行代码后,让机器人上线。
  3. 在服务器和私信中分别尝试 /hidden/hidden-test 命令。在服务器中,你应该能够看到 hidden 组的入口,以及 hidden-test。在私信中,你只能看到 /hidden-test ,看不到 hidden 入口。 这表明guild_only() 装饰器现在成功地对整个分组命令生效了。

额外提示

  1. 安全性: @discord.app_commands.guild_only() 不只是简单的隐藏命令。它确实阻止了用户在DM中使用该命令,降低了意外暴露敏感信息的风险。
  2. 权限: 你可以通过 discord.py 的权限系统进行进一步的访问控制。 例如你可以添加 @discord.app_commands.has_permissions(administrator=True) 来只允许管理员使用特定的命令,或者针对每个指令进行不同的角色限定。

通过精确地控制每个分组内斜杠命令的可见性,能够创建更健壮且对用户友好的 Discord 机器人。 在大型项目和分工合作的环境下,这一点至关重要。 理解这些细微差别有助于提升整体开发效率并最终提升用户体验。

总而言之,对于分组斜杠命令来说,仅给命令组添加 @discord.app_commands.guild_only() 装饰器并不能起到隐藏命令组的效果,而是需要对分组命令内的每个具体命令都添加该装饰器。