Зациклить состояниe FSM aiogram
Я новичок в aiogram, можете подсказать, как зациклить одно состояние FSM машины, например, пользователь вводит количество участников и по очереди имена участников в отдельных сообщениях. И бот будет принимать имена участников, пока их не станет столько же, сколько пользователь ввёл изначально.
Подскажите, пожалуйста!?
Ответы (1 шт):
Автор решения: oleksandrigo
→ Ссылка
Ну так оставьте одно состояние и всё. Запишите в дату стейта количество которое он ввел и сделайте массив, в который будут добавляться те кого он вписывает. Это буквально два хендлера и два состояния.
Что-то вроде этого
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import StatesGroup, State
from data import config
bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
class InputWhatever(StatesGroup):
kolvo = State()
name_user = State()
@dp.message_handler(commands=["start"])
async def start(message: types.Message):
await message.answer("Введите кол-во юзеров")
await InputWhatever.kolvo.set()
@dp.message_handler(state=InputWhatever.kolvo)
async def get_number(message: types.Message, state: FSMContext):
if message.text.isdigit():
if int(message.text) > 0:
await InputWhatever.name_user.set()
async with state.proxy() as data:
data["number"] = int(message.text)
data['user_array'] = []
await message.answer("Введите юзера!")
else:
await message.answer("Введите число больше 0!")
else:
await message.answer("Введите кол-во!")
@dp.message_handler(state=InputWhatever.kolvo)
async def get_user_name(message: types.Message, state: FSMContext):
async with state.proxy() as data:
if len(data['user_array']) <= data['number']:
data['user_array'].append(message.text)
...
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)