#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.