#python #discord.py
#python #discord.py
Вопрос:
Я создал бота Discord, который выполняет цикл выполнения задачи каждые 15 минут. У меня все работает так, как задумано, но теперь я хочу добавить команду, которая останавливает и запускает задачу. Вот часть моего кода:
class a(commands.Cog):
def __init__(self, client):
self.client = client
@tasks.loop(minutes=15.0)
async def b(self):
#do something
b.start(self)
@commands.command(pass_context=True)
async def stopb(self, ctx):
b.cancel(self)
def setup(client):
client.add_cog(a(client))
Когда я использую команду stopb, возвращается ошибка, в которой говорится, что этот stopb не определен. Я попытался изменить отступ, но тогда ошибка заключается в том, что b не определен. Приведенный выше код является частью шестеренки. В моем основном файле у меня есть команда, которая может загружать и выгружать винтики, но это не останавливает задачу.
Ответ №1:
Вместо того, чтобы использовать декоратор цикла, вы можете создать свою собственную функцию задачи и добавить ее в цикл бота. Таким образом, вы можете сохранить объект задачи, который имеет функцию отмены.
class a(commands.Cog):
def __init__(self, client):
self.client = client
self.task = self.client.loop.create_task(self.b())
async def b(self):
while True:
#do something
await asyncio.sleep(900)
@commands.command(pass_context=True)
async def stopb(self, ctx):
self.task.cancel()
def setup(client):
client.add_cog(a(client))
Комментарии:
1.
bot.cogs["a"].b.cancel()
должно сработать, не так ли?