【问题标题】:How to open an event loop in discord.py?如何在 discord.py 中打开事件循环?
【发布时间】:2021-06-07 02:59:10
【问题描述】:

我正在为我的 discord 机器人创建一个循环,它会每十分钟向用户发送一次 DM。我不断收到我的事件循环已关闭的错误。我不知道如何打开它。帮助将不胜感激。我的代码如下所示。

@bot.command(aliases=['r10', 'R10'])
async def remind10(ctx, user):
    mbed = discord.Embed(title = 'Reminding you every ten minutes.', description = 'If you want to deactivate this, please say the command pp!stopremind')
    mbed.set_author(name = 'Procrastination Police')
    await ctx.send(embed=mbed)
    global remind_loop
    @tasks.loop(minutes=10)
    async def remind_loop():
        await user.send('Reminding you to stop procrastinating?')

【问题讨论】:

  • 任务循环应该与命令分开。您还应该使用存储方法,以便您可以与多人一起完成此操作

标签: python discord discord.py


【解决方案1】:

无意冒犯,但这些都是你的问题,

  • 首先,你没有调用任务,所以它不会运行。

  • 二、为什么remind_loop是全局的,有什么意义?

  • 第三,您没有传入变量 user 和 mbed 用于提醒循环。

  • 第四,你为什么只发送“提醒你停止拖延”?当将所有文本放在一起更合乎逻辑时,向用户展示。

  • 五、remind10(ctx, user) 如果是remind(ctx, user : discord.Member)会更好

  • 第六,将任务功能放在主功能之外更清楚,在某些情况下,您不能将任务放在功能内部。

反正我做了两个版本的想要你想要的。

第一个要求用户具有管理员权限,因为人们可以对其他人执行此操作。如果您只输入“pp!remind”,它会每 10 分钟(600 秒)提醒自己一次,直到您输入“pp!remind stop”。否则,如果您输入“pp!remind @[Username] start [interval(in seconds)]”,它会提醒用户您在输入的每个间隔中输入。例如“pp!提醒@Bob start 60”。如果您想停止提醒该特定用户,您可以输入“pp!remind @[Username] stop”。

第二个不需要 adim perms 因为这个提醒只对你自己有效。如果您输入“pp!remind”,它会每 10 分钟(600 秒)提醒自己一次,直到您输入“pp!remind stop”。否则,如果您输入“pp!remind start [interval]”,那么它会在每个时间间隔提醒您。例如“pp!remind start 600”(10 分钟)。要停止它运行,只需输入“pp!remind stop”即可。

1.

@bot.command(aliases = ["r","R"])
@commands.has_permissions(administrator = True)
async def remind(ctx,member : discord.Member = "", enabled = "start", interval = 600):
    if member == "":
        member = bot.get_user(ctx.author.id)
    if enabled.lower() == "stop":
        reminder.cancel()
    elif enabled.lower() == "start":
        mbed = discord.Embed(title = f'Reminding you to stop procrastinating every {interval / 60} minutes.', description = 'If you want to deactivate this, ask an admin to enter the command pp!remind stop @[Username]')
        mbed.set_author(name = 'Procrastination Police')
        reminder.change_interval(seconds = float(interval))
        reminder.start(member, mbed)
        
@tasks.loop(seconds = 600)
async def reminder(member, mbed):
    await member.send(embed=mbed)
@bot.command(aliases = ["r","R"])
async def remind(ctx, enabled = "start", interval = 600):
    member = bot.get_user(ctx.author.id)
    if enabled.lower() == "stop":
        reminder.cancel()
    elif enabled.lower() == "start":
        mbed = discord.Embed(title = f'Reminding you to stop procrastinating every {interval / 60} minutes.', description = 'If you want to deactivate this, enter the command pp!remind stop')
        mbed.set_author(name = 'Procrastination Police')
        reminder.change_interval(seconds = float(interval))
        reminder.start(member, mbed)
        
@tasks.loop(seconds = 600)
async def reminder(member, mbed):
    await member.send(embed=mbed)

【讨论】:

  • 您好!感谢您的回复,很抱歉回复晚了。我只是想问一下并告诉您,您发送的代码有一个错误,指出该成员没有作为发送的属性。你知道为什么这么说吗?我认为这没有意义,因为当您定义成员时,您包含了消息 ID 的作者,即用户,但仍然没有发送消息的属性。
  • 您好,很抱歉回复晚了。我决定为我自己的不和谐机器人添加这个功能,它工作得很好。听说如果用discord rewrite,send函数其实就是send_message。否则我不确定问题是什么,因为我对 discord.py 没有经验。
  • 我正在使用这个代码来完成这个任务:@tasks.loop(seconds = 600) async def prompt(member, interval): mbed = discord.Embed(title = f'提醒你停止拖延每 {interval / 60} 分钟。', description = '如果您想停用此功能,请让管理员输入命令 pp!remind stop @[Username]') mbed.set_author(name = '拖延警察') await member .send(embed=mbed)
  • 我在 on_ready 函数中使用它,因为我只希望它为我自己工作:guild = client.get_guild(850027913461366834) owner = client.get_user(guild.owner.id) interval = 600提醒.change_interval(秒=间隔)提醒.开始(成员=所有者,间隔=间隔)
  • 我也在使用客户端而不是机器人,因为我使用的是:client = commands.Bot(command_prefix = prefix, intents = intents)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 2019-01-12
  • 1970-01-01
  • 2021-09-29
  • 2020-09-07
  • 1970-01-01
  • 2021-05-14
相关资源
最近更新 更多