@nedland

Машина состояний FSM aiogram. Как сделать повтор по кнопке?

Понимаю, что по правилам нужно показать решения, которые не получаются. Но я не могу продумать логику решения и все попытки мне даже стыдно показывать. В гугле ничего не нашел.
Суть такая, есть словарь (естественно он на много записей)
dict = {
    "1": {
        "Name": "Roma",
        "Age": "25",
        "Country": "RUS",
        "Tel": "123123123"
    },
   "2": {
        "Name": "Oleg",
        "Age": "23",
        "Country": "BY",
        "Tel": "123123123"
    }
    }

Запускаю FSM, логика такая - забирает возраст, забирает страну и выдает случайное имя и телефон, которое соответствует стране и возрасту. Код, как получаю это
class FSMname(StatesGroup):
    age = State()
    country = State()
    
#Стартуем FSM
@dp.message_handler(commands=['names'],state='None')
@dp.message_handler(lambda message : message.text == 'Узнать номер человека')
async def namestart(message : types.Message, state: FSMContext):
    await FSMname.age.set()
    await message.answer(f"Укажи возраст</b>")

#ЗАБИРАЕМ ВОЗРАСТ    
@dp.message_handler(state=FSMname.age)
async def nameage(message : types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['age'] = message.text       
    await FSMname.next()
    await message.reply(f"Принято \n\n<b>Укажи страну</b>")

#ЗАБИРАЕМ СТРАНУ
@dp.message_handler(state=FSMname.country)
async def namecountry(message : types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['country'] = message.text

#ПЕРЕМЕШИВАЕМ СЛОВАРЬ
        items = list(dict.items())
        random.shuffle(items)

#ПЕРЕБИРАЕМ И ЗАВЕРШАЕМ ЦИКЛ ПРИ ОДНОМ УСПЕШНОМ, ПИШЕМ РЕЗУЛЬТАТ ПОЛЬЗОВАТЕЛЮ  
        for k, v in items:
            if data['age'] == v['Age']:
                if data['country'] == v['Country']:
                    await message.answer(f"Имя:{v['Name']}, Телефон: {v['Tel']}")
                    break

Последнее, хочу добавить кнопку "Показать еще" и каждый раз, чтобы при нажатии на нее опять запустился цикл и выдало уже другое имя и телефон. Так сказать "бесконечная кнопка", но данные с FSMname не теряла. И не могу понять как это можно реализовать. Подскажите, в каком направлении двигаться, а то тупик, спасибо!

-------------------------------------------------ДОПОЛНЯЮ--------------------------------------------------------------
Пока в голову пришла только идея, после вывода данных, через sqlite3 или json записывать последние введенные Age и Country пользователя и по команде выводить на основании их. Но жду умных мыслей, слишком усложняю код...
  • Вопрос задан
  • 1452 просмотра
Пригласить эксперта
Ответы на вопрос 1
@twistfire92
Python backend developer
еще один state добавляйте, например 'results'. И переходите в него когда выводите результат. Если кнопку показать еще нажали в этом стейте, перемешивайте все заново. В самом верху команду names навешивайте не только на стейт None, но и на этот новый
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы