Использую 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}")
Хочу работать с определенными тегами, которые юзер должен будет ввести, и пока он не введет их корректно - он будет получать сообщение об ошибке. Переписать данный код проблем не составляет, но возможно есть более хорошое решение без использования машины состояний?