Задать вопрос

Как сразу добавить информацию в хранилище State (aiogram)?

Хей, хай! Вопрос к тем, кто работал с библиотекой aiogram, а именно с классом State(Finite state machine). Знаете как сразу, после сета( <>.set() ), внести информацию в хранилище? ( update_data() )

Я знаю, как обновить хранилище и вернуть оттуда данные, после отправленного пользователем сообщения, но не знаю как сделать это до отправки, сразу, чтобы использовать в следующих ответах. Спасибо за внимание <3
  • Вопрос задан
  • 23972 просмотра
Подписаться 4 Средний Комментировать
Решения вопроса 1
@i_ikigai
class reg(StatesGroup):
    name = State()
    fname = State()
    age = State()


@dp.message_handler(commands="reg", state="*")
async def name_step(message: types.Message, state: FSMContext):
    await message.answer(text='Напиши имя ')
    await reg.name.set()


@dp.message_handler(state=reg.name, content_types=types.ContentTypes.TEXT)
async def fname_step(message: types.Message, state: FSMContext):
    if any(map(str.isdigit, message.text)):
        await message.reply("Пожалуйста напишите свое имя")
        return
    await state.update_data(name_user=message.text.title())
    await message.answer(text='Напиши фамилию ')
    await reg.fname.set()


@dp.message_handler(state=reg.fname, content_types=types.ContentTypes.TEXT)
async def age_step(message: types.Message, state: FSMContext):
    if any(map(str.isdigit, message.text)):
        await message.reply("Пожалуйста напишите свою фамилию")
        return
    await message.answer(text='Напиши возраст ')
    await state.update_data(fname_user=message.text.title())
    await reg.age.set()


@dp.message_handler(state=reg.age, content_types=types.ContentTypes.TEXT)
async def res_step(message: types.Message, state: FSMContext):
    if not any(map(str.isdigit, message.text)):
        await message.reply("Пожалуйста введите свой возраст")
        return
    await state.update_data(age_user=message.text.lower())
    user_data = await state.get_data()
    await state.finish()

в моем коде в user_data записаны 3 сообщения пользователя в словарь. Оттуда их просто получать через обращение f'{user_data[name_user}}' например
Разобрался че к чему отсюда https://mastergroosha.github.io/telegram-tutorial/...
В ссылках на гитхаб есть рабочий пример, там он более полный и по нему проще понять
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@MEDIOFF
Python Developer
Сразу после <>.set() пишешь:
state = Dispatcher.get_current().current_state()
И это будет и твой стейт которому ты можешь уже потом обращаться как к обычному
state.update_data(key=value)
Ответ написан
@enabl3
А можно каким либо образом отменить шаги, если к примеру добавить кнопку отмены
await message.answer(text='Напиши имя ', reply_markup=keyboards.cancelKeyboard)

где в кейбордсах
cancel = InlineKeyboardButton(text="Отмена", callback_data="cancel")

cancelKeyboard = InlineKeyboardMarkup()
cancelKeyboard.add(cancel)


а в коллбеках
if call.data == "cancel":
        await call.message.edit_text(text="Отмена")

сейчас сообщение с именем выводит кнопку для отмены, но по нажатию на неё, ничего не происходит
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы