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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:36:07