You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Discord.py中设置仅特定角色可点击按钮?

实现仅管理员或特定角色用户可点击按钮的功能

要让按钮仅对管理员或拥有特定角色的用户开放,你需要在每个按钮的回调函数开头添加权限检查逻辑。以下是修改后的完整代码,同时修复了原代码中重复发送响应的错误:

# 替换成你需要的特定角色ID
TARGET_ROLE_ID = 123456789012345678

class YourViewClass(discord.ui.View):  # 替换成你的实际视图类名
    def __init__(self):
        super().__init__(timeout=None)
        
    @discord.ui.button(label="Tryout", style=discord.ButtonStyle.success, emoji="✅", custom_id="TicketTRYOUT")
    async def tryout_callback(self, button, interaction: discord.Interaction):
        # 权限检查:管理员或特定角色
        if not interaction.user.guild_permissions.administrator:
            target_role = interaction.guild.get_role(TARGET_ROLE_ID)
            if target_role not in interaction.user.roles:
                await interaction.response.send_message("你没有权限点击此按钮!", ephemeral=True)
                return
        # 原有逻辑
        await interaction.user.send("does this work chat?")
        
    @discord.ui.button(label="Interview", style=discord.ButtonStyle.primary, emoji="🔊", custom_id="TicketINTERVIEW")
    async def interview_callback(self, button, interaction: discord.Interaction):
        # 权限检查
        if not interaction.user.guild_permissions.administrator:
            target_role = interaction.guild.get_role(TARGET_ROLE_ID)
            if target_role not in interaction.user.roles:
                await interaction.response.send_message("你没有权限点击此按钮!", ephemeral=True)
                return
        # 修复重复响应问题:每个交互仅能调用一次response.send_message,后续消息用followup.send
        await interaction.response.send_message("Interview VC is being created...", ephemeral=True)
        await interaction.followup.send("Interview VC has been created!", ephemeral=True)
        
    @discord.ui.button(label="Close Ticket", style=discord.ButtonStyle.red, emoji="🔒", custom_id="TicketCLOSE")
    async def close_callback(self, button, interaction: discord.Interaction):
        # 权限检查
        if not interaction.user.guild_permissions.administrator:
            target_role = interaction.guild.get_role(TARGET_ROLE_ID)
            if target_role not in interaction.user.roles:
                await interaction.response.send_message("你没有权限关闭工单!", ephemeral=True)
                return
        # 原有逻辑
        await interaction.response.send_message("Ticket is being closed...", ephemeral=False)
        await interaction.channel.delete()
        await interaction.user.send(f"Your ticket has been successfully closed!")

关键说明:

  • 权限判断逻辑:先验证用户是否拥有服务器管理员权限,若没有则检查是否持有指定ID的角色,两者都不满足则拒绝执行后续操作。
  • 角色ID替换:将TARGET_ROLE_ID替换为你实际需要的角色ID,角色ID可在Discord开启开发者模式后,右键角色复制获取。
  • 响应错误修复:原代码中interview_callback连续调用两次interaction.response.send_message会触发交互响应超时错误,后续消息需改用interaction.followup.send发送。

内容的提问来源于stack exchange,提问作者Maxi Prad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:42:32