Similization
@Similization
В прострации

Как заставить бота ждать нужного ответа от пользователя?

Использую aiogram, смотрю, как работает @BotFather и мне захотелось реализовать схожую логику.
Нашел подобный пример, но не уверен насколько он удачный:
import aiogram.utils.markdown as md
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Text
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.types import ParseMode
from aiogram.utils import executor


bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)


# создаём форму и указываем поля
class Form(StatesGroup):
    name = State() 
    age = State() 
    gender = State() 


# Начинаем наш диалог
@dp.message_handler(commands=['start'])
async def cmd_start(message: types.Message):
    await Form.name.set()
    await message.reply("Привет! Как тебя зовут?")


# Добавляем возможность отмены, если пользователь передумал заполнять
@dp.message_handler(state='*', commands='cancel')
@dp.message_handler(Text(equals='отмена', ignore_case=True), state='*')
async def cancel_handler(message: types.Message, state: FSMContext):
    current_state = await state.get_state()
    if current_state is None:
        return

    await state.finish()
    await message.reply('ОК')


# Сюда приходит ответ с именем
@dp.message_handler(state=Form.name)
async def process_name(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['name'] = message.text
   if message.text.startswith("Ъ"):
        await message.reply("Имя не должно начинаться на эту букву")
    else:
        await Form.next()
        await message.reply(f"Ну привет, {message.text}")

Хочу работать с определенными тегами, которые юзер должен будет ввести, и пока он не введет их корректно - он будет получать сообщение об ошибке. Переписать данный код проблем не составляет, но возможно есть более хорошое решение без использования машины состояний?
  • Вопрос задан
  • 1634 просмотра
Решения вопроса 1
gnifajio
@gnifajio
Совершенствуюсь каждый день
Лучшего решения чем FSM ты не найдешь. Если тебя смущает что состояния сбрасываются при перезапуске, то просто не перезапускай.

А на счет "ждать нужного ответа" я скажу вот что:
Если пользователь ответил верно, обновляй машину состояний.
В противном случае просто говори ему что ответ не верный, и не переключай состояние для пользователя.
Написано только что
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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