如何让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
相关产品推荐
相关产品推荐

