Загрузка...

Aiogram. Разбираем FSM простыми словами

Тема в разделе Статьи создана пользователем gwaap 15 апр 2022. (поднята 2 сен 2024) 32 228 просмотров

  1. Jaaand2
    Jaaand2 25 май 2023 0 25 окт 2022
    как реализовать проверку данных пользователем через инлайн клаву?
    например после последнего состояния вывести данные пользователю с сообщением "правильно ли введны данные?" к этому сообщению инлайн батн "да" "нет"
    если да то отправлять в чат админу о заявке
    если нет то начать заново
    --- Сообщение объединено с предыдущим 25 май 2023
    у меня проблема на моменте детекта калл бека :Rotvgovne: инлайн батн выводиться а реагировать не хочет(
     
    25 май 2023 Изменено
    1. Посмотреть предыдущие комментарии (2)
    2. NK_TRIPLLE
      Jaaand2, оф документацию посмотри, если уже написан значит логика некорректная
    3. Jaaand2
      NK_TRIPLLE, если писать без входа в состояние то норм инлайн работает, мне кажется обработчик инлайна и состояние надо как-то дружить тип
    4. Jaaand2
      NK_TRIPLLE, вот попробуй сам в обработчике состояния сделать инлайн так чтоб он регал потом инлайн
  2. Jaaand2
    Jaaand2 25 май 2023 0 25 окт 2022
    Python
    from aiogram import types
    from aiogram.dispatcher import FSMContext
    from aiogram.dispatcher.filters.state import State, StatesGroup


    class UserState(StatesGroup):
    name = State()
    address = State()


    @dp.message_handler(commands=['reg'])
    async def user_register(message: types.Message):
    await message.answer("Введите своё имя")
    await UserState.name.set()


    @dp.message_handler(state=UserState.name)
    async def get_username(message: types.Message, state: FSMContext):
    await state.update_data(username=message.text)
    await message.answer("Отлично! Теперь введите ваш адрес.")
    await UserState.next() # либо же UserState.adress.set()


    @dp.message_handler(state=UserState.address)
    async def get_address(message: types.Message, state: FSMContext):
    await state.update_data(address=message.text)
    data = await state.get_data()
    keySart = types.InlineKeyboardMarkup()
    b1 = types.InlineKeyboardButton(text="ДА", callback_data="yes")
    b2 = types.InlineKeyboardButton(text="НЕТ", callback_data="no")
    keySart.add(b1, b2)
    await message.answer(f"Имя: {data['username']}\n"
    f"Адрес: {data['address']}", reply_markup=config_pap.keySart)

    @dp.callback_query_handler(text="no")
    async def send_no(call: types.CallbackQuery):
    await bot.delete_message(chat_id=call.from_user.id, message_id=call.message.message_id)
    await call.message.answer("ВЫВЕЛОСЬ ЭТО ЕБАНОЕ СООБЩЕНИЕ????")
    --- Сообщение объединено с предыдущим 25 май 2023
    что-то типа такого имею ввиду "просто к коду с темы добавил то что не получилось"
     
    1. Delete_L
      Попробуй место отправки принт сделать вдруг там в самой отправке проблема просто
    2. Delete_L
      Если исходить из того что проблема в статусе то мб его завершить нужно
    3. Jaaand2
      Delete_L, решил проблему тем что надо передавать статус в хендлер калл бека :Rotvgovne:
  3. egh8a1
    egh8a1 14 июл 2023 2 18 ноя 2020
    Спасибо, все понятно
     
  4. KPGVM
    KPGVM 28 июл 2023 кодер на пенсии 304 29 май 2019
    Cтатья реально годная но я все таки юзаю код со старых проектов))
     
  5. KappaDead
    KappaDead 6 дек 2023 0 18 сен 2020
    Как последнее сообщение бота переслать другому пользователю, условно если это бот для принятия брони в заведение
     
Top
Загрузка...