Я получаю сообщение об ошибке «ожидание вне выхода» для команды мини-игры

#python #discord #discord.py

Вопрос:

Я настраиваю мини-игру в одном из своих винтиков, и я получаю эту ошибку, discord.ext.commands.errors.ExtensionFailed: Extension 'cogs.Games' raised an error: SyntaxError: 'await' outside async function (Games.py, line 78) эта команда отлично работает в моем main.py хотя. Мой код ниже, спасибо!

 @commands.command()
    async def numbergame(self, ctx):

      channel = ctx.channel
      await channel.send("Guess the number from 0-100 by writing the number in this channel!")
 
      number = random.randint(1,100)
 
      def check(m):
        return m.content.isdigit() and m.channel == channel and m.author == ctx.author
  
        while True:
           try:
               msg = await self.bot.wait_for('message', timeout=30.0, check=check)
           except asyncio.TimeoutError:
               return await channel.send(f"{ctx.author.mention}, You are late to guess!")
           guess = int(msg.content)
           if guess == number:
               return await channel.send(f"Correct answer! {ctx.author.mention}")
           elif guess > number:
               await channel.send(f"{ctx.author.mention}, Your guess was too high!")
           elif guess < number:
               await channel.send(f"{ctx.author.mention}, Your guess was too low!")
 

Комментарии:

1. Попробуйте разделить блок на два пробела while True: .

2. @Enzo Я отключаю while True: 4 раза?

3. Нет, только один. Я имею в виду, что в настоящее время ваш while цикл находится внутри check функции, хотя предполагается, что он находится внутри numbergame функции. Просто удалите два пробела из каждой строки внутри вашего while .

4. @Энцо, хорошо, я это сделал. Но теперь все мои команды заставляют бота повторять это дважды.

5. Вы все правильно идентифицировали? Я опубликую ответ и посмотрю, сработает ли это.

Ответ №1:

Ваш цикл while находится внутри check функции, когда предполагается, что он находится внутри numbergame функции. Попробуйте отменить привязку цикла while следующим образом:

 @commands.command()
async def numbergame(self, ctx):
    channel = ctx.channel
    await channel.send("Guess the number from 0-100 by writing the number in this channel!")
 
    number = random.randint(1,100)
 
    def check(m):
        return m.content.isdigit() and m.channel == channel and m.author == ctx.author
  
    while True:
        try:
            msg = await self.bot.wait_for('message', timeout=30.0, check=check)
        except asyncio.TimeoutError:
            return await channel.send(f"{ctx.author.mention}, You are late to guess!")
        
        guess = int(msg.content)
        if guess == number:
            return await channel.send(f"Correct answer! {ctx.author.mention}")
        elif guess > number:
            await channel.send(f"{ctx.author.mention}, Your guess was too high!")
        elif guess < number:
            await channel.send(f"{ctx.author.mention}, Your guess was too low!")
 

Комментарии:

1. Да, это работает, но я, скорее всего, что-то сделал с остальной частью кода, потому что бот дважды отвечает на команды, но отлично работает для моего события on_message.