Как правильно реализовать проверку времени, чтоб бот по заданным параметрам присылал сообщение?
bot = Bot(TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
tasks = []
days_dict = {
'Monday': 'Понедельник',
'Tuesday': 'Вторник',
'Wednesday': 'Среда',
'Thursday': 'Четверг',
'Friday': 'Пятница',
'Saturday': 'Суббота',
'Sunday': 'Воскресенье'
}
# Создаем класс состояний (States)
class TaskForm(StatesGroup):
waiting_for_weekday = State()
waiting_for_time = State()
waiting_for_text = State()
# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
buttons = ['Создать задачу', 'Мои задачи']
markup.add(*buttons)
await message.answer("Привет! Я бот-напоминалка. Чтобы создать новую задачу, нажни на соответсвующуу кнопку", reply_markup=markup)
@dp.message_handler(lambda message: message.text == 'Создать задачу')
async def process_weekday(message: types.Message, state: FSMContext):
await bot.send_message(message.from_user.id, 'Напишите мне 3 сообщеия в виде: День недели, время и задача')
await TaskForm.waiting_for_weekday.set()
@dp.message_handler(state=TaskForm.waiting_for_weekday)
async def weekd(message: types.Message, state: FSMContext):
weekday = message.text.capitalize() # Изменяем первую букву на заглавную
print(weekday)
weekdays = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье'] # Используем названия дней с заглавными буквами
if weekday not in weekdays:
await message.reply("Некорректный день недели. Пожалуйста, введите корректный день недели (например, 'понедельник')")
else:
await state.update_data(weekday=weekday)
await message.reply("Отлично! Теперь отправь мне время в формате 'HH:MM' (например, '14:30')")
await TaskForm.waiting_for_time.set()
@dp.message_handler(state=TaskForm.waiting_for_time)
async def process_time(message: types.Message, state: FSMContext):
time = message.text
print(time)
try:
datetime.strptime(time, "%H:%M")
except ValueError:
await message.reply("Некорректный формат времени. Пожалуйста, введите время в формате 'HH:MM' (например, '15:30')")
else:
await state.update_data(time=time)
await message.reply("Отлично! Теперь отправь мне задачу, которую ты хочешь добавить в список.")
await TaskForm.waiting_for_text.set()
@dp.message_handler(state=TaskForm.waiting_for_text)
async def process_text(message: types.Message, state: FSMContext):
# сохраняем текст задачи в состояние
data = await state.get_data()
task = {'weekday': data['weekday'], 'time': data['time'], 'text': message.text}
print(f"Создана новая задача: {task}")
tasks.append(task)
await state.finish()
await bot.send_message(message.from_user.id,f"Ваша задча: {task['weekday']},{task['time']}, {task['text']}")
await bot.send_message(message.from_user.id,"Задача успешно создана")
now = datetime.now()
weekday = now.strftime("%A")
h_and_m = now.strftime('%H:%M')
today_ru = days_dict[weekday]
if today_ru == task['weekday'] and h_and_m == task['time']:
await bot.send_message(message.from_user.id, f'Напоминаем, что сегодня в {task["time"]} ты хотел {task["text"]}')
@dp.message_handler(lambda message: message.text == 'Мои задачи')
async def my_xobiez(message: types.Message, state: FSMContext):
# проходимся по списку задач и создаем строку с их описанием
tasks_str = ''
for task in tasks:
tasks_str += f'\n- {task["weekday"]}, {task["time"]}: {task["text"]}'
if tasks_str:
await bot.send_message(message.from_user.id, f'Вот список твоих задач:{tasks_str}')
else:
await bot.send_message(message.from_user.id, 'У тебя пока нет задач')
if __name__ =='__main__':
executor.start_polling(dp, skip_updates=True)
Хочу сделать бота с напоминаниями, используя Fsm состояние. В переменных task['weekday'] task['time'] лежит время и день недели, но бот не присылает сообщение, и в терминале ошибок нет, пытался сделать проверку через while True, но все равно не сработало.