根据 UTC 时间制作 discord.py(重写版本)计时器

Posted

技术标签:

【中文标题】根据 UTC 时间制作 discord.py(重写版本)计时器【英文标题】:Making a discord.py (rewrite version) timer based off of UTC time 【发布时间】:2021-06-16 11:23:44 【问题描述】:

我想添加一个基于 UTC 时间的计时器来刷新我每天下载的 API 文件。我正在使用 Discord.py 的重写版本。这就是我在下面制作的方式:

@client.event
# Updates API files daily
async def clock_timer():
    from datetime import datetime
    import pytz

    datetime_utc = datetime.now(pytz.utc)

    await datetime_utc.strftime("%H:%M:%S") == "03:00:00"
    if datetime_utc.strftime("%H:%M:%S") == "03:00:00":
        processes.api_grabber()

我这样做对吗?

【问题讨论】:

【参考方案1】:

await datetime_utc.strftime("%H:%M:%S") == "03:00:00" 不是一个有效的语句,您需要做的是获取 time_delta 并一直休眠。

datetime_utc = datetime.now(pytz.utc)
three_am_tmr = datetime_utc.replace(hour=3, minute=0, second=0) + timedelta(days=1)
delta = (three_am_tmr - datetime_utc).total_seconds()
await asyncio.sleep(delta)
#process api here

但是,如果您希望计时器每天执行,您必须使用 discord.py 任务或类似APS的东西

from discord.ext import tasks

@tasks.loop(days=1)
async def grab(something):
     #proccess api here


@grab.before_loop()
async def waiter():
   datetime_utc = datetime.now(pytz.utc)
   three_am_tmr = datetime_utc.replace(hour=3, minute=0, second=0) + 
   timedelta(days=1)
   delta = (three_am_tmr - datetime_utc).total_seconds()
   await asyncio.sleep(delta)

#start task in a command

参考资料:

datetime tasks

【讨论】:

【参考方案2】:

await 将“等待”直到事件发生,所以 if 语句应该没用。如果您正在导入的模块将在程序运行时始终使用,请将它们导入文件的顶部,而不是函数内部。

【讨论】:

以上是关于根据 UTC 时间制作 discord.py(重写版本)计时器的主要内容,如果未能解决你的问题,请参考以下文章

Discord Bot 响应短语(Discord.py 重写)

Discord.py 重新上传图片

禁止命令 discord.py 的问题(重写分支)

Discord.py 重写多服务器数据

Discord.py(重写)静音命令总是返回相同的响应

使用 Heroku 时如何从 Discord.py 异步更改为重写?