diff --git a/.env.example b/.env.example index 7a2111d6..3a8bfbcc 100644 --- a/.env.example +++ b/.env.example @@ -136,6 +136,7 @@ TRAFFIC_PACKAGES_CONFIG="5:2000:false,10:3500:false,25:7000:false,50:11000:true, PRICE_PER_DEVICE=5000 # ===== РЕФЕРАЛЬНАЯ СИСТЕМА ===== +REFERRAL_PROGRAM_ENABLED=true REFERRAL_MINIMUM_TOPUP_KOPEKS=10000 REFERRAL_FIRST_TOPUP_BONUS_KOPEKS=10000 REFERRAL_INVITER_BONUS_KOPEKS=10000 diff --git a/app/config.py b/app/config.py index a7e80bba..804dade9 100644 --- a/app/config.py +++ b/app/config.py @@ -134,6 +134,7 @@ class Settings(BaseSettings): REFERRAL_INVITER_BONUS_KOPEKS: int = 10000 REFERRAL_COMMISSION_PERCENT: int = 25 + REFERRAL_PROGRAM_ENABLED: bool = True REFERRAL_NOTIFICATIONS_ENABLED: bool = True REFERRAL_NOTIFICATION_RETRY_ATTEMPTS: int = 3 REFERRED_USER_REWARD: int = 0 @@ -950,6 +951,7 @@ class Settings(BaseSettings): referred_reward_kopeks = self.get_referred_user_reward_kopeks() return { + "program_enabled": self.is_referral_program_enabled(), "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, @@ -959,6 +961,9 @@ class Settings(BaseSettings): "referred_user_reward_kopeks": referred_reward_kopeks, } + def is_referral_program_enabled(self) -> bool: + return bool(self.REFERRAL_PROGRAM_ENABLED) + def is_referral_notifications_enabled(self) -> bool: return self.REFERRAL_NOTIFICATIONS_ENABLED diff --git a/app/keyboards/inline.py b/app/keyboards/inline.py index 81a222c0..62a1fd5f 100644 --- a/app/keyboards/inline.py +++ b/app/keyboards/inline.py @@ -356,12 +356,18 @@ def get_main_menu_keyboard( if isinstance(button, InlineKeyboardButton): keyboard.append([button]) - keyboard.extend([ - [ - InlineKeyboardButton(text=texts.MENU_PROMOCODE, callback_data="menu_promocode"), + # Добавляем кнопки промокода и рефералов, учитывая настройки + additional_buttons = [ + InlineKeyboardButton(text=texts.MENU_PROMOCODE, callback_data="menu_promocode") + ] + + # Добавляем кнопку рефералов только если программа включена + if settings.is_referral_program_enabled(): + additional_buttons.append( InlineKeyboardButton(text=texts.MENU_REFERRALS, callback_data="menu_referrals") - ] - ]) + ) + + keyboard.append(additional_buttons) # Support button is configurable (runtime via service) try: diff --git a/app/keyboards/reply.py b/app/keyboards/reply.py index b0331f45..e7ae263c 100644 --- a/app/keyboards/reply.py +++ b/app/keyboards/reply.py @@ -2,26 +2,35 @@ from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemo from typing import List from app.localization.texts import get_texts +from app.config import settings def get_main_reply_keyboard(language: str = "ru") -> ReplyKeyboardMarkup: texts = get_texts(language) + keyboard = [ + [ + KeyboardButton(text=texts.MENU_BALANCE), + KeyboardButton(text=texts.MENU_SUBSCRIPTION) + ] + ] + + # Добавляем кнопки промокода и рефералов, учитывая настройки + second_row = [KeyboardButton(text=texts.MENU_PROMOCODE)] + + # Добавляем кнопку рефералов только если программа включена + if settings.is_referral_program_enabled(): + second_row.append(KeyboardButton(text=texts.MENU_REFERRALS)) + + keyboard.append(second_row) + + keyboard.append([ + KeyboardButton(text=texts.MENU_SUPPORT), + KeyboardButton(text=texts.MENU_RULES) + ]) + return ReplyKeyboardMarkup( - keyboard=[ - [ - KeyboardButton(text=texts.MENU_BALANCE), - KeyboardButton(text=texts.MENU_SUBSCRIPTION) - ], - [ - KeyboardButton(text=texts.MENU_PROMOCODE), - KeyboardButton(text=texts.MENU_REFERRALS) - ], - [ - KeyboardButton(text=texts.MENU_SUPPORT), - KeyboardButton(text=texts.MENU_RULES) - ] - ], + keyboard=keyboard, resize_keyboard=True, one_time_keyboard=False ) diff --git a/app/services/main_menu_button_service.py b/app/services/main_menu_button_service.py index 70fa2543..5793fa32 100644 --- a/app/services/main_menu_button_service.py +++ b/app/services/main_menu_button_service.py @@ -14,6 +14,7 @@ from app.database.models import ( MainMenuButtonActionType, MainMenuButtonVisibility, ) +from app.config import settings @dataclass(frozen=True) @@ -105,6 +106,19 @@ class MainMenuButtonService: if item.visibility == MainMenuButtonVisibility.SUBSCRIBERS and not has_subscription: continue + # Проверка реферальной программы: скрыть кнопки, связанные с рефералами, если программа отключена + if ( + not settings.is_referral_program_enabled() + and ( + "partner" in item.text.lower() + or "referr" in item.text.lower() + or "партнер" in item.text.lower() + or "реферал" in item.text.lower() + or "referral" in item.action_value.lower() + ) + ): + continue + button = cls._build_button(item) if button: buttons.append(button) diff --git a/docs/referral_program_setting.md b/docs/referral_program_setting.md new file mode 100644 index 00000000..5876d574 --- /dev/null +++ b/docs/referral_program_setting.md @@ -0,0 +1,29 @@ +# Включение/отключение реферальной программы + +## Описание +Добавлена возможность включать и отключать реферальную программу (партнерку) через переменную окружения. + +## Настройка +В файле `.env` установите значение переменной: + +- `REFERRAL_PROGRAM_ENABLED=true` - реферальная программа включена +- `REFERRAL_PROGRAM_ENABLED=false` - реферальная программа отключена + +## Поведение +- При отключенной программе кнопки "Партнерка", "Рефералы" и другие связанные элементы скрываются из главного меню бота +- Обычные (не реферальные) кнопки продолжают отображаться независимо от настройки +- Административные функции реферальной программы остаются доступными в админ-панели для управления +- Настройка также учитывается в API и других сервисах, использующих информацию о реферальной программе + +## Примеры скрываемых элементов +- Кнопка "🤝 Партнерка" в главном меню +- Кнопка "👥 Мои рефералы" +- Кнопка "🤝 Referral program" (английская версия) +- Другие элементы, содержащие слова "partner", "referr", "партнер", "реферал" + +## Технические детали +- Новая переменная `REFERRAL_PROGRAM_ENABLED` добавлена в `app/config.py` +- Метод `is_referral_program_enabled()` проверяет состояние настройки +- Функция `get_main_menu_keyboard` в `app/keyboards/inline.py` скрывает кнопку "Партнерка" при отключенной программе +- Сервис `MainMenuButtonService` в `app/services/main_menu_button_service.py` скрывает дополнительные кнопки, связанные с рефералами +- Обновлен файл `.env.example` с новой настройкой \ No newline at end of file