discord.py运行报错coroutine was never awaited 异步函数调用问题求助
问题修复说明
核心报错根因
你定义的check_thunes()是异步函数,调用时必须加await关键字,否则就会抛出coroutine was never awaited错误,你当前代码调用该函数时未加await。
其他需要修复的逻辑问题
- 自定义的
check_thunes()不需要加@client.event装饰器,该装饰器仅用于注册Discord官方事件回调,加在自定义函数上会导致逻辑异常 check_thunes()内部用到了message变量,但你没将message作为入参传入,运行时会报变量未定义check_thunes()内返回的erreur变量未提前定义,新用户初始化时的余额扣减逻辑位置错误,不符合校验流程- 你没有接收
check_thunes()的返回值,后续余额计算用的reste是初始值0,会导致计算错误 on_message内有和check_thunes()重复的余额初始化逻辑,冗余且容易导致数据不一致
修复后完整代码
import discord import time from random import randrange,choices import os from replit import db from keep_alive import keep_alive token = os.environ['token'] client = discord.Client() @client.event async def on_ready(): print("le bot est prêt") # 去掉@client.event装饰器,新增message入参 async def check_thunes(mise,joueur, message): erreur = 1 # 提前定义错误标记,1代表校验失败 if joueur in db.keys(): #trouve la thune du joueur dans la db thune=int(db[joueur]) else: db[joueur]="1000" thune=int(db[joueur]) if mise<=0: await message.channel.send("Vous ne pouvez pas miser 0 crédit") return None, erreur if thune<=0: await message.channel.send("Vous n'avez plus d'thune, mais voici un coup de pouce de 1k") db[joueur]=str(1000) thune = 1000 if mise>thune: await message.channel.send("Vous n'avez pas assez d'thune") return None, erreur reste=str(thune-mise) db[joueur]=reste return reste, 0 # 0代表校验通过 @client.event async def on_message(message): msg=message.content if msg.startswith("!roulette") : #le message doir se présenter sous la forme # !roulette nb(0,50) mise(1,thune) gain=0 thune=0 reste=0 nombre="" mise="" joueur=str(message.author.name) nb_g=int(randrange(51)) for i in range(10, 12): #trouve le nombre choisit nombre+=msg[i] nombre=int(nombre) for i in range(12,len(msg)): #trouve la mise mise+=msg[i] mise=int(mise) #controleur des valeurs choisies if nombre>50: await message.channel.send("Le nombre choisit doit être entre 0 et 50") return # 加await调用,传入message,接收返回值 reste, erreur = await check_thunes(mise, joueur, message) if erreur: return #calcul des gains if nombre==nb_g : #regza le premier gagnant du bot gain=mise*2 elif (nombre%2==0 and nb_g%2==0) or (nombre%2==1 and nb_g%2==1 ) : gain=round(mise*1.25) else : gain=0 if int(reste)+int(gain)>=0: db[joueur]=str(int(reste)+int(gain)) elif int(reste)+int(gain)<0: db[joueur]=str(0) await message.channel.send("Vous n'avez plus d'thune") return if gain-mise>=0 : await message.channel.send(str("Vous aviez choisit "+str(nombre)+" et la roulette a donnée "+str(nb_g))) await message.channel.send(str("Vous avez gagné "+str(gain-mise))) await message.channel.send(str("Il vous reste "+str(int(reste)+gain))) return else: await message.channel.send(str("Vous aviez choisit "+str(nombre)+" et la roulette a donnée "+str(nb_g))) await message.channel.send(str("Vous avez perdu "+str(-(gain-mise)))) await message.channel.send(str("Il vous reste "+str(int(reste)+gain))) return keep_alive() client.run(token)
内容的提问来源于stack exchange,提问作者Serunos
相关产品推荐
相关产品推荐

