如何在 discord.py 中创建提醒命令?

时间:2021-05-25 19:24:06

标签: python discord discord.py

我想在discord.py中创建一个提醒命令,这个命令会提醒特定角色有事件即将到来。为此,我将事件开始的时间保存在第一个变量中,并在第二个变量中减去事件开始的时间和提前的分钟数。 然后我在async.io函数里放了第二个变量,这样提醒只在那个时候给出。

例如,如果活动在 20:00 开始并且提前时间为 2,则机器人应在 19:58 提醒

但这不起作用,我在控制台上收到以下错误:

discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: int() argument must be a string, a bytes-like object or a number, not 'datetime.timedelta'

这是我的代码:

@bot.command()
async def reminder(ctx, arg):

if arg == 'sap':

    role = 839182749452992639
    message = 'hello '
    event_start_time = timedelta(hours=20, minutes=0)
    advance_time = event_start_time - timedelta(minutes=2)

    await asyncio.sleep(int(advance_time) * 60)

    role = get(ctx.guild.roles, id=int(role))

    for user in ctx.guild.members:
        if role in user.roles:
            userDM = await user.create_dm() if (user.dm_channel is None) else user.dm_channel
            if userDM != None:
                await userDM.send(message + user.name)

3 个答案:

答案 0 :(得分:3)

您不能真正将 datetime.timedelta 对象转换为整数,如果您想获得总秒数,只需使用 total_seconds() 方法

await asyncio.sleep(advance_time.total_seconds()))

不过,您的逻辑已关闭,该功能直到 19:58 才会休眠,但要持续 19 小时 58 分钟,要修复它,您必须将当前时间减去所需时间并获得秒数

now = datetime.now() # or utcnow
future = datetime(now.year, now.month, now.day, 19, 58)
delta = (future - now).total_seconds()
 
await asyncio.sleep(delta)

答案 1 :(得分:2)

您的以下几行将生成一个 timedelta 对象:

event_start_time = timedelta(hours=20, minutes=0)
advance_time = event_start_time - timedelta(minutes=2)

当您尝试执行 int(advance_time) 这会产生错误时,您可以做的是直接从 timedelta 对象中获取秒数:

event_start_time = timedelta(hours=20, minutes=0)
advance_time = event_start_time - timedelta(minutes=2)
advance_time_seconds = advance_time.seconds
# you already have the difference in seconds, no need to multiply by 60
# can keep the int() so yo get and integer
await asyncio.sleep(int(advance_time))

答案 2 :(得分:-1)

已经之前做了一个类似的命令,所以试试这个:

示例用法

5/25/2021 9:32:53 PM    CampaignName CONTAINS_ALL ['test', 'play']
5/25/2021 9:32:54 PM    Invalid or inapplicable operator is used for field CampaignName. Please check the supported operators. (file Code.gs, line 52)