discord.py开发中如何@提及点击按钮触发工单的用户
discord.py 工单机器人按钮触发用户@提及实现方案
核心获取逻辑
你监听到的button_click交互事件返回的interaction对象,自带触发本次点击的用户属性,不需要额外查询:
- 要@用户,直接用
interaction.user.mention,Discord会自动将其渲染为可点击的提及标签 - 工单频道名不支持@提及渲染,直接取用户名/昵称即可,用
interaction.user.name或interaction.user.display_name
现有代码需要修正的点
- 权限覆写(overwrites)里你现在写的
ctx.author是错误的,这个对象是发送初始工单面板消息的用户,不是点按钮开单的用户,必须替换成interaction.user,否则开单用户看不到自己的工单频道 - 你写的
await interaction.send(content = await interaction.send(embed=Embed), ephemeral=True)存在重复调用send的问题,会导致消息重复发送,直接传embed参数即可 - 工单频道内的提示Embed里的
ctx.author.name也要替换成interaction.user.mention,才能正确@开单用户
修正后代码片段
components = [ [ Button(label="Open a ticket", style=2, custom_id="Open", emoji="📩") ] ] await ctx.send(embed=embed, components=components ) while True: interaction = await client.wait_for("button_click", check = lambda i: i.component.label.startswith("Open")) # 修正权限配置:给点击按钮的用户开放频道权限 overwrites = { member_role: discord.PermissionOverwrite(view_channel=False), interaction.user: discord.PermissionOverwrite(view_channel=True), guild.me: discord.PermissionOverwrite(view_channel=True), ticket_mod_role: discord.PermissionOverwrite(view_channel=True) } # 私有回复提示工单创建,@触发用户 ephemeral_embed = discord.Embed( title="Ticket Created", description=f"{interaction.user.mention} Your ticket is created", ) # 修正重复send的问题 await interaction.send(embed=ephemeral_embed, ephemeral=True) # 创建工单频道,频道名用用户名不用mention ticket = await ticket_category.create_text_channel( f"🎫│Ticket-{interaction.user.name}", overwrites=overwrites ) # 工单频道内的欢迎Embed,@开单用户 channel_embed = discord.Embed( title="Ticket Created", url="", description=f"{interaction.user.mention} Wait our staff.", color=discord.Color.random() ) # 往新创建的工单频道发送欢迎消息 await ticket.send(embed=channel_embed)
效果参考


注意:如果你使用的是discord.py 2.0+官方版本,按钮交互的监听事件名是
interaction而非button_click,需要对应调整事件监听逻辑,上述写法适配你当前使用的discord-components第三方库版本。
内容的提问来源于stack exchange,提问作者dabafa dibidi
相关产品推荐
相关产品推荐

