Проблема с использованием aiogram-calendar и FSM
День добрый! Народ спасите помогите, бьюсь головой об стену изучая aiogram. Никак не могу реализовать простую идею бота. Идея простая создать возможность создать напоминание через чат бота с выбором описания даты времени и выбора возможности повторения напоминания ежедневно. Как я понял без использования машины состояний тут никак. И очень хочется использовать для выбора даты - aiogram_calendar
Создал вот такие states:
class RemindStates(StatesGroup):
description = State()
date = State()
time = State()
repeat = State()
Ну вроде как на мой взгляд все логично сначала выбираем описание потом дату время и повторять ли напоминание.
Вот так наваял хендлеры для states
@dp.message_handler(commands=['reminder'])
async def remind_register(message: types.Message):
await message.answer('О чем напомнить?')
await RemindStates.description.set()
@dp.message_handler(state=RemindStates.description)
async def get_description(message: types.Message, state: FSMContext):
await state.update_data(description=message.text)
await state.reset_state(with_data=False)
await message.answer('Выбери дату', reply_markup=await SimpleCalendar().start_calendar())
@dp.callback_query_handler(simple_cal_callback.filter())
async def process_simple_calendar(callback_query: CallbackQuery, callback_data: dict, state: FSMContext):
selected, date = await SimpleCalendar().process_selection(callback_query, callback_data)
if selected:
await RemindStates.date.set()
await state.update_data(date=date.strftime("%d.%m.%Y"))
await RemindStates.time.set()
@dp.message_handler(state=RemindStates.time)
async def get_time(message: types.Message, state: FSMContext):
await message.answer('Выбери время')
await state.update_data(time=message.text)
await RemindStates.repeat.set()
@dp.message_handler(state=RemindStates.repeat)
async def get_repeat(message: types.Message, state: FSMContext):
await message.answer('Повторять напоминание?')
await state.update_data(repeat=message.text)
await RemindStates.repeat.set()
data = await state.get_data()
print(f' Описание - {data["description"]} Дата - {data["date"]}, Время - {data["time"]} Повторять - {data["repeat"]}')
await state.finish()
Код запускается с импортами все хорошо. Но какие то танцы с бубнами начинаются после прохождения первого стейта. После ответа текстом на вопрос о чем напомнить выводится сообщение - Выберите дату и запускается календарь как и должно быть, но после выбора даты через календарь в чате телеги пропадает клавиатура календаря и он не переходит на следующий стейт - выбора времени. А вот если набрать потом просто в чате какой нибудь текст то, он потом спрашивает кокрас что и нужно - выбери время, но и дальше какой то кавардак происходит - как только ты отправляешь в чат желаемое время почему то срабатывает print который выводит что все стейты уже заполнены, и какого то фига запоминает в стейты те самые сообщения которые мы вводили когда не переходило на стейт выбора времени. А уже после отображения принта он запрашивает повторять ли напоминание или нет. Помогите разобраться.
P.S. Не кидайте камнями плиз первый раз пишу вопрос на stack, так что возможно написал где нибудь муть)