Q: stopping a task discord.py I've made a Discord bot that loops a task every 15 minutes. I've got it working as intended but now I want to add a command that to stop and start the task. Here's part of my code:
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))

When I use the command stopb an error is returned saying that that stopb is not defined. I've tried to change the indentation but then the error is that b is not defined. The code above is part of a cog. In my main file I have a command that can load and unload the cogs but this does not stop the task.

A: Rather than using the loop decorator, you could make your own task function and add it to the bot's loop. This way you can store the task object which has a cancel function.
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))

