Зациклить состояни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)
→ Ссылка