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

如何检测指定Discord用户对消息的反应?

解决Discord机器人检测目标用户反应的问题

你可以用discord.py内置的wait_for方法来监听目标用户的反应,这是实现这个需求最直接的方式。我帮你修改了代码,补上了检测逻辑,同时处理了超时和不同反应的分支:

@bot.command()
@commands.has_any_role("Franchise Owner", "General Manager", "Head Coach")
async def offer(ctx, member: discord.Member):
    embed = discord.Embed()
    embed.add_field(name="⌛ Incoming Offer", value=f"The <:DallasCowboys:788796627161710592> have offered {member}.")
    offer_sent = await ctx.send(embed=embed)
    
    # 定义需要监听的两个表情
    check_emoji = "<a:CheckMark:768095274949935146>"
    x_emoji = "<a:XMark:768095331555606528>"
    await offer_sent.add_reaction(check_emoji)
    await offer_sent.add_reaction(x_emoji)
    
    await member.send("You have been offered to the <:DallasCowboys:788796627161710592>. You have 30 minutes to accept/decline.")

    # 过滤无效反应:只接受目标用户的指定表情操作
    def check(reaction, user):
        return (user == member) and (str(reaction.emoji) in [check_emoji, x_emoji])

    try:
        # 等待用户反应,超时时间设为30分钟(你原来写的30是30秒,这里按需求修正为30分钟)
        reaction, user = await bot.wait_for('reaction_add', timeout=30*60, check=check)
        
        # 根据用户反应执行对应逻辑
        if str(reaction.emoji) == check_emoji:
            await ctx.send(f"{member.mention} has accepted the offer! 🎉")
        else:
            await ctx.send(f"{member.mention} has declined the offer. 😔")
            
    except asyncio.TimeoutError:
        # 处理用户未及时反应的情况
        await ctx.send(f"Offer to {member.mention} expired after 30 minutes.")
    finally:
        # 确保不管结果如何,都会删除最初的offer消息
        await offer_sent.delete()

关键逻辑说明:

  • check过滤函数:用来排除其他用户的乱点或者非指定表情的反应,确保只有目标用户的有效操作才会被捕获。
  • wait_for事件监听:专门监听reaction_add事件,设置超时时间后,会自动等待用户操作;超时会抛出异常,我们可以针对性处理。
  • 异常与收尾:用try-except-finally结构,既处理了超时场景,又保证最初的offer消息一定会被删除,和你原本的逻辑保持一致。

如果实际需求是30秒而非30分钟,把timeout=30*60改成timeout=30就行,这个逻辑能同时处理多个并行的offer请求,不会互相干扰。

内容的提问来源于stack exchange,提问作者ax lol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:13:18