Как добавить проверку, чтобы бот получал только время (%H:%M)? Python, Aiogram
Нужно, чтобы пользователь вводил время в формате ??:??, если будет неверно, то повтор вопроса, если верно, то фиксация в переменную.
Например:
- 11 - неверно (нет минут)
- 24:30 - нет такого времени
- 44:00 - нет такого времени
- 11:22 - фиксация ответа
Вот такой вот кусок кода:
#Если нажата определенная кнопка, спрашивает время подъёма
@dp.callback_query_handler(text='up_time', state=None)
async def up_tm_cb(call: types.CallbackQuery, state=None):
if call.data == 'up_time':
await bot.send_message(chat_id=call.from_user.id, text='Запиши время подъема: ')
await call.message.delete()
await create_up_time(user_id=call.from_user.id)
await ProfileStateGroup.up_time.set() #устанавливаю ожидание ответа
#здесь попытка сделать проверку, но я не понимаю, как именно сделать
@dp.message_handler(lambda message: not message.text.replace(':', '').isdigit(), state=ProfileStateGroup.up_time) #пока принимает любое значение. и 11 и 11:22 и 77:22
#@dp.message_handler(re.compile(r'(\d{1,2}:\d{1,2})'), state=ProfileStateGroup.up_time)
async def check_up_time(message: types.Message):
await message.reply('''
Это не число! Попробуй еще раз!
Запиши время подъема:''')
@dp.message_handler(content_types='text', state=ProfileStateGroup.up_time)
async def time_up_st(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['up_time'] = message.text
await message.reply('Отлично, я запомнил время подъема! Что-то еще?', reply_markup=inkb)
await edit_profile_up_time(state, user_id=message.from_user.id)
await state.finish()
Подскажите, пожалуйста, как можно реализовать данную проверку?
Был вариант добавить другой файл с подобным кодом:
from aiogram.dispatcher.filters import Filter
from aiogram import types
import re
from datetime import datetime
class datatimecheck(Filter):
key = 'is_data'
pattern = re.compile(r'(\d{1,2}:\d{1,2})')
async def check(self, message: types.Message) -> bool:
return self.pattern.match(message.text)
#(r'(\d{1,2}:\d{1,2})
Ответы (1 шт):
Автор решения: gord1402
→ Ссылка
Вот пример использования strptime и try:
@dp.message_handler(commands='start')
async def cmd_start(message: types.Message):
await ProfileStateGroup.up_time.set()
await message.reply("Введите время:")
@dp.message_handler(state=ProfileStateGroup.up_time)
async def time_entered(message: types.Message, state: FSMContext):
try:
entered_time = time.strptime(message.text, "%H:%M")
except ValueError:
await message.reply("Время некорректно!")
else:
await message.reply(f"Отлично время введено!")
# Сохранение entered_time
# Переход в следующее состояние