Discord.py使用wait_for时如何在用户答案错误时让机器人发消息
Discord.py 代码修改方案
原来的check函数仅过滤内容为hello的同频道消息,所有不符合要求的回复都会被wait_for直接忽略,自然无法触发错误提示。你可以调整check的校验逻辑,先只限定「回复由触发$greet指令的用户、在同一频道发送」,拿到用户的任意回复后再判断内容是否符合要求即可。
修改后的完整代码如下:
@client.event async def on_message(message): # 忽略机器人自身发送的消息,避免触发死循环 if message.author == client.user: return if message.content.startswith('$greet'): channel = message.channel # 记录触发指令的用户 trigger_user = message.author await channel.send('Say hello!') # 调整check规则:仅校验同用户、同频道,不限制回复内容 def check(m): return m.author == trigger_user and m.channel == channel # 监听获取符合校验规则的用户回复 msg = await client.wait_for('message', check=check) # 单独判断回复内容是否符合要求 if msg.content == 'hello': await channel.send(f'Hello {msg.author}!') else: await channel.send('回复错误,请输入正确内容「hello」')
额外优化说明:
- 新增的机器人自身消息过滤是Discord.py开发的通用最佳实践,可避免机器人误触发自身的指令逻辑
- 调整后的
check规则同时解决了原代码的逻辑漏洞:原代码只要是同频道任意用户发送hello都会触发问候,现在只会响应触发$greet指令的特定用户 - 如果需要给用户回复加超时限制,可给
wait_for添加timeout参数,示例:await client.wait_for('message', check=check, timeout=30),超时后会抛出asyncio.TimeoutError,你可以添加try...except块捕获该异常,自定义超时提示内容
内容的提问来源于stack exchange,提问作者QWERTY
相关产品推荐
相关产品推荐

