@febjay

Как правильно сделать условие в aiogram python FSM?

Делаю бота на python aiogram, столкнулся с проблемой. Сейчас во втором состоянии Task.problem условие if отрабатывается при двойном нажатии на кнопку (Интернет/Замки), как можно сделать так чтобы условие с первого раза создавало новое состояние Task.lock.set() или Task.internet.set()

import logging

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

logging.basicConfig(level=logging.INFO)

API_TOKEN = 'ключ'

bot = Bot(token=API_TOKEN)
number_task = 0
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)



class Task(StatesGroup):
    problem = State()
    choose_problem = State()
    internet = State()
    lock = State()


@dp.message_handler(commands='start')
async def bot_start(message: types.Message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True, selective=True)
    markup.add("Первый выбор", "Второй выбор")
    await Task.problem.set()

    await message.answer("Выберите:", reply_markup=markup)


@dp.message_handler(state=Task.problem)
async def process_name(message: types.Message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True, selective=True)
    markup.add("Интернет", "Замки")
    if message.text == "Интернет":
        await Task.internet.set()
    elif message.text == "Замки":
        await Task.lock.set()
    await message.answer("Что случилось", reply_markup=markup)


@dp.message_handler(text="Замки", state=Task.lock)
async def without_puree(message: types.Message):

    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    markup.add("Работает", "Не работает")
    await Task.next()
    await message.answer(text="Что именно?", reply_markup=markup)


@dp.message_handler(text="Интернет", state=Task.internet)
async def without_puree(message: types.Message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    markup.add("Работает", "Не работает")
    await Task.next()
    await message.answer(text="Что именно?", reply_markup=markup)


if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
  • Вопрос задан
  • 163 просмотра
Пригласить эксперта
Ответы на вопрос 1
@grad0ff
@dp.message_handler(state=Task.problem)
async def process_name(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, selective=True)
markup.add("Интернет", "Замки")

У вас сначала переход в состояние Task.problem и затем отображение клавиатуры с нужными кнопками "Интернет", "Замки" в функции process_name. Этот markup надо передавать до функции process_name, чтобы кнопки "Интернет", "Замки" уже отображались при переходе в состояние Task.problem. Соответственно, хэндлер @dp.message_handler(state=Task.problem) будет ловить все слова, включая "Интернет" и "Замки".
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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