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

discord.py下注机器人while循环无法识别!accept等消息问题如何解决

问题原因
  • 核心错误是while循环的逻辑运算符用错了:你用了or(或)来连接两个不等判断,这个逻辑永远为真,所以循环永远不会退出。
    举个例子:当用户输入!accept时,msg.content != "!decline"的结果为真,所以或运算整体为真,循环继续;当用户输入!decline时,msg.content != "!accept"的结果为真,循环还是继续,不管输入什么都跳不出去。
  • 同时你的代码还有其他几处隐性bug,也会导致后续逻辑异常:
    1. 后续判断用户是否拒绝的语句写成了if msg.content == "decline",少了前缀!,就算跳出循环也识别不到拒绝指令
    2. 查询被挑战者余额的SQL语句写错了,两次都查了挑战者(roller1)的余额,拿到的roller2_cash根本不对
    3. 后续更新余额的SQL语句两次都更新了roller1的余额,被挑战者的余额完全不会变动
    4. 检测用户是否注册账号的分支没有加return,即使用户没注册,代码还是会继续往下执行等待响应的逻辑
    5. wait_for没有设置超时,只要被挑战者不回复,代码会一直卡死在等待步骤
修复方案

首先替换你的while循环条件,两种写法都可以,更推荐第二种不容易写错:

# 写法1:把or改成and
while msg.content != "!accept" and msg.content != "!decline":

# 写法2:更简洁的包含判断
while msg.content not in ["!accept", "!decline"]:

然后依次修改其他bug:

  1. 把拒绝判断的语句补全前缀:
if msg.content == "!decline":
  1. 修改查询被挑战者余额的SQL参数:
# 原来的错误写法,两次都查了roller1
cursor.execute("SELECT currency FROM DEATHROLL WHERE id=?", (roller1,))
roller2_cash = int(cursor.fetchone()[0])
# 修改后的正确写法
cursor.execute("SELECT currency FROM DEATHROLL WHERE id=?", (roller2,))
roller2_cash = int(cursor.fetchone()[0])
  1. 所有更新被挑战者余额的SQL语句,把第二个参数从roller1改为roller2
  2. 检测用户是否注册的分支增加return,中断后续逻辑:
if len(data) == 0:
    await ctx.send("make an account first")
    return # 新增这行
# 被挑战者未注册的分支同理增加return
  1. 给wait_for加超时避免永久卡单,需要先导入asyncio库:
try:
    msg = await client.wait_for("message", check=lambda m: m.author.id == roller2, timeout=300)
except asyncio.TimeoutError:
    await ctx.send("挑战超时已自动取消")
    return

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:09:03