Discord机器人逻辑优化:仅在用户表情回应后发送新消息
Discord机器人重复触发问题修复方案
问题说明
- 需求:用户发送消息后,机器人先发送消息;待用户用表情回应后,再发送后续中文指令。
- 当前问题:用户发送第二条消息时,机器人会重复发送初始消息,不符合预期。
原代码问题分析
原代码中responsed是局部变量,每次触发on_message事件都会重新初始化,无法持续记录用户状态;同时存在未定义的channel变量,逻辑分支混乱,导致状态控制完全失效。
修复后的代码
import asyncio import discord from discord.ext import commands class CommandCog(commands.Cog): def __init__(self, bot): self.bot = bot # 用字典记录处于等待回应状态的用户,键为用户ID,避免不同用户互相干扰 self.user_in_progress = {} @commands.Cog.listener() async def on_message(self, message): # 仅处理私信消息,忽略机器人自身发送的消息 if str(message.channel.type) != "private" or message.author == self.bot.user: return user_id = message.author.id # 检查用户是否正在等待回应,若是则直接忽略新消息 if user_id in self.user_in_progress: return # 标记用户进入等待状态 self.user_in_progress[user_id] = True try: # 发送初始消息并添加目标表情 hello_msg = await message.author.send("你好") await hello_msg.add_reaction("✅") # 定义反应检查逻辑:仅接受当前用户对这条消息的✅反应 def check(reaction, user): return user == message.author and reaction.emoji == "✅" and reaction.message == hello_msg # 等待用户反应,超时时间设为5分钟(可自行调整) await self.bot.wait_for('reaction_add', check=check, timeout=300) # 用户回应后发送后续指令 await message.author.send("你最近怎么样?") except asyncio.TimeoutError: # 超时提示,可根据需求修改 await message.author.send("等待超时,若需要重新触发请再次发送消息") finally: # 无论成功或超时,都移除用户的等待状态标记 if user_id in self.user_in_progress: del self.user_in_progress[user_id] async def setup(bot): await bot.add_cog(CommandCog(bot))
流程说明
- 用户发送消息→检查是否处于等待回应状态→若是则忽略,否则启动流程
- 机器人发送「你好」并添加✅表情,标记用户为等待状态,禁止重复触发初始消息
- 用户点击✅表情完成回应
- 机器人发送「你最近怎么样?」,并移除用户的等待状态标记
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

