如何在tasks.loop discord.py bot中运行命令

时间:2021-04-08 14:38:29

标签: python discord discord.py

所以我试图让一个命令在我的 dsicrod.py bot 上每 5 分钟运行一次,并且需要 ctx 来获取公会成员和某些类似的细节,所以我需要在 bot.command 中使用它,但我不能正确地做到这一点没有tasks.loop(minutes=5)所以我尝试让它发送带有tasks.loop的命令但它不起作用所以我去了pythin discord并得到帮助他们让我到了这一点

@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)

并且它仍然给出错误,指出 update_member_count2 中缺少 ctx arg。请帮忙

2 个答案:

答案 0 :(得分:1)

您可以通过其他方式创建您的 loop 函数。你的方法对我来说有点不清楚。

尝试以下操作:

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

(或者您只是在 on_ready 事件中创建任务,取决于您)

我们做了什么?

  • 从函数 (async def update_member_count(ctx):) 中创建了一个循环
  • 执行 updatem 次以激活循环
  • 将您的实际命令更改为“函数”

答案 1 :(得分:1)

您可以采用@Dominik 的答案,但几乎不可能停止正在运行的 While 循环。继续 discord.py 任务。 如果要使用命令启动任务:

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

如果你想在bot启动时启动它,你必须稍微修改一下代码

@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()