@Maxwell012

Как организовать асинхронную блокировку в телеграмм боте?

Мой код:
class ContentManager(SpecialistProfile):

    lock = asyncio.Lock()

    async def get_content(self, message: Message, bot: Bot, state: FSMContext) -> None:
        date = f"{datetime.now().day}.{datetime.now().month}.{datetime.now().year}"
        folder = os.path.join(CONTENT_DIR_PATH, date)
        if not os.path.exists(folder):
            os.makedirs(folder)

        # Download content
        async with lock:
            data = await state.get_data()
            content = data['content'] if 'content' in data else []

            if message.photo:
                short_path = os.path.join(
                    date, message.photo[-1].file_unique_id + '.png')
                full_path = os.path.join(CONTENT_DIR_PATH, short_path)
                await bot.download(file=message.photo[-1].file_id, destination=full_path)
            else:
                if message.video.duration > 20:
                    await message.answer("Ваше видео сильно длинное, загрузите пожалуйста видео до 20с!")
                    return
                short_path = os.path.join(
                    date, message.video.file_unique_id + '.mp4')
                full_path = os.path.join(CONTENT_DIR_PATH, short_path)
                await bot.download(file=message.video.file_id, destination=full_path)
            content.append(short_path)
            await state.update_data(content=content)

        len_content = len(content)
        if len_content <= 9:
            await message.answer(f"Добавлено - {len_content} из 10. Еще одно?", reply_markup=rp_save)
        else:
            await self.confirmation(message=message, state=state)

Этот метод я вношу в регистр:
dp.message.register(photo_manager.get_content, FillingSpecialistProfile.CONTENT, F.photo)
    dp.message.register(photo_manager.get_content, FillingSpecialistProfile.CONTENT, F.video)

Теперь о проблеме. Я с начало не заметил и создал один класс контент менеджера для всях юзеров и получалось так что если два человека отправляют фото в один момент то все фотографии становяться в очередь, а изначально была идея чтобы у каждого юзера отдельно фотографии становились в блокировку, а выходит из-за глобального блокировщика, фотографии 2 разных людей становятся в одну очередь. Я понимаю что мне нужно создавать отдельный блокировщик для каждого юзера который решил загрузить фотографии, но проблема в том что я не понимаю как я могу это внедрить в код телеграмм бота
  • Вопрос задан
  • 40 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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