如果通道的最后一条消息是X分钟前发送的,如何创建循环来发送消息? [discord.py]

时间:2020-10-07 11:27:09

标签: python python-3.x discord discord.py discord.py-rewrite

我正在尝试添加可自定义的聊天恢复命令功能,该功能将在无人发言X分钟后发送主题以恢复聊天,X可以由管理员设置,我之前问过类似的问题,但我得到了答案不适用于这里。

该功能的工作原理:管理员通过执行命令并指定所需的分钟数来启用该功能,然后将这些分钟保存到数据库中。

问题不是将分钟数保存到数据库中,而是很好地解决了问题,而是创建了一个循环来检查频道的上一条消息日期是否超出了管理员设置的限制。

我尝试了几种方法,例如使用asyncio.sleepwait_for(),但是它们影响了其他命令,因此它们并不是正确的方法,我尝试了以下方法:

@bot.event
async def on_message(message):
    if str(message.channel.id) in data: # Check if the admins has set a number of mintues
        keepLooping = True
        timer = datetime.utcnow() + timedelta(seconds=delay) # delay is the time set by admins, pulled from the database.
        while keepLooping:
            if timer < message.channel.last_message.created_at and message.channel.last_message.author != bot.user:
                await message.channel.send("Random Topic Here")
                return
   
    await bot.process_commands(message)

我问过一些服务器上的人,他们告诉我上面的方法对内存不好,所以我也假设这也不可行。一位朋友告诉我使用discord.py任务,但是我不确定如何实现它们。

有关此案的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用tasks。这不是一个很好的解决方案,但它将为您服务。

from discord.ext import tasks
import datetime
@tasks.loop(seconds=10.0)
async def checker():
    channel = # you should define the channel here
    last_mes = channel.last_message.created_at
    counter = # you should define the 'X' minutes here
    now = datetime.datetime.now()
    if now-last_mes >= datetime.timedelta(minutes=counter):
        await message.channel.send("Random Topic Here")
        return

您可以执行此操作,还应在代码中添加checker.start()的结尾。