如何检测指定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
相关产品推荐
相关产品推荐

