在discord.py中实现命令到按钮回调的上下文传递与角色自动添加
解决Discord机器人按钮回调无法获取角色和用户上下文的问题
你的核心问题是Request视图类没有存储发起请求时的目标角色和用户信息,导致点击「批准」按钮后无法定位到要操作的对象。只需要修改视图类的初始化方法,把需要的上下文参数传进去并保存,就能在按钮回调里调用了。
修改后的完整代码
class Request(discord.ui.View): # 修改__init__方法,接收要操作的角色和用户 def __init__(self, role: discord.Role, user: discord.Member): super().__init__() self.value = None # 把角色和用户保存为实例属性,方便回调函数调用 self.target_role = role self.target_user = user @discord.ui.button(label='Approve', style=discord.ButtonStyle.green, disabled=False, custom_id='Approve') async def approve(self, interaction: discord.Interaction, button: discord.ui.Button): member = interaction.user approve_embed = discord.Embed(title='请求已批准!', description=f'由 {member.mention} 批准') button.style = discord.ButtonStyle.gray # 执行添加角色操作 try: await self.target_user.add_roles(self.target_role) approve_embed.add_field(name='操作结果', value=f'已成功为 {self.target_user.mention} 添加角色 {self.target_role.mention}') except discord.Forbidden: approve_embed.add_field(name='操作失败', value='机器人权限不足,无法添加角色') except Exception as e: approve_embed.add_field(name='操作失败', value=f'未知错误: {str(e)}') await interaction.response.edit_message(embed=approve_embed, view=self) self.value = True self.stop() @discord.ui.button(label='Decline', style=discord.ButtonStyle.red, disabled=False, custom_id='Decline') async def decline(self, interaction: discord.Interaction, button: discord.ui.Button): member = interaction.user button.style = discord.ButtonStyle.gray decline_embed = discord.Embed(title='请求已拒绝!', description=f'由 {member.mention} 拒绝') await interaction.response.edit_message(embed=decline_embed, view=self) self.value = True self.stop() @client.command() @commands.has_any_role('Mod', '1253697387051094136') async def roleadd(ctx, role: discord.Role, user: discord.Member): channel = client.get_channel(1253704722544853185) # 实例化Request时传入角色和用户参数 view = Request(role=role, user=user) await channel.send(f'**新的角色添加请求!** \n {ctx.author.mention} 请求为 {user.mention} 添加角色 {role.mention}', view=view) await ctx.reply('*你的请求已提交*')
关键修改点说明
- 传递上下文参数:在创建
Request视图实例时,把命令中获取到的role和user传入视图的初始化方法,视图内部将其保存为实例属性self.target_role和self.target_user。 - 执行角色添加操作:在
approve回调函数中,调用await self.target_user.add_roles(self.target_role)来完成角色添加,同时添加了异常捕获,处理权限不足或其他错误情况,让管理员能看到操作结果。 - 优化反馈信息:在批准的Embed中添加操作结果字段,明确告知管理员角色是否添加成功。
内容的提问来源于stack exchange,提问作者John T
相关产品推荐
相关产品推荐

