需要使用aiogram在电报机器人中创建一个计时器

问题描述 投票:0回答:1

我有电报机器人,我需要:

  1. “提出请求”
  2. 启动定时器
  3. 如果用户发送消息:'/done' -> 取消计时器
async def details(message: types.Message, state: FSMContext):
    if message.text == 'Make reques ✅':
       #starting timer

@dp.message_handler(commands='done', state="*")
async def done(message:typer.Message,state:FSMContext):
    #stopping timer
   

我尝试使用 asyncio.sleep() 但似乎无法在另一个函数中停止

python asynchronous python-asyncio telegram-bot aiogram
1个回答
0
投票

您可以通过存储开始时间并查找用户发送

/done
时开始时间和结束时间之间的差异来解决它。有很多方法可以存储开始时间,但我将通过将其存储在 Python 内置字典中来展示它(有很多替代方法)。

首先,你需要一个字典(你应该在你使用的文件上全局创建它:

timer = dict()

然后你应该保存当前用户的开始时间

async def details(message: types.Message, state: FSMContext):
    if message.text == 'Make reques ✅':
        timer[message.from_user.id] = datetime.now()

并且您知道用户何时发送“Make reques ✅”,因此您有开始时间,并且可以找到开始时间和现在之间的差异:

@dp.message_handler(commands='done', state="*")
async def done(message:types.Message,state:FSMContext):
    if timer.get(message.from_user.id):
        start_time = timer.get(message.from_user.id, None)
        if start_time is None:
            # send timer is not started for the current user
            return
        # Remove the user's start time if it's necessary
        del timer[message.from_user.id]

        # find the difference between start and finish time
        user_time_delta: timedelta = datetime.now() - start_time

        # You can do what you want with time delta >>>
© www.soinside.com 2019 - 2024. All rights reserved.