discord.py下注机器人while循环无法识别!accept等消息问题如何解决
问题原因
- 核心错误是while循环的逻辑运算符用错了:你用了
or(或)来连接两个不等判断,这个逻辑永远为真,所以循环永远不会退出。
举个例子:当用户输入!accept时,msg.content != "!decline"的结果为真,所以或运算整体为真,循环继续;当用户输入!decline时,msg.content != "!accept"的结果为真,循环还是继续,不管输入什么都跳不出去。 - 同时你的代码还有其他几处隐性bug,也会导致后续逻辑异常:
- 后续判断用户是否拒绝的语句写成了
if msg.content == "decline",少了前缀!,就算跳出循环也识别不到拒绝指令 - 查询被挑战者余额的SQL语句写错了,两次都查了挑战者(roller1)的余额,拿到的roller2_cash根本不对
- 后续更新余额的SQL语句两次都更新了roller1的余额,被挑战者的余额完全不会变动
- 检测用户是否注册账号的分支没有加return,即使用户没注册,代码还是会继续往下执行等待响应的逻辑
wait_for没有设置超时,只要被挑战者不回复,代码会一直卡死在等待步骤
- 后续判断用户是否拒绝的语句写成了
修复方案
首先替换你的while循环条件,两种写法都可以,更推荐第二种不容易写错:
# 写法1:把or改成and while msg.content != "!accept" and msg.content != "!decline": # 写法2:更简洁的包含判断 while msg.content not in ["!accept", "!decline"]:
然后依次修改其他bug:
- 把拒绝判断的语句补全前缀:
if msg.content == "!decline":
- 修改查询被挑战者余额的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])
- 所有更新被挑战者余额的SQL语句,把第二个参数从roller1改为roller2
- 检测用户是否注册的分支增加return,中断后续逻辑:
if len(data) == 0: await ctx.send("make an account first") return # 新增这行 # 被挑战者未注册的分支同理增加return
- 给
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
相关产品推荐
相关产品推荐

