如何让Discord.py中的按钮仅对执行命令的用户可用
如何让Discord.py中的按钮仅对执行命令的用户可用
嘿,我完全懂你现在的糟心情况——别人乱点bot的按钮搞破坏确实超烦!别慌,咱们只需要给你的View加个身份校验的逻辑就能解决这个问题,具体步骤如下:
第一步:修改View的初始化方法,保存发起命令的用户
我们要在创建Menu这个View的时候,把发起命令的用户信息存下来,这样后面才能校验点击按钮的人是不是本人。修改后的Menu类初始化代码是这样的:class Menu(discord.ui.View): def __init__(self, author: discord.User): super().__init__() self.value = None self.author = author # 把发起命令的用户存到View的属性里第二步:在按钮回调里加身份校验逻辑
每次有人点击按钮时,先检查当前点击的用户是不是我们之前保存的那个命令发起者,如果不是就直接拒绝操作,并且给点击的人发个仅他能看到的提示。修改你的按钮回调函数:@discord.ui.button(label="Yes, i am sure", style=discord.ButtonStyle.green) async def yesimsure(self, interaction: discord.Interaction, button: discord.ui.Button): # 先做身份校验,不是命令发起者直接返回 if interaction.user != self.author: await interaction.response.send_message("只有发起这个命令的人才能点击按钮哦!", ephemeral=True) return # 下面是你原来的转盘逻辑,保持不变就行 if random.randint(1, 10) == 1: embed = discord.Embed( title="Roulette Result - You Lost!", description="You got timed out for 5 minutes.", color=discord.Color.red() ) # 这里补充你原来的超时逻辑 await interaction.user.timeout_for(minutes=5) await interaction.response.send_message(embed=embed) else: # 这里可以补充赢了的提示逻辑 embed = discord.Embed( title="Roulette Result - You Won!", description="运气爆棚,安全下车!", color=discord.Color.green() ) await interaction.response.send_message(embed=embed)第三步:在命令函数里传入发起者信息
最后,在你触发这个View的命令函数里,要把命令的作者(也就是ctx.author)传给Menu的构造函数:@bot.command() async def roulette(ctx): # 创建View实例时传入命令发起者 view = Menu(author=ctx.author) # 发送带按钮的消息 await ctx.send("敢不敢来玩俄罗斯转盘?点击下方按钮确认参与!", view=view)
这样改完之后,只有发起命令的用户点击按钮才会触发后续逻辑,其他人点击只会收到专属提示,再也不用担心被滥用啦!
备注:内容来源于stack exchange,提问作者jiko
相关产品推荐
相关产品推荐

