how to run a command in tasks.loop discord.py bot

Question:

so im trying to get a command to run every 5 minutes on my dsicrod.py bot and need ctx to get guild members and certain details like that so I need it in a bot.command, but I cant have that properly do that without tasks.loop(minutes=5) so I tried getting it to send the command with tasks.loop but it wouldn’t work so I went to the pythin discord and got help they got me to this point

@bot.command(pass_context=True)
async def update_member_count(ctx): 
    await ctx.send(ctx.guild.member_count)
    channel = discord.utils.get(ctx.guild.channels, id=829355122122424330)
    await channel.edit(name = f'Member Count: {ctx.guild.member_count}')


@tasks.loop(minutes=5)
async def update_member_count2(ctx):
    await update_member_count(ctx)

and It still gives errors saying that ctx arg is missing in update_member_count2. pls help

Asked By: BurnDownTheWorld

||

Answers:

You can create your loop-function in another way. Your approach is a bit unclear to me.

Try out the following:

async def update_member_count(ctx):
    while True:
        await ctx.send(ctx.guild.member_count)
        channel = discord.utils.get(ctx.guild.channels, id=YourID)
        await channel.edit(name=f'Member Count: {ctx.guild.member_count}')
        await asyncio.sleep(TimeInSeconds)


@bot.command()
async def updatem(ctx):
    bot.loop.create_task(update_member_count(ctx))  # Create loop/task
    await ctx.send("Loop started, changed member count.") # Optional

(Or you simply create the task in your on_ready event, depends on you)

What did we do?

  • Created a loop out of a function (async def update_member_count(ctx):)
  • Exectued updatem one time to activate the loop
  • Changed your actual command to a "function"
Answered By: Dominik

You could go with @Dominik’s answer but its near impossible to stop a running While loop. Going ahead with discord.py tasks.
If you want to start the task with a command:

async def start(ctx):
    update_member_count2.start(ctx)

If you want to start it when the bot starts, you have to slightly modify the code

@tasks.loop(minutes=5)
async def update_members():
    guild = bot.get_guild(guildID)
    channel = guild.get_channel(channelID)
    #update channel, don't sleep
# inside init or on_ready
if not update_members.is_running():
     update_members.start()
Answered By: Ceres

Use this in a on_member_join event

@bot.event
async def on_member_join(member):
  channel = discord.utils.get(member.guild.channels, id=962732335386746910)
  await channel.edit(name = f'⚫┃・Members: {member.guild.member_count}')
Answered By: Lukas Zangen

Add the line
intents.message_content=True

This solved the issue for me

Answered By: UTKARSH RANA
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.