我想在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)
答案 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)