Discord.py 垃圾桶表情反应仅删除最新对应消息问题排查
Discord 机器人🗑️表情删消息功能故障修复
问题根源
现有代码的reaction_add事件校验逻辑存在遗漏:
- 原有
check方法仅判断了「触发反应的用户是消息发送者」「表情为🗑️」两个条件,完全没有校验反应所属的消息对象 - 每收到一条用户发送的非机器人消息,
on_message事件就会生成一个独立的反应监听,所有监听都使用这套宽松的校验规则。只要用户对任意一条消息添加🗑️反应,所有处于等待状态的监听都会被同时触发,批量删除所有关联的原消息和积分提示消息,最终导致多删消息的问题。
修复后完整代码
@client.event async def on_message(message): if not message.author.bot: embed = discord.Embed(title="Points earned!", description="+1 Points") points_msg = await message.channel.send(embed=embed) await message.add_reaction("🗑️") def check(reaction, user): return ( user == message.author and str(reaction.emoji) == "🗑️" and reaction.message.id == message.id # 核心修复:绑定当前消息ID ) try: # 可按需调整超时时间,单位为秒,示例为5分钟后自动取消监听 await client.wait_for("reaction_add", timeout=300, check=check) except asyncio.TimeoutError: # 超时后直接清除消息上的垃圾桶反应,无需发送冗余提示 await message.clear_reaction("🗑️") else: await points_msg.delete() await message.delete()
关键修改点
- 在校验逻辑中新增
reaction.message.id == message.id判断,确保每个监听只会响应绑定消息上的表情反应,不会被其他消息的操作触发 - 给
wait_for添加合理的超时参数,避免无期限驻留的监听占用系统资源 - 移除原超时逻辑中无意义的提示消息,超时后直接清除未被使用的垃圾桶反应,交互逻辑更简洁
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

