Python discord.py:函数等待特定日期和时间

Python discord.py:函数等待特定日期和时间,python,datetime,discord,bots,Python,Datetime,Discord,Bots,我又有一个问题:) 我计划了一个机器人,当用户告诉机器人什么时候开始时,它会给通道一个消息输出。 我将向您展示代码,然后告诉您我的问题: import discord import datetime import time import asyncio import random from discord.ext import commands from discord import Embed TOKEN = 'mytoken' intents = discord.Intents().al

我又有一个问题:) 我计划了一个机器人,当用户告诉机器人什么时候开始时,它会给通道一个消息输出。 我将向您展示代码,然后告诉您我的问题:

import discord
import datetime
import time
import asyncio
import random
from discord.ext import commands
from discord import Embed

TOKEN = 'mytoken'

intents = discord.Intents().all()
client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(client.user.name)
    print(client.user.id)

@client.event
async def on_message(message):
    def check(m):
       return m.channel == message.channel and m.author != client.user
    if message.author == client.user:
       return
    if message.content.startswith("!start"):
           await message.channel.send('Please type in the Enddate (TT.MM.JJ):')
           enddateinput = await client.wait_for('message', check=check, timeout=30)
           enddate = enddateinput.content
           await message.channel.send('Please type in the Endtime (HH:MM):')
           endtimeinput = await client.wait_for('message', check=check, timeout=30)
           endtime = endtimeinput.content

# *********************************************
# I dont know how to check the time with the subfunction time_check :(
# The optimal result is the function wait at this point until datetime.now(now) = enddate & endtime.
# and then i want the function to continue working.       
# *********************************************

           await message.channel.send('Enddate & Endtime reached.')
           await message.channel.send('Go on with the rest of the code :).')



async def time_check():
    await client.wait_until_ready()
    while not client.is_closed():
        nowdate = datetime.strftime(datetime.now(), '%d.%m.%y')
        nowtime = datetime.strftime(datetime.now(), '%H:%M')       
        if (nowdate == enddate) and (nowtime == endtime):
           await asyncio.sleep(1)
# *********************************************
#           BACK TO FUNKTION
# *********************************************
        else:
           await asyncio.sleep(60)


client.run(TOKEN)
问题是,我只需要time_check()用endtime/enddate检查每分钟的当前时间。 如果达到endtime和enddate,则time_check()可以停止工作,并返回on_message()继续工作函数

我完全不知道如何集成这个check_time()函数。 我希望你们中有人能帮助我


谢谢大家。

这些是您需要更改的功能,我只是计算了从当前时间到结束时间等待的总秒数,而不是每分钟检查是否达到结束时间。我还添加了一个检查,查看
结束时间是否在过去,这一点非常重要。总的来说,我相信这是实现你想要的结果的最好方法

@client.event
异步def on_消息(消息):
def检查(m):
返回m.channel==message.channel和m.author!=客户端用户
如果message.author==client.user:
返回
如果message.content.startswith(“!start”):
#获取结束日期。
wait message.channel.send(“请键入结束日期(DD.MM.YYYY):”)
enddateinput=等待客户端。等待(“消息”,检查=检查,超时=30)
enddate=enddateinput.content
#获取结束时间。
wait message.channel.send(“请键入结束时间(HH:MM):”)
endtimeinput=等待客户端。等待(“消息”,检查=检查,超时=30)
endtime=endtimeinput.content
#获取两个datetime对象,current和endtime。
endtime_obj=datetime.datetime.strtime(
“.join([enddate,endtime]),%d.%m.%Y.%H:%m”
)
currtime_obj=datetime.datetime.now()
如果没有(结束时间>当前时间):#检查结束时间是否在过去。
wait message.channel.send(“结束时间不能在过去!”)
#将等待秒数发送到时间检查功能
time_to_wait=endtime_obj-currtime_obj#时间差。
等待时间检查(消息,等待时间。总秒数()
异步定义时间检查(消息obj,秒到秒等待:浮点):
等待客户端。等待,直到准备就绪()
等待异步睡眠(秒到秒等待)
等待消息_obj.channel.send(“已到达结束日期和结束时间”)
等待消息_obj.channel.send(“继续代码的其余部分:)。)

这些是您需要更改的功能,我只是计算了从当前时间到结束时间等待的总秒数,而不是每分钟检查一次是否达到结束时间。我还添加了一个检查,查看
结束时间是否在过去,这一点非常重要。总的来说,我相信这是实现你想要的结果的最好方法

@client.event
异步def on_消息(消息):
def检查(m):
返回m.channel==message.channel和m.author!=客户端用户
如果message.author==client.user:
返回
如果message.content.startswith(“!start”):
#获取结束日期。
wait message.channel.send(“请键入结束日期(DD.MM.YYYY):”)
enddateinput=等待客户端。等待(“消息”,检查=检查,超时=30)
enddate=enddateinput.content
#获取结束时间。
wait message.channel.send(“请键入结束时间(HH:MM):”)
endtimeinput=等待客户端。等待(“消息”,检查=检查,超时=30)
endtime=endtimeinput.content
#获取两个datetime对象,current和endtime。
endtime_obj=datetime.datetime.strtime(
“.join([enddate,endtime]),%d.%m.%Y.%H:%m”
)
currtime_obj=datetime.datetime.now()
如果没有(结束时间>当前时间):#检查结束时间是否在过去。
wait message.channel.send(“结束时间不能在过去!”)
#将等待秒数发送到时间检查功能
time_to_wait=endtime_obj-currtime_obj#时间差。
等待时间检查(消息,等待时间。总秒数()
异步定义时间检查(消息obj,秒到秒等待:浮点):
等待客户端。等待,直到准备就绪()
等待异步睡眠(秒到秒等待)
等待消息_obj.channel.send(“已到达结束日期和结束时间”)
等待消息_obj.channel.send(“继续代码的其余部分:)。)

不必每分钟检查是否已达到结束时间,只需计算当前时间和结束时间之间的秒数并等待该秒数,这样会更高效,并大幅缩短代码长度。不必每分钟检查是否已达到结束时间,只需计算当前时间和结束时间之间的秒数,然后等待该秒数,这样会更有效,并显著减少代码长度。谢谢Raz Kissos。这解决了我的问题。顺便说一下,我删除了异步定义时间检查(message_obj,secs_to_wait:float),并在on_message中添加了以下内容:time_to_wait=endtime_obj-currtime_obj,secs_to_wait=time_to_wait.total_seconds(),wait asyncio.sleep(secs_to_wait)。这项工作也很棒。谢谢你的帮助。非常欢迎@loser09,我很高兴能帮上忙!拉兹·基索斯,我还有一个小问题。:)如何检查用户是否使用了正确的输入格式DD.MM.YYYY
wait message.channel.send('请键入Enddate(DD.MM.yyyyy):')enddateinput=wait client.wait_for('message',check=check,timeout=30)Enddate=enddateinput.content
@loser09您必须检查字符串长度是否正好为10个字符且包含2个点,一个在第二个索引中,一个在第五个索引中。然后只需检查所有其他字符是否都是数字,如果日期不正确,我确定是日期