You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Discord的client.wait_for仅监听特定用户的消息?

解决Discord猜数字游戏仅监听特定用户消息的问题

你遇到的核心问题是client.wait_for('message')会监听机器人收到的所有消息,不管来自哪个服务器或频道,导致其他地方的消息也会终止游戏。要实现仅读取发起游戏的用户在当前频道的消息,只需给wait_for添加check过滤条件,直接过滤掉不符合要求的消息,不用事后判断再终止游戏。

修改后的完整代码

user = message.author
number = random.randint(1, 100)
await message.channel.send("我想了一个1到100之间的数字,你有7次机会,猜吧。")
for guesses in range(0, 7):
    # 添加check参数,只接收发起用户在当前频道的消息
    guess = await client.wait_for('message', check=lambda m: m.author == user and m.channel == message.channel)
    try:
        guess_num = int(guess.content)
    except ValueError:
        await message.channel.send("请输入有效的数字!")
        continue
    if guess_num < number:
        if guesses == 6:
            await message.channel.send("次数用完了,再来一次吧。")
            await message.channel.send(f"我想的数字是 {number}。")
            break
        else:
            await message.channel.send("大一点!")
    elif guess_num > number:
        if guesses == 6:
            await message.channel.send("次数用完了,再来一次吧。")
            await message.channel.send(f"我想的数字是 {number}。")
            break
        else:
            await message.channel.send("小一点!")
    else:
        await message.channel.send(f"猜对了!你一共猜了 {guesses + 1} 次。")
        break

关键修改说明

  • 使用lambda m: m.author == user and m.channel == message.channel作为check条件,确保wait_for只等待发起游戏的用户在当前频道发送的消息,其他任何消息都会被直接忽略,不会触发后续逻辑。
  • 额外添加了try-except处理非数字输入的情况,避免游戏因用户输入非数字而报错崩溃。
  • 把字符串拼接改成了f-string,代码更简洁易读。

这样修改后,其他服务器或频道的消息不会再干扰游戏,只有发起游戏的用户在当前频道的消息才会被处理。

内容的提问来源于stack exchange,提问作者user19509225

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 09:45:35