/aio

The theater starts at the hanger and the bot starts at the entry point.

Primary LanguagePythonGNU General Public License v3.0GPL-3.0

wakatime

ТЗ бот Chat GPT

Цель: бот в телеграм, который выполняет функции Chat GPT, но с дополнительными настройками и функциями. Должна быть реализована оплата подписки и пополнения кол-ва токенов.

Модель юзера имеет поля: __tablename__ = ‘users’

user_id (id юзера в тлг; pk),
username (уникальное имя юзера в тлг; может быть null),
first_name/nickname (на выбор; никнейм пользователя в тлг; null=False),
status (статус пользователя - подписка; null=False, default=‘standard’)
p.s. Уровни подписки будут разобраны дальше.
token_count (текущее кол-во токенов; желательно биг инт)
days_left (можно назвать по-другому; отвечает за оставшееся время подписки)
question_count (кол-во вопросов; считается каждое отправленное сообщение, на которое бот дал ответ.)
register_date (дата регистрации пользователя)
update_date (время последнего действия пользователя)
referral_count (кол-во приглашенных пользователей по ссылке)

Есть вероятность, что в ходе написания кода потребуются дополнительные поля - можно добавлять.

У пользователя должен быть ui в виде меню с инлайн-кнопками.
Клавиатуры должна быть реализована генерацией «налету».
Все действия реализовать редактированием одного сообщения, без создания нового. Пример:
пользователь открывает основное меню > выбирает категорию «профиль». Сообщение редактируется на сообщение профиля, под сообщением генерируется новая клавиатура. При нажатии кнопки назад > сообщение вновь редактируется и снова отображает основное меню и клавиатуру.
На каждом уровне глубины должна быть кнопка назад.

Категории меню (в боте кнопки должны быть капсом, допускается использование эмодзи):
Профиль, Настройки, Помощь, Улучшения, Режим Бота
В кастомные настройки входят:
Модели Бота - это модель, которую будет использовать бот (машина состояний). Далее по тексту сокращенно будет просто - модель.
Модель представляет собой одну из кастомных настроек бота. В зависимости от выбранной модели будет зависеть поведение бота и его ответы. В этом разделе меню можно будет узнать подробную информацию по доступным моделям. Добавить плейсхолдер, уведомляющий пользователя о выбранной модели (текущая модель, которая будет использоваться).
В самом меню должна кнопки должны быть с радиокнопкой, оповещающие какая модель выбрана в данный момент.

При выборе модели должно быть оповещение в чате, сигнализирующее о выбранной модели.
Сообщение должно удаляться спустя 3 сек.
Реализовать с помощью очереди.

Настройки: Настройки у каждого пользователя должны быть свои, метод реализации - на выбор. Можно использовать Redis или MongoDB, или что-то другое. Здесь должен быть ui по настройке параметров модели. Обязательно указывается текущая модель, которая будет настраиваться. Должна быть возможность скинуть настройки на дефолтные (инлайн кнопка). Принцип работы:
При выборе категории настройки появится инлайн-клавиатура со всеми доступными моделями. При выборе конкретной модели открывается меню настроек. В меню будут прописаны текущие параметры и клавиатура для изменения этих настроек. (Пока что можно сделать заглушками, просто кнопки; 3 кнопки - стандартная настройка, точная, творческая). В дальнейшем будет добавлена возможность тонкой настройки, путем инкримента параметров.

Профиль: В этом сообщении будет содержаться информация о пользователе.

  • Никнейм пользователя.
  • Кол-во заданных вопросов.
  • Кол-во токенов.
  • Статус.
  • Оставшееся время подписки или, в случае отсутствия подписки - время до восстановления токенов.

Каждый запрос, на который бот дал ответ увеличивает счетчик вопросов. В противном случае счетчик не изменяется.

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

Помощь:
Здесь будет помощь по боту: Как работают токены, как они высчитываются и для чего нужны. Информация по моделям, а так же информация по доступным командам. Информация по командам записывается с учетом принимаемых аргументов. Есть два варианта реализации:

  • 1 пагинация, ограничивающая кол-во символов на одной странице в ~1000 символов.
  • 2 разделение по категориям. Отдельно про токены, модели и команды.

Улучшения:
Будет содержать краткую информацию о доступных улучшениях и клавиатуру:

  • Подписка
  • Токены

При переходе по кнопке «подписка» появятся еще 3 кнопки с названиями подписки. Для простоты назовем просто «подписка 1», «подписка 2», «подписка 3». Названия этих уровней подписки будет отображаться в профиле (если она активирована, иначе «standart») и эти же названия будут использованы в поле status в бд.
При выборе одной из подписок будет возможность выбора 3 разных вариантов подписки: на месяц, на 3 месяца и на 6. При нажатии на кнопку появляется информация о стоимости и приглашение к оплате.

При переходе по кнопке «токены» будет предложено докупить кол-во токенов и 5 вариантов.

Команды:

  • /reset - cброс всех настроек моделей к дефолтным. Если указан аргумент, то удаляется только определенная модель.
  • /get_notes - получить список заметок
  • /menu - открыть меню
  • /help - открыть помощь
  • /set - если указана без аргументов, то открывается категория меню «Режим Бота» с выбором модели. Если указан аргумент, то активируется выбранная модель, указанная в аргументе.
  • /ask - задать вопрос/получить фидбек

Подписка:
Подписку можно продлить, если она того же уровня (не выше уровнем). В случае попытки выбора более продвинутой подписки - предупреждать, что старая сгорит, но будет возмещена компенсация в размере оставшихся дней (компенсацию можно не реализовывать, ее наработки уже есть)

Должен быть сброс бесплатных токенов (очередь или шедулер. Таймер: неделя. Каждую неделю должен осуществляться сброс бесплатных токенов). Токены сбрасываются в том случае, если текущее число токенов меньше установленного еженедельного лимита.

При старте - приветственное сообщение, просьба ознакомиться с правилами и возможностями бота (Помощь или /help) и кнопка с ссылкой на правила. Также отправляется сообщение с менюшкой.

Как работает подписка:
Если у пользователя нет подписки, то после приобретения вступают в силу все преимущества, описанные в подписке.
Если пользователь продлевает подписку того же уровня, то увеличивается время действия подписки. Кол-во токенов при этом никак не меняется.
В случае смены подписки, например, с обычной на премиум > прошлая подписка сбрасывается, возвращая компенсацию за не потраченные дни. Кол-во оставшихся дней принимает значение кол-ва дней приобретенного пакета. Устанавливается кол-во токенов соответственно кол-ву токенов в подписке, если у пользователя их меньше - иначе кол-во токенов остается прежним.

При попытке покупки токенов при подписке unlimited отменять платеж и предупреждать пользователя, что у него безлимитная подписка.

При попытке купить подписку уровня ниже заказ должен отменяться и предупреждать пользователя, что он приобретает подписку статусом ниже, чем имеет. Если он все равно намерен приобрести подписку, то предупредить, что компенсации не будет. И если пользователь не передумал, то попросить повторить запрос еще раз. При повторной подаче заявки - платеж должен уже пройти.