如何在discord.py中获取后续message.content以处理Quest事件?
问题分析
你的代码存在两个核心问题,导致无法识别后续的"Quest"消息:
- 使用
time.sleep()会阻塞discord.py的异步事件循环,bot在休眠期间完全无法接收新消息。 message.content始终指向触发当前代码块的初始消息(即包含"You can move forward."的那条),不会自动更新为后续出现的"Quest"消息。
解决方案
改用discord.py的wait_for()方法监听后续消息,同时用asyncio.sleep()替代time.sleep()(异步环境下的正确休眠方式),修改后的代码如下:
import asyncio # 假设你的client是discord.Client()或commands.Bot()实例 @client.event async def on_message(message): if "You can move forward." in message.content: await asyncio.sleep(3) await message.channel.send("!step") # 等待频道内出现包含"Quest"的消息,超时时间可根据实际情况调整 try: # 过滤条件:消息来自同一频道且内容包含"Quest" quest_msg = await client.wait_for( "message", check=lambda m: m.channel == message.channel and "Quest" in m.content, timeout=10 ) # 收到Quest消息后执行solve指令 await asyncio.sleep(2) await message.channel.send("!solve 12") await asyncio.sleep(5) except asyncio.TimeoutError: # 超时未收到Quest消息时的处理逻辑,可按需修改 pass # 继续执行后续指令 await message.channel.send("!turn right") await asyncio.sleep(3) await message.channel.send("!wall")
关键说明
wait_for()会异步等待指定事件(此处为新消息),通过check参数精准过滤符合要求的消息,不会阻塞整个bot的运行。asyncio.sleep()是异步休眠方式,不会占用事件循环,bot在休眠期间仍能正常处理其他消息和事件。timeout参数用于避免bot无限等待,超时后会触发TimeoutError,你可以根据需求调整超时时间或补充对应的处理逻辑。
内容的提问来源于stack exchange,提问作者timikk8
相关产品推荐
相关产品推荐

