如何在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
相关产品推荐
相关产品推荐

