Как реализовать в aiogram множественный выбор через кнопки?

Надо сделать множественный выбор. Как сделал понял, что сделал что то не то, не могу понять как оно должно выглядить.

from aiogram import types, executor, Bot, Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import StatesGroup, State
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton


from config import TOKEN_API
from data import cityList

storage = MemoryStorage()
bot = Bot(TOKEN_API)
dp = Dispatcher(bot, storage=storage)

class UserStatesGroup(StatesGroup):
    name = State()
    age = State()
    city = State()
    hardSkills = State()


def getKbStart() -> ReplyKeyboardMarkup:
    kb = ReplyKeyboardMarkup(resize_keyboard=True)
    kb.add(KeyboardButton('/create'))
    return kb

@dp.message_handler(commands=['start'])
async def cmdStart(message: types.Message) -> None:
    await message.answer('Привет, для начала заполни анкету - командой /create', reply_markup=getKbStart())


@dp.message_handler(commands=['create'])
async def cmdCreate(message: types.Message) -> None:
    await message.answer('Давай начнем запаолнять анкету!\nДля начала отправь свое имя')
    await UserStatesGroup.name.set()

@dp.message_handler(content_types=['text'], state=UserStatesGroup.name)
async def loadName(message: types.Message, state: FSMContext) -> None:
    async with state.proxy() as data:
        data['name'] = message.text
    
    await message.reply("Сколько тебе лет?")
    await UserStatesGroup.next()

@dp.message_handler(content_types=['text'], state=UserStatesGroup.age)
async def loadAge(message: types.Message, state: FSMContext) -> None:
    async with state.proxy() as data:
        data['age'] = message.text
    
    await message.reply("Из какого вы города?")
    await UserStatesGroup.next()

def getKbHardSkillsFirst() -> ReplyKeyboardMarkup:
    kb = ReplyKeyboardMarkup(resize_keyboard=True)
    kb.add(KeyboardButton('Разработка web-приложений'),
           KeyboardButton('Разработка desktop-приложений'),
           KeyboardButton('Разработка мобильных приложений'),
           KeyboardButton('Разработка игр'),
           KeyboardButton('Программирование встраиваемых систем'),
           KeyboardButton('Далее к заполнению анкеты'))
    return kb

@dp.message_handler(content_types=['text'], state=UserStatesGroup.city)
async def loadCity(message: types.Message, state: FSMContext) -> None:
    async with state.proxy() as data:
        while True:
            if message.text in cityList:
                data['city'] = message.text
                break
            else:
                await message.answer("Такого города не существует в России, попробуйте еще раз")
    
    await message.reply("Выберите свое направление(можно несколько)!", reply_markup=getKbHardSkillsFirst())
    await UserStatesGroup.next()

def getKbHardSkillsWeb() -> ReplyKeyboardMarkup:
    kb = ReplyKeyboardMarkup(resize_keyboard=True)
    kb.add(KeyboardButton('Type Script'),
           KeyboardButton('Java Script'),
           KeyboardButton('CSS/HTML'),
           KeyboardButton('C#'),
           KeyboardButton('C++'),
           KeyboardButton('Scala'),
           KeyboardButton('PHP'),
           KeyboardButton('Scala'),
           KeyboardButton('Rust'),
           KeyboardButton('Node JS'),
           KeyboardButton('Erlang'),
           KeyboardButton('Java'),
           KeyboardButton('Python'),
           KeyboardButton('Golang'),
           KeyboardButton('Назад'))
    return kb

def getKbHardSkillsMobile() -> ReplyKeyboardMarkup:
    kb = ReplyKeyboardMarkup(resize_keyboard=True)
    kb.add(KeyboardButton('Kotlin'),
           KeyboardButton('C#'),
           KeyboardButton('C++'),
           KeyboardButton('Swift'),
           KeyboardButton('Objective-C'),
           KeyboardButton('Java'),
           KeyboardButton('Назад'))
    return kb

def getKbHardSkillsDesktop() -> ReplyKeyboardMarkup:
    kb = ReplyKeyboardMarkup(resize_keyboard=True)
    kb.add(KeyboardButton('C#'),
           KeyboardButton('C++'),
           KeyboardButton('Swift'),
           KeyboardButton('Objective-C'),
           KeyboardButton('Java'),
           KeyboardButton('Python'),
           KeyboardButton('Назад'))
    return kb

def getKbHardSkillsGame() -> ReplyKeyboardMarkup:
    kb = ReplyKeyboardMarkup(resize_keyboard=True)
    kb.add(KeyboardButton('C#'),
           KeyboardButton('C++'),
           KeyboardButton('Swift'),
           KeyboardButton('Назад'))
    return kb

def getKbHardSkillsIron() -> ReplyKeyboardMarkup:
    kb = ReplyKeyboardMarkup(resize_keyboard=True)
    kb.add(KeyboardButton('C++'),
           KeyboardButton('Java Script'),
           KeyboardButton('Java'),
           KeyboardButton('Python'),
           KeyboardButton('Назад'))
    return kb





@dp.message_handler(content_types=['text'], state=UserStatesGroup.hardSkills)
async def loadHardSkills(message: types.Message, state: FSMContext) -> None:
    hardskills = []
    while message.text != 'Далее к заполнению анкеты' and len(hardskills) == 0:
        if message.text ==  "Далее к заполнению анкеты" and len(hardskills) == 0:
            await message.answer("Вы еще ничего не выбрали!", reply_markup=getKbHardSkillsFirst())
        elif  message.text ==  "Разработка web-приложений":
            while message.text != "Назад":
                await message.answer("Выберите языки которые вы знаете!", reply_markup=getKbHardSkillsWeb())
                hardskills.append(message.text)
        elif  message.text ==  "Разработка desktop-приложений":
            while message.text != "Назад":
                await message.answer("Выберите языки которые вы знаете!", reply_markup=getKbHardSkillsWeb())
                hardskills.append(message.text)
        elif  message.text ==  "Разработка мобильных приложений":
            while message.text != "Назад":
                await message.answer("Выберите языки которые вы знаете!", reply_markup=getKbHardSkillsWeb())
                hardskills.append(message.text)
        elif  message.text ==  "Разработка игр":
            while message.text != "Назад":
                await message.answer("Выберите языки которые вы знаете!", reply_markup=getKbHardSkillsWeb())
                hardskills.append(message.text)
        elif  message.text ==  "Программирование встраиваемых систем":
            while message.text != "Назад":
                await message.answer("Выберите языки которые вы знаете!", reply_markup=getKbHardSkillsWeb())
                hardskills.append(message.text)
        else:
            await message.answer("Вы ввели что то не верное попробуйте снова!", reply_markup=getKbHardSkillsFirst())


    async with state.proxy() as data:
            data['hardSkills'] = hardskills
    
    await message.reply("Хорошо")
    #await UserStatesGroup.next()


if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

Ответы (0 шт):