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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:00:14