Compare commits

...

108 Commits

Author SHA1 Message Date
Egor cdd1e3f107 Update Dockerfile 2025-10-09 08:18:59 +03:00
Egor 6c6ade4f7f Update docker-registry.yml 2025-10-09 08:18:48 +03:00
Egor 30ad692bc2 Update docker-hub.yml 2025-10-09 08:18:37 +03:00
Egor 24b3ea4881 Merge pull request #984 from Fr1ngg/dev4
Апгрейд miniapp с подпиской
2025-10-09 08:13:28 +03:00
Egor 560689d9ee Merge pull request #983 from Fr1ngg/nx6oya-bedolaga/add-device-removal-feature-to-miniapp
Add device removal controls to miniapp
2025-10-09 08:01:30 +03:00
Egor aa763403c6 Add device removal support to miniapp 2025-10-09 08:01:13 +03:00
Egor 96c0c3562d Update index.html 2025-10-09 07:43:37 +03:00
Egor e48eaf584c Merge pull request #982 from Fr1ngg/ybcgxa-bedolaga/add-affiliate-section-to-miniapp
Update referral terms copy
2025-10-09 07:41:13 +03:00
Egor 790cd6bab3 Update referral terms labels 2025-10-09 07:40:57 +03:00
Egor 55ae2bd91c Merge pull request #981 from Fr1ngg/revert-980-jb9c12-bedolaga/add-affiliate-section-to-miniapp
Revert "Normalize referral rewards and adjust mini app spacing"
2025-10-09 07:39:50 +03:00
Egor d431931501 Revert "Normalize referral rewards and adjust mini app spacing" 2025-10-09 07:39:42 +03:00
Egor 425d15c850 Merge pull request #980 from Fr1ngg/jb9c12-bedolaga/add-affiliate-section-to-miniapp
Normalize referral rewards and adjust mini app spacing
2025-10-09 07:28:45 +03:00
Egor 58affda938 Fix referral reward normalization and spacing 2025-10-09 07:28:29 +03:00
Egor c4eb2a60de Merge pull request #979 from Fr1ngg/revert-978-ec880l-bedolaga/add-affiliate-section-to-miniapp
Revert "Fix referral bonus display and layout spacing"
2025-10-09 07:28:05 +03:00
Egor 46dca8c095 Revert "Fix referral bonus display and layout spacing" 2025-10-09 07:27:57 +03:00
Egor b752278398 Merge pull request #978 from Fr1ngg/ec880l-bedolaga/add-affiliate-section-to-miniapp
Fix referral bonus display and layout spacing
2025-10-09 07:24:40 +03:00
Egor 6a659a2131 Fix referral terms display and spacing 2025-10-09 07:24:20 +03:00
Egor 019397b0ea Merge pull request #977 from Fr1ngg/revert-976-tvd4k7-bedolaga/add-affiliate-section-to-miniapp
Revert "Enhance referral mini app card summary"
2025-10-09 07:23:37 +03:00
Egor 947a400909 Revert "Enhance referral mini app card summary" 2025-10-09 07:23:29 +03:00
Egor 7f52beb2a2 Merge pull request #976 from Fr1ngg/tvd4k7-bedolaga/add-affiliate-section-to-miniapp
Enhance referral mini app card summary
2025-10-09 07:06:47 +03:00
Egor 283d42af86 Enhance referral summary in mini app 2025-10-09 07:06:29 +03:00
Egor d36d1e3041 Merge pull request #975 from Fr1ngg/5o8uht-bedolaga/add-promo-code-activation-field
Improve promo code button layout on mini app
2025-10-09 06:32:51 +03:00
Egor a83bc25bd0 Improve promo code button layout on mini app 2025-10-09 06:32:34 +03:00
Egor 3555ada3b5 Merge pull request #974 from Fr1ngg/revert-973-ek2x9x-bedolaga/add-promo-code-activation-field
Revert "Add promo code activation UI to mini app"
2025-10-09 06:27:52 +03:00
Egor 1cb93d9688 Revert "Add promo code activation UI to mini app" 2025-10-09 06:27:44 +03:00
Egor 6f9fc5e071 Merge pull request #973 from Fr1ngg/ek2x9x-bedolaga/add-promo-code-activation-field
Add promo code activation UI to mini app
2025-10-09 06:26:16 +03:00
Egor 96d466328c Add promo code activation flow to mini app 2025-10-09 06:25:47 +03:00
Egor 846e7844db Merge pull request #972 from Fr1ngg/revert-971-f0jtfw-bedolaga/add-promo-code-activation-field
Revert "Add promo code activation support in mini app"
2025-10-09 06:25:19 +03:00
Egor 4e0b0837d9 Revert "Add promo code activation support in mini app" 2025-10-09 06:25:11 +03:00
Egor 8ba5cda095 Merge pull request #971 from Fr1ngg/f0jtfw-bedolaga/add-promo-code-activation-field
Add promo code activation support in mini app
2025-10-09 06:23:08 +03:00
Egor 7ac33bce28 Add promo code activation flow to mini app 2025-10-09 06:22:51 +03:00
Egor d8a0c166ac Merge pull request #970 from Fr1ngg/revert-969-x3v2no-bedolaga/add-promo-code-activation-field
Revert "Add promo code activation UI to mini app"
2025-10-09 06:22:14 +03:00
Egor c1858fe925 Revert "Add promo code activation UI to mini app" 2025-10-09 06:22:06 +03:00
Egor dae8e4c34c Merge pull request #969 from Fr1ngg/x3v2no-bedolaga/add-promo-code-activation-field
Add promo code activation UI to mini app
2025-10-09 06:19:52 +03:00
Egor 3d7c219fd1 feat: add promo code activation to miniapp 2025-10-09 06:19:37 +03:00
Egor 03781463e4 Merge pull request #968 from Fr1ngg/nnkucu-bedolaga/add-faq-section-to-/miniapp/index.html
Expose legal documents in mini app subscription view
2025-10-09 06:02:54 +03:00
Egor dcd9074136 Expose legal documents in mini app 2025-10-09 06:02:37 +03:00
Egor 7fbd26c8c3 Merge pull request #967 from Fr1ngg/revert-966-wq02f5-bedolaga/add-faq-section-to-/miniapp/index.html
Revert "Add FAQ section to mini app"
2025-10-09 06:02:05 +03:00
Egor 9677a55375 Revert "Add FAQ section to mini app" 2025-10-09 06:01:50 +03:00
Egor eb51cda617 Merge pull request #966 from Fr1ngg/wq02f5-bedolaga/add-faq-section-to-/miniapp/index.html
Add FAQ section to mini app
2025-10-09 05:49:20 +03:00
Egor 09bdde6f91 Add FAQ section to mini app 2025-10-09 05:49:01 +03:00
Egor 784b2ed996 Merge pull request #965 from Fr1ngg/revert-964-cg1tpe-bedolaga/add-faq-section-to-/miniapp/index.html
Revert "Add FAQ support to mini app subscription page"
2025-10-09 05:48:47 +03:00
Egor 9bee4a2365 Revert "Add FAQ support to mini app subscription page" 2025-10-09 05:48:39 +03:00
Egor f8946b99f3 Merge pull request #964 from Fr1ngg/cg1tpe-bedolaga/add-faq-section-to-/miniapp/index.html
Add FAQ support to mini app subscription page
2025-10-09 05:47:44 +03:00
Egor a17cbf4448 Add FAQ section to miniapp and expose data 2025-10-09 05:47:27 +03:00
Egor b0422e0c0f Merge pull request #963 from Fr1ngg/revert-962-io42y3-bedolaga/add-faq-section-to-/miniapp/index.html
Revert "feat: show FAQ in mini app"
2025-10-09 05:47:09 +03:00
Egor 9d0bf8b3cf Revert "feat: show FAQ in mini app" 2025-10-09 05:47:00 +03:00
Egor 8c5e8ca019 Merge pull request #962 from Fr1ngg/io42y3-bedolaga/add-faq-section-to-/miniapp/index.html
feat: show FAQ in mini app
2025-10-09 05:45:55 +03:00
Egor 0327adb8da feat: show FAQ in mini app 2025-10-09 05:45:40 +03:00
Egor 5769fa63a5 Merge pull request #961 from Fr1ngg/rkljpj-bedolaga/add-promo-offer-display-on-subscription-page
Display active test access promo offers
2025-10-09 05:20:01 +03:00
Egor 1d09006b7c Display active test access promo offers 2025-10-09 05:19:44 +03:00
Egor e194ab9729 Merge pull request #960 from Fr1ngg/revert-959-36674g-bedolaga/add-promo-offer-display-on-subscription-page
Revert "Fix promo offer timers by normalizing date parsing"
2025-10-09 05:18:46 +03:00
Egor 45a6173916 Revert "Fix promo offer timers by normalizing date parsing" 2025-10-09 05:18:38 +03:00
Egor b21baba006 Merge pull request #959 from Fr1ngg/36674g-bedolaga/add-promo-offer-display-on-subscription-page
Fix promo offer timers by normalizing date parsing
2025-10-09 05:09:51 +03:00
Egor 45c1b4695c Fix promo offer timer timezone handling 2025-10-09 05:09:31 +03:00
Egor 9b2b28423d Merge pull request #958 from Fr1ngg/revert-957-xzisus-bedolaga/add-promo-offer-display-on-subscription-page
Revert "Add promo offer display to subscription miniapp"
2025-10-09 05:07:44 +03:00
Egor 9d00c2ddc6 Revert "Add promo offer display to subscription miniapp" 2025-10-09 05:07:35 +03:00
Egor dc66676663 Merge pull request #957 from Fr1ngg/xzisus-bedolaga/add-promo-offer-display-on-subscription-page
Add promo offer display to subscription miniapp
2025-10-09 04:54:21 +03:00
Egor 1d600e2c63 Add promo offer display to subscription miniapp 2025-10-09 04:54:05 +03:00
Egor 5ce177a7b5 Merge pull request #956 from Fr1ngg/revert-955-4ttjow-bedolaga/add-promo-offer-display-on-subscription-page
Revert "Add promo offer banners to mini app"
2025-10-09 04:53:29 +03:00
Egor d181a333d7 Revert "Add promo offer banners to mini app" 2025-10-09 04:53:20 +03:00
Egor 3694cb4ed7 Merge pull request #955 from Fr1ngg/4ttjow-bedolaga/add-promo-offer-display-on-subscription-page
Add promo offer banners to mini app
2025-10-09 04:51:18 +03:00
Egor 051048e0ae Add promo offer banners to mini app 2025-10-09 04:50:46 +03:00
Egor 61ee6e42cf Merge pull request #954 from Fr1ngg/revert-953-x57z5w-bedolaga/add-promo-offer-display-on-subscription-page
Revert "feat: surface promo offers in mini app"
2025-10-09 04:50:35 +03:00
Egor 5bd618a799 Revert "feat: surface promo offers in mini app" 2025-10-09 04:50:27 +03:00
Egor 7794a4cc7b Merge pull request #953 from Fr1ngg/x57z5w-bedolaga/add-promo-offer-display-on-subscription-page
feat: surface promo offers in mini app
2025-10-09 04:43:18 +03:00
Egor 6d01d32dc2 feat: show promo offers in miniapp 2025-10-09 04:42:58 +03:00
Egor be71def203 Update index.html 2025-10-09 04:22:01 +03:00
Egor 7a2de410bd Update index.html 2025-10-09 04:15:51 +03:00
Egor b019e8b32d Update index.html 2025-10-09 04:11:57 +03:00
Egor cb4f773eb1 Update index.html 2025-10-09 04:09:28 +03:00
Egor 29fe9f4943 Merge pull request #952 from Fr1ngg/hycxed-bedolaga/add-user-promotion-group-display
Refine mini app promo section layout and discount display
2025-10-09 04:03:51 +03:00
Egor 63edfa852d Improve promo section presentation and discounts 2025-10-09 04:03:37 +03:00
Egor 66fabb6836 Merge pull request #951 from Fr1ngg/revert-950-5ob0h8-bedolaga/add-user-promotion-group-display
Revert "Improve promo group UI and period discounts"
2025-10-09 04:03:19 +03:00
Egor f29ea49185 Revert "Improve promo group UI and period discounts" 2025-10-09 04:03:10 +03:00
Egor 7620a3df92 Merge pull request #950 from Fr1ngg/5ob0h8-bedolaga/add-user-promotion-group-display
Improve promo group UI and period discounts
2025-10-09 04:02:20 +03:00
Egor 577bcfdc88 Improve promo group UI and period discounts 2025-10-09 04:02:00 +03:00
Egor 33ec09edd0 Merge pull request #949 from Fr1ngg/revert-948-ess9tg-bedolaga/add-user-promotion-group-display
Revert "Improve promo group UI with collapsible discounts"
2025-10-09 04:01:47 +03:00
Egor 7b3c463fa2 Revert "Improve promo group UI with collapsible discounts" 2025-10-09 04:01:40 +03:00
Egor 0e541af5e1 Merge pull request #948 from Fr1ngg/ess9tg-bedolaga/add-user-promotion-group-display
Improve promo group UI with collapsible discounts
2025-10-09 04:00:32 +03:00
Egor e39822e732 Improve promo group UI with collapsible discounts 2025-10-09 04:00:18 +03:00
Egor c7973e7b58 Merge pull request #947 from Fr1ngg/revert-946-0zyc5p-bedolaga/add-user-promotion-group-display
Revert "Display promo group discounts in mini app"
2025-10-09 03:59:47 +03:00
Egor 4941052d57 Revert "Display promo group discounts in mini app" 2025-10-09 03:59:40 +03:00
Egor 0022abc6e0 Merge pull request #946 from Fr1ngg/0zyc5p-bedolaga/add-user-promotion-group-display
Display promo group discounts in mini app
2025-10-09 03:45:11 +03:00
Egor acef77b0e8 Display promo group discounts in mini app 2025-10-09 03:44:54 +03:00
Egor 4ddd580347 Merge pull request #945 from Fr1ngg/revert-944-nafa9w-bedolaga/add-user-promotion-group-display
Revert "Display promo level discounts in the mini app"
2025-10-09 03:44:44 +03:00
Egor 42cc4db077 Revert "Display promo level discounts in the mini app" 2025-10-09 03:44:35 +03:00
Egor 8e3f976441 Merge pull request #944 from Fr1ngg/nafa9w-bedolaga/add-user-promotion-group-display
Display promo level discounts in the mini app
2025-10-09 03:40:28 +03:00
Egor 190d9ae13e Show promo level discounts when available 2025-10-09 03:39:59 +03:00
Egor d6deec1a29 Merge pull request #943 from Fr1ngg/revert-942-38969u-bedolaga/add-user-promotion-group-display
Revert "Display promo level discounts in mini app"
2025-10-09 03:39:44 +03:00
Egor e8dcbd09ff Revert "Display promo level discounts in mini app" 2025-10-09 03:39:33 +03:00
Egor 382f1eb6f7 Merge pull request #942 from Fr1ngg/38969u-bedolaga/add-user-promotion-group-display
Display promo level discounts in mini app
2025-10-09 03:38:30 +03:00
Egor 2853410ebc Show discount details for auto promo groups 2025-10-09 03:38:14 +03:00
Egor 2bde6a83ed Merge pull request #941 from Fr1ngg/revert-940-gbzjeq-bedolaga/add-user-promotion-group-display
Revert "Show promo group levels in mini app subscription view"
2025-10-09 03:36:29 +03:00
Egor 83b1fa0f0f Revert "Show promo group levels in mini app subscription view" 2025-10-09 03:36:21 +03:00
Egor 3a2a05d307 Merge pull request #940 from Fr1ngg/gbzjeq-bedolaga/add-user-promotion-group-display
Show promo group levels in mini app subscription view
2025-10-09 03:25:40 +03:00
Egor 2460766e30 Show promo group info and auto levels in miniapp 2025-10-09 03:25:25 +03:00
Egor 3eb01eaabc Merge pull request #939 from Fr1ngg/revert-938-pwo411-bedolaga/add-user-promotion-group-display
Revert "Show promo group and auto levels in mini app"
2025-10-09 03:24:36 +03:00
Egor 35bca4166d Revert "Show promo group and auto levels in mini app" 2025-10-09 03:24:28 +03:00
Egor f2db938fdc Merge pull request #938 from Fr1ngg/pwo411-bedolaga/add-user-promotion-group-display
Show promo group and auto levels in mini app
2025-10-09 03:22:18 +03:00
Egor ff0c68afc6 Show promo group and auto levels in mini app 2025-10-09 03:21:40 +03:00
Egor 67babf7566 Update README.md 2025-10-08 20:21:06 +03:00
Egor f71788d2d4 Update README.md 2025-10-08 20:11:24 +03:00
Egor 5eebdcc85c Update README.md 2025-10-08 20:02:57 +03:00
Egor 4b89de9634 Update README.md 2025-10-08 19:57:45 +03:00
Egor b81d5b199b Update README.md 2025-10-08 19:55:33 +03:00
Egor a21559cd0d Merge pull request #931 from Fr1ngg/jehc2b-bedolaga/-readme
docs: expand README functional overview
2025-10-08 19:46:23 +03:00
Egor 6cd3f87318 docs: expand feature overview in README 2025-10-08 19:46:04 +03:00
11 changed files with 5614 additions and 331 deletions
+3 -3
View File
@@ -36,15 +36,15 @@ jobs:
TAGS="fr1ngg/remnawave-bedolaga-telegram-bot:latest,fr1ngg/remnawave-bedolaga-telegram-bot:${VERSION}"
echo "🏷️ Собираем релизную версию: $VERSION"
elif [[ $GITHUB_REF == refs/heads/main ]]; then
VERSION="v2.4.6-$(git rev-parse --short HEAD)"
VERSION="v2.4.7-$(git rev-parse --short HEAD)"
TAGS="fr1ngg/remnawave-bedolaga-telegram-bot:latest,fr1ngg/remnawave-bedolaga-telegram-bot:${VERSION}"
echo "🚀 Собираем версию из main: $VERSION"
elif [[ $GITHUB_REF == refs/heads/dev ]]; then
VERSION="v2.4.6-dev-$(git rev-parse --short HEAD)"
VERSION="v2.4.7-dev-$(git rev-parse --short HEAD)"
TAGS="fr1ngg/remnawave-bedolaga-telegram-bot:dev,fr1ngg/remnawave-bedolaga-telegram-bot:${VERSION}"
echo "🧪 Собираем dev версию: $VERSION"
else
VERSION="v2.4.6-pr-$(git rev-parse --short HEAD)"
VERSION="v2.4.7-pr-$(git rev-parse --short HEAD)"
TAGS="fr1ngg/remnawave-bedolaga-telegram-bot:pr-$(git rev-parse --short HEAD)"
echo "🔀 Собираем PR версию: $VERSION"
fi
+3 -3
View File
@@ -49,13 +49,13 @@ jobs:
VERSION=${GITHUB_REF#refs/tags/}
echo "🏷️ Building release version: $VERSION"
elif [[ $GITHUB_REF == refs/heads/main ]]; then
VERSION="v2.4.6-$(git rev-parse --short HEAD)"
VERSION="v2.4.7-$(git rev-parse --short HEAD)"
echo "🚀 Building main version: $VERSION"
elif [[ $GITHUB_REF == refs/heads/dev ]]; then
VERSION="v2.4.6-dev-$(git rev-parse --short HEAD)"
VERSION="v2.4.7-dev-$(git rev-parse --short HEAD)"
echo "🧪 Building dev version: $VERSION"
else
VERSION="v2.4.6-pr-$(git rev-parse --short HEAD)"
VERSION="v2.4.7-pr-$(git rev-parse --short HEAD)"
echo "🔀 Building PR version: $VERSION"
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
+1 -1
View File
@@ -14,7 +14,7 @@ RUN pip install --no-cache-dir --upgrade pip && \
FROM python:3.13-slim
ARG VERSION="v2.4.6"
ARG VERSION="v2.4.7"
ARG BUILD_DATE
ARG VCS_REF
+199 -214
View File
@@ -35,7 +35,7 @@
### ⚡ **Полная автоматизация VPN бизнеса**
- 🎯 **Готовое решение** - разверни за 5 минут, начни продавать сегодня
- 💰 **Многоканальные платежи** - Telegram Stars + Tribute + CryptoBot + ЮKassa + MulenPay + PayPalych + P2P
- 💰 **Многоканальные платежи** - Telegram Stars + Tribute + CryptoBot + YooKassa + MulenPay + PayPalych (СБП)
- 🔄 **Автоматизация 99%** - от регистрации до продления подписок
- 📊 **Детальная аналитика** - полная картина вашего бизнеса
- 💬 **Уведомления в топики** об: Активация триала 💎 Покупка подписки 🔄 Конверсия из триала в платную ⏰ Продление подписки 💰 Пополнение баланса 🚧 Включении тех работ ♻️ Появлении новой версии бота
@@ -952,105 +952,111 @@ WEBHOOK_PATH=/webhook
### 👤 **Для пользователей**
🧭 **Онбординг и доступ**
- 🌐 Выбор языка интерфейса, динамическая локализация и настройка кнопки меню.
- 📜 Принятие правил, оферты и политики конфиденциальности прямо в боте.
- 📡 Проверка подписки на обязательный канал, deeplink-инвайты и UTM-кампании.
- 👤 Сбор контактных данных с антиспам-защитой и быстрым восстановлением доступа.
🛒 **Умная покупка подписок**
- 📅 Гибкие периоды (14-360 дней)
- 📊 Выбор трафика или фиксированный лимит
- 🌍 Автоматический выбор серверов (для одного сквада) или ручной выбор из множества
- 📱 Настройка количества устройств и серверов прямо при оформлении
- 🧾 Понятный калькулятор стоимости с учетом всех опций
- 📅 Гибкие периоды (14360 дней) и скидки за длительные подписки.
- 📊 Выбор трафика: фиксированный лимит, квоты или безлимит.
- 🌍 Автоматический выбор сквада или мультивыбор из десятков серверов.
- 📱 Настройка количества устройств, стран и доп. услуг прямо в чек-ауте.
- 🧾 Динамический калькулятор стоимости, черновики и возвращение к незавершённым заказам.
🧪 **Тестовая подписка**
- Настраиваемый триал-период
- Уведомления об истечении и сценарий мягкой конверсии в платную подписку
- Приветственное сообщение с предложением активации триала (с возможностью отключения)
- Поддержка рекламных кампаний с автоматической выдачей бонусных подписок
- Гибко настраиваемый триал и welcome-цепочка.
- Уведомления об истечении и автоконверсия в платный тариф.
- Автовыдача бонусов за участие в кампаниях и инвайт-линках.
- Контроль за обязательной подпиской на канал даже в режиме триала.
💰 **Удобные платежи**
- ⭐ Telegram Stars
- 💳 Tribute
- 💳 YooKassa (включая СБП и онлайн-чек)
- 💳 MulenPay
- 💳 PayPalych (Pal24)
- 💰 CryptoBot (мультивалюта и срок жизни инвойсов)
- 🎁 Реферальные и промо-бонусы
- Детальная история транзакций и чеков
💰 **Платежи и баланс**
- ⭐ Telegram Stars, 💳 Tribute, 💳 YooKassa (СБП + онлайн-чек), 💳 MulenPay, 🏦 PayPalych (СБП), 💰 CryptoBot.
- 📥 Автогенерация счетов, контроль статусов через вебхуки и уведомления.
- 💼 История операций с фильтрами, квитанциями и выгрузкой чеков.
- 🔄 Автоплатёж с настройкой дня списания и уведомлениями об ошибках.
- 🎁 Реферальные, промо- и кэшбэк-бонусы автоматически начисляются на баланс.
📱 **Управление подписками**
- 📈 Статистика использования в реальном времени (трафик, устройства, серверы)
- 🔄 Автопродление с баланса с настройкой дней и мгновенными уведомлениями
- 🔄 Управление трафиком и лимитами без участия оператора
- 🌍 Переключение серверов Remnawave на лету
- 📱 Управление устройствами + сброс HWID
- 🧩 Смена языка и персональных настроек
- 📈 Реальный трафик, устройства и география серверов прямо в диалоге.
- 🌍 Переключение серверов, стран и лимитов без помощи оператора.
- 📱 Сброс HWID, повторная выдача конфигов и инструкции подключения.
- 🧩 Смена языка, промогруппы и персональных параметров.
- 🧾 Просмотр активных услуг, статуса оплаты и сроков действия.
🎁 **Бонусная система**
- 🎫 Промокоды на деньги/дни/длинный триал
- 👥 Защищенная реферальная программа с комиссиями и антифродом
- 📊 Детальная статистика рефералов и кампаний
- 📨 Персональные рассылки и уведомления о новых бонусах
🛟 **Поддержка и самообслуживание**
- 🎫 Тикеты с приоритетами, вложениями и уведомлениями об ответе.
- 📚 FAQ, правила, оферта и политика доступны из меню.
- 💬 Быстрые ссылки на живую поддержку или кастомные каналы связи.
🧩 **Бонусы и рефералы**
- 🎫 Промокоды на деньги, дни, устройства, страны и расширенные триалы.
- 👥 Реферальная программа с комиссиями, бонусами и антифрод-фильтрами.
- 🧾 Подробная аналитика доходов, конверсии и активности приглашённых.
- 🔗 Генерация реферальных ссылок и QR-кодов в один тап.
🪪 **Mini App и инструкции**
- 📱 Telegram WebApp с обзором подписки, конфигами и кнопкой «Подключить».
- 📥 Библиотека загрузочных ссылок для клиентов Happ и кастомных гайдов.
- 🛰️ Web API для получения статуса подписки в мини-приложениях и внешних витринах.
</td>
<td width="50%" valign="top">
### ⚙️ **Для администраторов**
📊 **Мощная аналитика**
- 👥 Детальная статистика пользователей и подписок
- 💰 Анализ платежей по источникам (Stars, YooKassa, Tribute, MulenPay, PayPalych, CryptoBot)
- 🖥️ Мониторинг серверов Remnawave и статуса сквадов
- 📈 Финансовые отчеты, конверсии и эффективность рекламных кампаний
📊 **Аналитика и отчётность**
- 📈 Дашборды по пользователям, подпискам, трафику и удержанию.
- 💰 Детализация платежей по источникам (Stars, YooKassa, Tribute, MulenPay, PayPalych, CryptoBot).
- 🧮 Продажи по тарифам, устройствам, странам и промогруппам.
- 📣 Эффективность кампаний, промокодов, UTM-источников и реферальных потоков.
👥 **Управление пользователями**
- 🔍 Поиск и редактирование профилей
- 💰 Управление балансами и ручные начисления
- 📱 Изменение лимита устройств (1-X)
- 📊 Настройка лимитов трафика (0-10000 ГБ) и подключенных сквадов
- 🌍 Мультивыбор серверов и мгновенная синхронизация с панелью
- 🔄 Сброс HWID устройств и обновление конфигураций
- 👥 Детальная реферальная статистика в профиле пользователя
- 🔄 Изменение типа подписки триал/платная и ручное продление
- 🚫 Блокировка/разблокировка/удаление аккаунтов
- 🔍 Поиск, фильтры и детальные карточки с историей операций.
- 💰 Ручное изменение баланса, компенсации и корректировки.
- 📱 Изменение лимитов устройств, трафика, стран и подключенных сквадов.
- 🔄 Сброс HWID, перегенерация подписки и синхронизация с Remnawave.
- 🎯 Назначение промогрупп, тарифов и ручных продлений/обновлений.
- 🚫 Блокировки с таймером, полное удаление и аудит действий персонала.
🎯 **Маркетинг и продажи**
- 🎫 Гибкая промо-система (деньги/дни/длинный триал)
- 📣 Рекламные кампании с автоматическими бонусами за регистрацию
- 📊 Детальная статистика использования промокодов и кампаний
- 📨 Рассылки по сегментам с фильтрами по активности, подпискам и языкам
🎯 **Продажи, маркетинг и удержание**
- 🎫 Промокоды (разовые/многоразовые), бонусные предложения и бесплатные пакеты.
- 💳 Промогруппы со скидками на серверы, трафик, устройства и допуслуги.
- 📣 Кампании с deeplink-ссылками, UTM и автопродвижением триалов.
- 📨 Рассылки по сегментам, кастомные кнопки и медиа, отмена «в полёте».
- 🔘 Настройка кнопок главного меню, приветственных экранов и мини-приложений.
🖥️ **Умный мониторинг**
- 💚 Контроль доступности Remnawave панели в реальном времени
- 🔄 Автоматическая синхронизация данных и реконнект при ошибках
- 🌐 Управление сквадами с актуальным статусом и массовыми действиями
- 🚧 Автоматический режим тех. работ с уведомлениями пользователей
- 📋 Логи и диагностика, включая журнал сбоев и действий бота
- 📦 Проверка обновлений проекта и уведомления о новых релизах
🛟 **Поддержка и модерация**
- 🎫 Центр тикетов с приоритетами, статусами и перепиской.
- 🧑‍⚖️ Разграничение ролей (админы, модераторы), журнал аудита действий.
- ⏱️ SLA таймеры, автоматические напоминания и уведомления в канал.
- 🚫 Массовые блокировки нарушителей и автоматическое снятие блокировок.
- 🧾 История диалогов, прикреплённые файлы и быстрые ответы.
📨 **Коммуникации и поддержка**
- 📢 Рассылки по сегментам и мгновенные оповещения
- 🔔 Автоуведомления о продлении, задолженностях и автоплатежах
- 💬 Система поддержки с HTML разметкой и история обращений
- 📝 Настройка правил сервиса, FAQ и приветственных экранов
- 🧪 Настраиваемое приветственное сообщение с предложением активации триала
🔔 **Уведомления и коммуникации**
- 📢 Топики для событий (покупки, триалы, техработы, ошибки интеграций).
- 🔔 Настройка пользовательских и админских уведомлений, расписаний и каналов.
- 📨 Шаблоны правил, оферты, FAQ, приветствий и страницы поддержки.
- 💬 Автоматические сообщения о задолженностях, автоплатежах и продлениях.
📨 **Уведомления в закрытый канал**
- 🎯 Активация триала, продления и конверсии в платную подписку
- 💎 Покупка подписки и пополнение баланса
- 🔄 Изменения параметров подписки пользователем
- 🚧 Потеря соединения с Remnawave и включение техработ
- 🗄️ Авто- и ручные бекапы/восстановления с отправкой файлов
- ♻️ Выхлоп новых версий бота и результаты автоплатежей
🧰 **Обслуживание и DevOps**
- 🛠️ `install_bot.sh`: управление контейнерами, логами, обновлениями, прокси и резервными копиями.
- 🚧 Ручной и авто-режим техработ с кастомными сообщениями.
- 🗒️ Просмотр системных логов, health-check, мониторинг Remnawave и серверов.
- ♻️ Проверка обновлений репозитория, уведомления о новых версиях и плавный деплой.
🗄️ **Бекапы и восстановление**
- Ручной запуск бекапа с выбором содержимого (включая логи)
- Автоматические бекапы по расписанию и управление retention-политикой
- Восстановление из бекапа без остановки сервиса
- Отправка копии бекапа в выделенный чат/топик и ведение метаданных
- 🗓️ Планировщик авто-бекапов, гибкая политика хранения и компрессия.
- 📦 Ручные бекапы с выбором содержимого (БД, конфиги, логи).
- 📤 Отправка архивов в выделенный чат/топик, журнал попыток и статусов.
- 🔁 Восстановление из бекапа без остановки бота, проверка целостности.
💳 **Автоплатежи и биллинг**
- Настройки автоплатежа на уровне пользователя (вкл/выкл, дни до списания)
- Принудительная проверка готовности автосписаний
- Уведомления об успешных и неудачных автоплатежах с подсказками действий
- Настройка минимального баланса и логирование всех списаний
💳 **Биллинг и автоплатежи**
- ⚙️ Глобальные настройки автосписаний, минимального баланса и напоминаний.
- 🧪 Тестовые платежи для каждого провайдера прямо из админки.
- 🪝 Управление вебхуками Tribute, YooKassa, CryptoBot, MulenPay и PayPalych.
- 🧾 Экспорт транзакций, сверка с платёжками и интеграция с бухгалтерией.
</td>
</tr>
@@ -1065,6 +1071,16 @@ WEBHOOK_PATH=/webhook
- 📦 **Интеграция с Remnawave API** — автоматическое создание пользователей, управление сквадами и синхронизация подписок.
- 🧾 **История операций** — хранение транзакций, уведомлений, рассылок, кампаний и бекапов для аудита.
### 🌐 Веб-API, мини-приложение и интеграции
- ⚙️ **FastAPI Web API** (`app/webapi`) с эндпоинтами для управления токенами, конфигурациями, рассылками, кампаниями, промогруппами, статистикой, подписками, транзакциями, тикетами и бекапами.
- 🔑 **Управление API-ключами** — выпуск, отзыв, реактивация и аудит токенов прямо из админки.
- 🛡️ **Гибкая авторизация** — API-key, Bearer, Basic Auth и cookie eGames для совместимости с внешними панелями.
- 🛰️ **Mini App** — статический фронтенд в `miniapp/` и proxied эндпоинты `/miniapp/*` для отображения статуса подписки внутри Telegram.
- 🧭 **App Config** — централизованная раздача ссылок на клиенты и инструкции (`app-config.json`, `miniapp/app-config.json`).
- 🪝 **Платёжные вебхуки** — встроенные Flask-серверы для Tribute, YooKassa, CryptoBot, MulenPay и PayPalych (Pal24) с health-check и логированием.
- 📡 **Мониторинг серверов** — REST-эндпоинты для просмотра нод Remnawave, статистики нагрузки и управления сквадами из внешних систем.
### 🧭 Навигация по проекту
- `app/bot.py` — точка входа бота и регистрация middlewares/handlers.
@@ -1350,121 +1366,6 @@ ADMIN_NOTIFICATIONS_TOPIC_ID=123 # ID топика (опционал
- **🔗 SQLAlchemy ORM** - безопасная работа с БД
- **🚀 aiogram 3** - современная Telegram Bot API
### 📁 Структура проекта
```
bedolaga_bot/
├── 🎯 main.py # Точка входа
├── 📦 requirements.txt # Зависимости
├── ⚙️ .env.example # Конфиг
├── ⚙️ app-config.json # Информация для гайда подключения
├── 📱 app/
│ ├── 🤖 bot.py # Инициализация бота
│ ├── ⚙️ config.py # Настройки
│ ├── 🎛️ states.py # FSM состояния
│ │
│ ├── 🎮 handlers/ # Обработчики событий
│ │ ├── 🏠 start.py # Регистрация и старт
│ │ ├── 🛒 subscription.py # Подписки
│ │ ├── 💰 balance.py # Баланс и платежи
│ │ ├── 🎁 promocode.py # Промокоды
│ │ ├── 👥 referral.py # Реферальная система
│ │ ├── 🌟 stars_payment.py # Start платежи
│ │ ├── common.py
│ │ ├── 💬 support.py # Техподдержка
│ │ └── 👑 admin/ # Админ панель
│ │ ├── 📊 statistics.py # Статистика
│ │ ├── 🗄️ backup.py # Бекапы
│ │ ├── 👥 users.py # Управление юзерами
│ │ ├── 🎫 promocodes.py # Управление промокодами
│ │ ├── 🚧 maintenance.py # Тех работы
│ │ ├── 📨 messages.py # Рассылки
│ │ ├── 📨 user_messages.py # Рандомные сообщения в меню
│ │ ├── 📨 welcome_text.py # Приветственное сообщение
│ │ ├── ⚙️ main.py # Админское меню
│ │ ├── 📖 rules.py # Правила
│ │ ├── 🙋 referrals.py # Правила
│ │ ├── 🌎 servers.py # Сервера
│ │ ├── 📱 subscriptions.py # Подписки
│ │ ├── 🔍 monitoring.py # Мониторинг
│ │ └── 🔗 remnawave.py # Система Remnawave
│ │
│ ├── 🗄️ database/ # База данных
│ │ ├── 📊 models.py # Модели SQLAlchemy
│ │ ├── 🔗 database.py # Подключение к БД
│ │ ├── 🔄 universal_migration.py # Миграции
│ │ └── 📝 crud/ # CRUD операции
│ │ ├── 👤 user.py # Операции с пользователями
│ │ ├── 📋 subscription.py # Операции с подписками
│ │ ├── 💰 transaction.py # Операции с транзакциями
│ │ ├── 📜 rules.py # Правила сервиса
│ │ ├── 📜 subscription_conversion.py # Правила сервиса
│ │ ├── 💳 yookassa.py # YooKassa операции
│ │ ├── 📨 welcome_text.py # Приветственное сообщение
│ │ ├── 💳 cryptobot.py # CryptoBot операции
│ │ ├── 🌐 server_squad.py # Серверы и сквады
│ │ ├── 🎁 promocode.py # Промокоды
│ │ └── 👥 referral.py # Партнерка
│ │
│ ├── 🔧 services/ # Бизнес-логика
│ │ ├── 👤 user_service.py # Сервис пользователей
│ │ ├── 📋 subscription_service.py # Сервис подписок
│ │ ├── 💰 payment_service.py # Платежи
│ │ ├── 🗄️ backup_service.py # Бекапы
│ │ ├── 🎁 promocode_service.py # Промокоды
│ │ ├── 🚧 maintenance_service.py # Промокоды
│ │ ├── 👥 referral_service.py # Партнерка
│ │ ├── 💬 admin_notification_service.py # Уведомления для администраторов в чаты
│ │ ├── 🔍 monitoring_service.py # Мониторинг
│ │ ├── ♻️ version_service.py # Проверка версий бота
│ │ ├── 🎖️ tribute_service.py # Tribute платежи
│ │ ├── 💳 yookassa_service.py # YooKassa платежи
│ │ └── 🌐 remnawave_service.py # Интеграция с Remnawave
│ │
│ ├── 🛠️ utils/ # Утилиты
│ │ ├── 🎨 decorators.py # Декораторы
│ │ ├── 📝 formatters.py # Форматирование данных
│ │ ├── ✅ validators.py # Валидация
│ │ ├── ✅ subscription_utils.py # Проверка подписок
│ │ ├── 📄 pagination.py # Пагинация
│ │ ├── 📄 pricing_utils.py # Цены
│ │ ├── 📄 message_patch.py
│ │ ├── 📄 photo_message.py
│ │ ├── ‼️ global_error.py # Обработка ошибок
│ │ ├── 👤 user_utils.py # Утилиты для пользователей
│ │ ├── 🫰 currency_converter.py # Курсы для CryptoBota
│ │ └── ⚡ cache.py # Кеширование
│ │
│ ├── 🛡️ middlewares/ # Middleware
│ │ ├── 🔐 auth.py # Авторизация
│ │ ├── 📋 logging.py # Логирование
│ │ ├── 🚧 maintenance.py # тех работы
│ │ ├── 🔐 subscription_checker.py # тех работы
│ │ ├── 🔐 channel_checker.py
│ │ └── ⏱️ throttling.py # Ограничение запросов
│ │
│ ├── 🌐 localization/ # Локализация
│ │ ├── 📝 texts.py # Тексты интерфейса
│ │ └── 🗣️ languages/
│ │
│ ├── ⌨️ keyboards/ # Клавиатуры
│ │ ├── 🔗 inline.py # Inline клавиатуры
│ │ ├── 💬 reply.py # Reply клавиатуры
│ │ └── 👑 admin.py # Админские клавиатуры
│ │
│ └── 🔌 external/ # Внешние API
│ ├── 🌐 remnawave_api.py # Remnawave API
│ ├── ⭐ telegram_stars.py # Telegram Stars
│ ├── 💳 yookassa_webhook.py # YooKassa webhook
│ ├── 🌐 webhook_server.py # Webhook сервер
│ ├── 💳 cryptobot.py # CryptoBot Api
│ └── 🎖️ tribute.py # Tribute платежи
├── 🔄 migrations/ # Миграции БД
└── 📋 logs/ # Логи системы
```
---
## 🐛 Устранение неполадок
@@ -1708,62 +1609,146 @@ REMNAWAVE_SECRET_KEY=XXXXXXX:DDDDDDDD
<tr>
<td>🥇</td>
<td><strong>@SmartSystemCompany</strong></td>
<td>₽8,500</td>
<td>За щедрую поддержку и вклад в развитие</td>
</tr>
<tr>
<td>🥈</td>
<td><strong>@pilot_737800</strong></td>
<td>₽4,750</td>
<td>₽7,750</td>
<td>За веру в проект с самого начала</td>
</tr>
<tr>
<td>🥈</td>
<td><strong>@Legacyyy777</strong></td>
<td>₽2,600</td>
<td>За ценные предложения по улучшению</td>
<td><strong>@psych0O</strong></td>
<td>$60</td>
<td>За щедрую поддержку и вклад в развитие</td>
</tr>
<tr>
<td>🥉</td>
<td><strong>Илья (@ispanec_nn)</strong></td>
<td>$30</td>
<td>За активное тестирование и фидбек</td>
<td><strong>@Vldmrmtn</strong></td>
<td>₽5,000</td>
<td>За значительную поддержку проекта</td>
</tr>
<tr>
<td>4</td>
<td><strong>@k0tbtc</strong></td>
<td>₽3,000</td>
<td>За поддержку и доверие</td>
</tr>
<tr>
<td>5</td>
<td><strong>@Legacyyy777</strong></td>
<td>₽2,900</td>
<td>За ценные предложения по улучшению</td>
</tr>
<tr>
<td>6</td>
<td><strong>@sklvg</strong></td>
<td>₽3,000</td>
<td>За международную поддержку</td>
</tr>
<tr>
<td>7</td>
<td><strong>@bolgov0zero</strong></td>
<td>₽2,000</td>
<td>За поддержку и доверие</td>
</tr>
<tr>
<td>8</td>
<td><strong>@i_burjuy</strong></td>
<td>₽1,300</td>
<td>За активное участие в проекте</td>
</tr>
<tr>
<td>9</td>
<td><strong>@kr33njee</strong></td>
<td>₽1,550</td>
<td>За поддержку и доверие</td>
</tr>
<tr>
<td>10</td>
<td><strong>@Nav1_0</strong></td>
<td>₽2,000</td>
<td>За поддержку и доверие</td>
</tr>
<tr>
<td>11</td>
<td><strong>@vitos_7771997</strong></td>
<td>₽1,500</td>
<td>За поддержку и доверие</td>
</tr>
<tr>
<td>12</td>
<td><strong>@haxonate</strong></td>
<td>₽1,500</td>
<td>За поддержку и доверие</td>
</tr>
<tr>
<td>13</td>
<td><strong>@fso404</strong></td>
<td>₽1,000</td>
<td>За поддержку и доверие</td>
</tr>
<tr>
<td>5</td>
<td>14</td>
<td><strong>@edward_forix</strong></td>
<td>₽1,000</td>
<td>За поддержку и доверие</td>
</tr>
<tr>
<td>5</td>
<td><strong>@Nav1_0</strong></td>
<td>₽1,000</td>
<td>За поддержку и доверие</td>
<td>15</td>
<td><strong>@Илья (@ispanec_nn)</strong></td>
<td>$30</td>
<td>За активное тестирование и фидбек</td>
</tr>
<tr>
<td>6</td>
<td><strong>@kr33njee</strong></td>
<td>₽800</td>
<td>За поддержку и доверие</td>
<td>16</td>
<td><strong>@DonMatteoRU</strong></td>
<td>₽500</td>
<td>За участие в развитии</td>
</tr>
<tr>
<td>7</td>
<td><strong>@SmartSystemCompany</strong></td>
<td>₽600</td>
<td>За поддержку и доверие</td>
<td>17</td>
<td><strong>@pedzeo</strong></td>
<td>₽500</td>
<td>За участие в развитии</td>
</tr>
<tr>
<td>8</td>
<td>18</td>
<td><strong>@suzumuj</strong></td>
<td>₽400</td>
<td>За участие в развитии</td>
</tr>
<tr>
<td>19</td>
<td><strong>@andrey_93rus</strong></td>
<td>₽300</td>
<td>За участие в развитии</td>
</tr>
<tr>
<td>20</td>
<td><strong>@PhiLin58</strong></td>
<td>₽300</td>
<td>За участие в развитии</td>
+39 -3
View File
@@ -13,8 +13,9 @@ from pathlib import Path
class Settings(BaseSettings):
BOT_TOKEN: str
BOT_USERNAME: Optional[str] = None
ADMIN_IDS: str = ""
SUPPORT_USERNAME: str = "@support"
SUPPORT_MENU_ENABLED: bool = True
@@ -527,7 +528,14 @@ class Settings(BaseSettings):
def get_trial_warning_hours(self) -> int:
return self.TRIAL_WARNING_HOURS
def get_bot_username(self) -> Optional[str]:
username = getattr(self, "BOT_USERNAME", None)
if not username:
return None
normalized = str(username).strip().lstrip("@")
return normalized or None
def is_notifications_enabled(self) -> bool:
return self.ENABLE_NOTIFICATIONS
@@ -837,14 +845,42 @@ class Settings(BaseSettings):
return (self.BACKUP_SEND_ENABLED and
self.get_backup_send_chat_id() is not None)
def get_referred_user_reward_kopeks(self) -> int:
"""Return the referred user reward normalized to kopeks.
Historically the value was stored in kopeks, however some
installations provide it in rubles. To keep backward compatibility we
treat any value greater than or equal to one thousand as already being
in kopeks (≥ 10 ₽). Smaller positive values are assumed to be provided
in rubles and therefore converted to kopeks.
"""
raw_value = getattr(self, "REFERRED_USER_REWARD", 0)
try:
value = int(raw_value)
except (TypeError, ValueError):
return 0
if value <= 0:
return 0
if value >= 1000:
return value
return value * 100
def get_referral_settings(self) -> Dict:
referred_reward_kopeks = self.get_referred_user_reward_kopeks()
return {
"minimum_topup_kopeks": self.REFERRAL_MINIMUM_TOPUP_KOPEKS,
"first_topup_bonus_kopeks": self.REFERRAL_FIRST_TOPUP_BONUS_KOPEKS,
"inviter_bonus_kopeks": self.REFERRAL_INVITER_BONUS_KOPEKS,
"commission_percent": self.REFERRAL_COMMISSION_PERCENT,
"notifications_enabled": self.REFERRAL_NOTIFICATIONS_ENABLED,
"referred_user_reward": self.REFERRED_USER_REWARD
"referred_user_reward": referred_reward_kopeks,
"referred_user_reward_kopeks": referred_reward_kopeks,
}
def is_referral_notifications_enabled(self) -> bool:
+25
View File
@@ -110,6 +110,31 @@ async def list_discount_offers(
return result.scalars().all()
async def list_active_discount_offers_for_user(
db: AsyncSession,
user_id: int,
) -> List[DiscountOffer]:
"""Return active (not yet claimed) offers for a user."""
now = datetime.utcnow()
stmt = (
select(DiscountOffer)
.options(
selectinload(DiscountOffer.user),
selectinload(DiscountOffer.subscription),
)
.where(
DiscountOffer.user_id == user_id,
DiscountOffer.is_active == True, # noqa: E712
DiscountOffer.expires_at > now,
)
.order_by(DiscountOffer.expires_at.asc())
)
result = await db.execute(stmt)
return result.scalars().all()
async def count_discount_offers(
db: AsyncSession,
*,
+1 -1
View File
@@ -279,7 +279,7 @@ def _get_group_status(group_key: str) -> Tuple[str, str]:
settings.REFERRAL_COMMISSION_PERCENT
or settings.REFERRAL_FIRST_TOPUP_BONUS_KOPEKS
or settings.REFERRAL_INVITER_BONUS_KOPEKS
or settings.REFERRED_USER_REWARD
or settings.get_referred_user_reward_kopeks()
)
return ("🟢", "Программа активна") if active else ("", "Бонусы не заданы")
+3 -3
View File
@@ -68,7 +68,7 @@ async def show_referral_statistics(
- Минимальное пополнение: {settings.format_price(settings.REFERRAL_MINIMUM_TOPUP_KOPEKS)}
- Бонус за первое пополнение: {settings.format_price(settings.REFERRAL_FIRST_TOPUP_BONUS_KOPEKS)}
- Бонус пригласившему: {settings.format_price(settings.REFERRAL_INVITER_BONUS_KOPEKS)}
- Бонус новому пользователю: {settings.format_price(settings.REFERRED_USER_REWARD)}
- Бонус новому пользователю: {settings.format_price(settings.get_referred_user_reward_kopeks())}
- Комиссия с покупок: {settings.REFERRAL_COMMISSION_PERCENT}%
- Уведомления: {'✅ Включены' if settings.REFERRAL_NOTIFICATIONS_ENABLED else '❌ Отключены'}
@@ -105,7 +105,7 @@ async def show_referral_statistics(
- Минимальное пополнение: {settings.format_price(settings.REFERRAL_MINIMUM_TOPUP_KOPEKS)}
- Бонус за первое пополнение: {settings.format_price(settings.REFERRAL_FIRST_TOPUP_BONUS_KOPEKS)}
- Бонус пригласившему: {settings.format_price(settings.REFERRAL_INVITER_BONUS_KOPEKS)}
- Бонус новому пользователю: {settings.format_price(settings.REFERRED_USER_REWARD)}
- Бонус новому пользователю: {settings.format_price(settings.get_referred_user_reward_kopeks())}
- Комиссия с покупок: {settings.REFERRAL_COMMISSION_PERCENT}%
<i>🕐 Время: {current_time}</i>
@@ -190,7 +190,7 @@ async def show_referral_settings(
Минимальная сумма пополнения для участия: {settings.format_price(settings.REFERRAL_MINIMUM_TOPUP_KOPEKS)}
Бонус за первое пополнение реферала: {settings.format_price(settings.REFERRAL_FIRST_TOPUP_BONUS_KOPEKS)}
Бонус пригласившему за первое пополнение: {settings.format_price(settings.REFERRAL_INVITER_BONUS_KOPEKS)}
Бонус новому пользователю при регистрации: {settings.format_price(settings.REFERRED_USER_REWARD)}
Бонус новому пользователю при регистрации: {settings.format_price(settings.get_referred_user_reward_kopeks())}
<b>Комиссионные:</b>
Процент с каждой покупки реферала: {settings.REFERRAL_COMMISSION_PERCENT}%
File diff suppressed because it is too large Load Diff
+194
View File
@@ -34,11 +34,34 @@ class MiniAppSubscriptionUser(BaseModel):
traffic_limit_label: str
lifetime_used_traffic_gb: float = 0.0
has_active_subscription: bool = False
promo_offer_discount_percent: int = 0
promo_offer_discount_expires_at: Optional[datetime] = None
promo_offer_discount_source: Optional[str] = None
class MiniAppPromoGroup(BaseModel):
id: int
name: str
server_discount_percent: int = 0
traffic_discount_percent: int = 0
device_discount_percent: int = 0
period_discounts: Dict[int, int] = Field(default_factory=dict)
apply_discounts_to_addons: bool = True
class MiniAppAutoPromoGroupLevel(BaseModel):
id: int
name: str
threshold_kopeks: int
threshold_rubles: float
threshold_label: str
is_reached: bool = False
is_current: bool = False
server_discount_percent: int = 0
traffic_discount_percent: int = 0
device_discount_percent: int = 0
period_discounts: Dict[int, int] = Field(default_factory=dict)
apply_discounts_to_addons: bool = True
class MiniAppConnectedServer(BaseModel):
@@ -47,6 +70,7 @@ class MiniAppConnectedServer(BaseModel):
class MiniAppDevice(BaseModel):
hwid: Optional[str] = None
platform: Optional[str] = None
device_model: Optional[str] = None
app_version: Optional[str] = None
@@ -54,6 +78,16 @@ class MiniAppDevice(BaseModel):
last_ip: Optional[str] = None
class MiniAppDeviceRemovalRequest(BaseModel):
init_data: str = Field(..., alias="initData")
hwid: str
class MiniAppDeviceRemovalResponse(BaseModel):
success: bool = True
message: Optional[str] = None
class MiniAppTransaction(BaseModel):
id: int
type: str
@@ -67,6 +101,158 @@ class MiniAppTransaction(BaseModel):
completed_at: Optional[datetime] = None
class MiniAppPromoOffer(BaseModel):
id: int
status: str
notification_type: Optional[str] = None
offer_type: Optional[str] = None
effect_type: Optional[str] = None
discount_percent: int = 0
bonus_amount_kopeks: int = 0
bonus_amount_label: Optional[str] = None
expires_at: Optional[datetime] = None
claimed_at: Optional[datetime] = None
is_active: bool = False
template_id: Optional[int] = None
template_name: Optional[str] = None
button_text: Optional[str] = None
title: Optional[str] = None
message_text: Optional[str] = None
icon: Optional[str] = None
test_squads: List[MiniAppConnectedServer] = Field(default_factory=list)
active_discount_expires_at: Optional[datetime] = None
active_discount_started_at: Optional[datetime] = None
active_discount_duration_seconds: Optional[int] = None
class MiniAppPromoOfferClaimRequest(BaseModel):
init_data: str = Field(..., alias="initData")
class MiniAppPromoOfferClaimResponse(BaseModel):
success: bool = True
code: Optional[str] = None
class MiniAppPromoCode(BaseModel):
code: str
type: Optional[str] = None
balance_bonus_kopeks: int = 0
subscription_days: int = 0
max_uses: Optional[int] = None
current_uses: Optional[int] = None
valid_until: Optional[datetime] = None
class MiniAppPromoCodeActivationRequest(BaseModel):
init_data: str = Field(..., alias="initData")
code: str
class MiniAppPromoCodeActivationResponse(BaseModel):
success: bool = True
description: Optional[str] = None
promocode: Optional[MiniAppPromoCode] = None
class MiniAppFaqItem(BaseModel):
id: int
title: Optional[str] = None
content: Optional[str] = None
display_order: Optional[int] = None
class MiniAppFaq(BaseModel):
requested_language: str
language: str
is_enabled: bool = True
total: int = 0
items: List[MiniAppFaqItem] = Field(default_factory=list)
class MiniAppRichTextDocument(BaseModel):
requested_language: str
language: str
title: Optional[str] = None
is_enabled: bool = True
content: str = ""
created_at: Optional[datetime] = None
updated_at: Optional[datetime] = None
class MiniAppLegalDocuments(BaseModel):
public_offer: Optional[MiniAppRichTextDocument] = None
service_rules: Optional[MiniAppRichTextDocument] = None
privacy_policy: Optional[MiniAppRichTextDocument] = None
class MiniAppReferralTerms(BaseModel):
minimum_topup_kopeks: int = 0
minimum_topup_label: Optional[str] = None
first_topup_bonus_kopeks: int = 0
first_topup_bonus_label: Optional[str] = None
inviter_bonus_kopeks: int = 0
inviter_bonus_label: Optional[str] = None
commission_percent: float = 0.0
referred_user_reward_kopeks: int = 0
referred_user_reward_label: Optional[str] = None
class MiniAppReferralStats(BaseModel):
invited_count: int = 0
paid_referrals_count: int = 0
active_referrals_count: int = 0
total_earned_kopeks: int = 0
total_earned_label: Optional[str] = None
month_earned_kopeks: int = 0
month_earned_label: Optional[str] = None
conversion_rate: float = 0.0
class MiniAppReferralRecentEarning(BaseModel):
amount_kopeks: int = 0
amount_label: Optional[str] = None
reason: Optional[str] = None
referral_name: Optional[str] = None
created_at: Optional[datetime] = None
class MiniAppReferralItem(BaseModel):
id: int
telegram_id: Optional[int] = None
full_name: Optional[str] = None
username: Optional[str] = None
created_at: Optional[datetime] = None
last_activity: Optional[datetime] = None
has_made_first_topup: bool = False
balance_kopeks: int = 0
balance_label: Optional[str] = None
total_earned_kopeks: int = 0
total_earned_label: Optional[str] = None
topups_count: int = 0
days_since_registration: Optional[int] = None
days_since_activity: Optional[int] = None
status: Optional[str] = None
class MiniAppReferralList(BaseModel):
total_count: int = 0
has_next: bool = False
has_prev: bool = False
current_page: int = 1
total_pages: int = 1
items: List[MiniAppReferralItem] = Field(default_factory=list)
class MiniAppReferralInfo(BaseModel):
referral_code: Optional[str] = None
referral_link: Optional[str] = None
terms: Optional[MiniAppReferralTerms] = None
stats: Optional[MiniAppReferralStats] = None
recent_earnings: List[MiniAppReferralRecentEarning] = Field(default_factory=list)
referrals: Optional[MiniAppReferralList] = None
class MiniAppSubscriptionResponse(BaseModel):
success: bool = True
subscription_id: int
@@ -89,8 +275,16 @@ class MiniAppSubscriptionResponse(BaseModel):
balance_rubles: float = 0.0
balance_currency: Optional[str] = None
transactions: List[MiniAppTransaction] = Field(default_factory=list)
promo_offers: List[MiniAppPromoOffer] = Field(default_factory=list)
promo_group: Optional[MiniAppPromoGroup] = None
auto_assign_promo_groups: List[MiniAppAutoPromoGroupLevel] = Field(default_factory=list)
total_spent_kopeks: int = 0
total_spent_rubles: float = 0.0
total_spent_label: Optional[str] = None
subscription_type: str
autopay_enabled: bool = False
branding: Optional[MiniAppBranding] = None
faq: Optional[MiniAppFaq] = None
legal_documents: Optional[MiniAppLegalDocuments] = None
referral: Optional[MiniAppReferralInfo] = None
+3953 -99
View File
File diff suppressed because it is too large Load Diff