@TPHsMP

Почему не срабатывает машина состояний в Telegram боте?

Пишу бот, который принимает отправляемые пользователем картинки и сохраняет в разные папки в зависимости от нажатой кнопки. Столкнулся с проблемой: все изображения загружаются в ту папку, в которую фото было загружено в первый раз. То есть при нажатии первый раз кнопки send_mem - изображение сохранится в папке /mem, но если потом пользователь нажмет кнопку send_art то изображение все равно сохранится в папке /mem

Проблема в методе picture_saver и в самом хэндлере изображений

Просьба помочь разобраться.

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

storage = MemoryStorage()

# инициализация бота и диспетчера
bot = Bot(token='')
dp = Dispatcher(bot, storage=storage)


class MessageState(StatesGroup):
    send_pic = State()

# сохранение изображения в папку указанную в path
def picture_saver(path):
    @dp.message_handler(content_types=['photo'])
    async def get_photo(message: types.Message):
        try:
                await message.photo[-1].download(destination_file=f"{path}/pic_{message.message_id}.jpg")
                await bot.send_message(message.from_user.id, 'Download complete')
        except Exception as ex:
            print(ex)


@dp.message_handler(commands=['start'])
async def command_start(message: Message):
    keyboard = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True).add('send mem', 'send art')
    await message.answer("You can send me a pic", reply_markup=keyboard)
    await MessageState.send_pic.set()


@dp.message_handler(lambda message: message.text == 'send mem', state=MessageState.send_pic)
async def send_mem(message: Message, state: FSMContext):
    picture_saver("photo/mem")
    await message.answer('Send mem')
    await state.finish()


@dp.message_handler(lambda message: message.text == 'send art', state=MessageState.send_pic)
async def send_art(message: Message, state: FSMContext):
    picture_saver("photo/art")
    await message.answer('Send art')
    await state.finish()


# запуск бота
if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
  • Вопрос задан
  • 37 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы