Задача

Есть действующий Telegram-бот, который выдает аккаунты менеджерам (реализован на Telethon 2.0). В процессе эксплуатации обнаружено несколько системных дефектов, которые мешают работе. Требуется исправить их без изменения архитектуры бота.

Основные проблемы

  • Дублирование аккаунтов: один и тот же аккаунт может быть загружен дважды - один раз через файл сессии, другой - через file tdata. Нужно сделать строгую дедупликацию по внутренним полям (account_id/account_hash).
  • Пропажа прокси: периодически привязанные к аккаунтам прокси-серверы «исчезают» из базы данных (становятся NULL в записях). Необходимо добавить инвариантную привязку прокси на уровне модели и валидацию при сохранении.
  • Неисправная кнопка отзыва: при нажатии кнопки «Отозвать аккаунт» у менеджера - аккаунт не возвращается в пул доступных. Кнопка должна запускать сценарий сброса состояния аккаунта (выдача = false, менеджер = null).
  • Недостаточный контроль выдачи: аккаунт считается «выданным» сразу после назначения менеджеру, даже если код подтверждения еще не введён. Из-за этого менеджер забирает аккаунт, не успев войти, а отзыв возможен только через его подтверждение. Необходимо переделать логику: аккаунт считается занятым сразу физически (менаждер блокирует возможность другим получить), но бот должен позволять легко «слить» его обратно без дополнительных действий, если менеджер не завершил вход (timeout-сброс).

Технические ограничения

  • Обязателен опыт работы с библиотекой Telethon версии 2.0+, понимание работы моделей User, Conversation, DLG.
  • Код писать с активным использованием современного ИИ-инструмента (Codex, Copilot, GPT) - скорость и качество рефакторинга критичны.
  • Бот написан на Python 3.10+, база данных - SQLite/PostgreSQL.
  • Актуальная архитектура сохраняется: любые изменения делаются через патчи существующего кода, а не полное переписывание.

Ожидаемый результат

  • Ни один аккаунт не может быть импортирован дважды - на этапе загрузки файла возвращать уведомление «аккаунт уже существует, операция отменена».
  • Прокси для каждого аккаунта хранятся целостно. Бот не даёт сохранить аккаунт без прокси (текущие proxy,null заменяются последним действующим прокси менеджера или возращается ошибка «выберите прокси» перед выдачей).
  • Кнопка «Отозвать» блокирует сессию менеджера в диалоге и мгновенно возвращает аккаунт в пул свободных.
  • Выданные, но не введенные коды: бот помечает аккаунт ссылкой на менеджера, установливает статус waiting_code. Через настраиваемый промежуток (2-3 минуты с последнего действия) авторейдер либо кнопка «Забрать» отзывывает аккаунт обратно без участия другого админа.