Add toggle for support top-ups

This commit is contained in:
Egor
2025-11-24 08:17:23 +03:00
parent 1ba566f30f
commit 9d3f096be0
8 changed files with 87 additions and 21 deletions

View File

@@ -253,6 +253,8 @@ YOOKASSA_QUICK_AMOUNT_SELECTION_ENABLED=true
# Отключить отображение кнопок выбора суммы пополнения (оставить только ввод вручную) # Отключить отображение кнопок выбора суммы пополнения (оставить только ввод вручную)
DISABLE_TOPUP_BUTTONS=false DISABLE_TOPUP_BUTTONS=false
# Отключить пополнение баланса через поддержку
SUPPORT_TOPUP_ENABLED=true
# Автоматическая проверка зависших пополнений и повторные обращения к провайдерам # Автоматическая проверка зависших пополнений и повторные обращения к провайдерам
PAYMENT_VERIFICATION_AUTO_CHECK_ENABLED=false PAYMENT_VERIFICATION_AUTO_CHECK_ENABLED=false

View File

@@ -194,6 +194,7 @@ class Settings(BaseSettings):
YOOKASSA_MAX_AMOUNT_KOPEKS: int = 1000000 YOOKASSA_MAX_AMOUNT_KOPEKS: int = 1000000
YOOKASSA_QUICK_AMOUNT_SELECTION_ENABLED: bool = False YOOKASSA_QUICK_AMOUNT_SELECTION_ENABLED: bool = False
DISABLE_TOPUP_BUTTONS: bool = False DISABLE_TOPUP_BUTTONS: bool = False
SUPPORT_TOPUP_ENABLED: bool = True
PAYMENT_VERIFICATION_AUTO_CHECK_ENABLED: bool = False PAYMENT_VERIFICATION_AUTO_CHECK_ENABLED: bool = False
PAYMENT_VERIFICATION_AUTO_CHECK_INTERVAL_MINUTES: int = 10 PAYMENT_VERIFICATION_AUTO_CHECK_INTERVAL_MINUTES: int = 10
@@ -931,9 +932,12 @@ class Settings(BaseSettings):
return value return value
def is_yookassa_enabled(self) -> bool: def is_yookassa_enabled(self) -> bool:
return (self.YOOKASSA_ENABLED and return (self.YOOKASSA_ENABLED and
self.YOOKASSA_SHOP_ID is not None and self.YOOKASSA_SHOP_ID is not None and
self.YOOKASSA_SECRET_KEY is not None) self.YOOKASSA_SECRET_KEY is not None)
def is_support_topup_enabled(self) -> bool:
return bool(self.SUPPORT_TOPUP_ENABLED)
def get_yookassa_return_url(self) -> str: def get_yookassa_return_url(self) -> str:
if self.YOOKASSA_RETURN_URL: if self.YOOKASSA_RETURN_URL:

View File

@@ -421,7 +421,17 @@ async def request_support_topup(
db_user: User db_user: User
): ):
texts = get_texts(db_user.language) texts = get_texts(db_user.language)
if not settings.is_support_topup_enabled():
await callback.answer(
texts.t(
"SUPPORT_TOPUP_DISABLED",
"Пополнение через поддержку отключено. Попробуйте другой способ оплаты.",
),
show_alert=True,
)
return
support_text = f""" support_text = f"""
🛠️ <b>Пополнение через поддержку</b> 🛠️ <b>Пополнение через поддержку</b>

View File

@@ -758,6 +758,7 @@ def get_subscription_keyboard(
texts = get_texts(language) texts = get_texts(language)
keyboard = [] keyboard = []
has_direct_payment_methods = False
if has_subscription: if has_subscription:
subscription_link = get_display_subscription_link(subscription) if subscription else None subscription_link = get_display_subscription_link(subscription) if subscription else None
@@ -1146,6 +1147,7 @@ def get_balance_keyboard(language: str = DEFAULT_LANGUAGE) -> InlineKeyboardMark
def get_payment_methods_keyboard(amount_kopeks: int, language: str = DEFAULT_LANGUAGE) -> InlineKeyboardMarkup: def get_payment_methods_keyboard(amount_kopeks: int, language: str = DEFAULT_LANGUAGE) -> InlineKeyboardMarkup:
texts = get_texts(language) texts = get_texts(language)
keyboard = [] keyboard = []
has_direct_payment_methods = False
amount_kopeks = max(0, int(amount_kopeks or 0)) amount_kopeks = max(0, int(amount_kopeks or 0))
@@ -1161,6 +1163,7 @@ def get_payment_methods_keyboard(amount_kopeks: int, language: str = DEFAULT_LAN
callback_data=_build_callback("stars") callback_data=_build_callback("stars")
) )
]) ])
has_direct_payment_methods = True
if settings.is_yookassa_enabled(): if settings.is_yookassa_enabled():
if settings.YOOKASSA_SBP_ENABLED: if settings.YOOKASSA_SBP_ENABLED:
@@ -1170,6 +1173,7 @@ def get_payment_methods_keyboard(amount_kopeks: int, language: str = DEFAULT_LAN
callback_data=_build_callback("yookassa_sbp"), callback_data=_build_callback("yookassa_sbp"),
) )
]) ])
has_direct_payment_methods = True
keyboard.append([ keyboard.append([
InlineKeyboardButton( InlineKeyboardButton(
@@ -1177,6 +1181,7 @@ def get_payment_methods_keyboard(amount_kopeks: int, language: str = DEFAULT_LAN
callback_data=_build_callback("yookassa"), callback_data=_build_callback("yookassa"),
) )
]) ])
has_direct_payment_methods = True
if settings.TRIBUTE_ENABLED: if settings.TRIBUTE_ENABLED:
keyboard.append([ keyboard.append([
@@ -1185,6 +1190,7 @@ def get_payment_methods_keyboard(amount_kopeks: int, language: str = DEFAULT_LAN
callback_data=_build_callback("tribute") callback_data=_build_callback("tribute")
) )
]) ])
has_direct_payment_methods = True
if settings.is_mulenpay_enabled(): if settings.is_mulenpay_enabled():
mulenpay_name = settings.get_mulenpay_display_name() mulenpay_name = settings.get_mulenpay_display_name()
@@ -1197,6 +1203,7 @@ def get_payment_methods_keyboard(amount_kopeks: int, language: str = DEFAULT_LAN
callback_data=_build_callback("mulenpay") callback_data=_build_callback("mulenpay")
) )
]) ])
has_direct_payment_methods = True
if settings.is_wata_enabled(): if settings.is_wata_enabled():
keyboard.append([ keyboard.append([
@@ -1205,6 +1212,7 @@ def get_payment_methods_keyboard(amount_kopeks: int, language: str = DEFAULT_LAN
callback_data=_build_callback("wata") callback_data=_build_callback("wata")
) )
]) ])
has_direct_payment_methods = True
if settings.is_pal24_enabled(): if settings.is_pal24_enabled():
keyboard.append([ keyboard.append([
@@ -1213,6 +1221,7 @@ def get_payment_methods_keyboard(amount_kopeks: int, language: str = DEFAULT_LAN
callback_data=_build_callback("pal24") callback_data=_build_callback("pal24")
) )
]) ])
has_direct_payment_methods = True
if settings.is_platega_enabled() and settings.get_platega_active_methods(): if settings.is_platega_enabled() and settings.get_platega_active_methods():
keyboard.append([ keyboard.append([
@@ -1221,6 +1230,7 @@ def get_payment_methods_keyboard(amount_kopeks: int, language: str = DEFAULT_LAN
callback_data=_build_callback("platega"), callback_data=_build_callback("platega"),
) )
]) ])
has_direct_payment_methods = True
if settings.is_cryptobot_enabled(): if settings.is_cryptobot_enabled():
keyboard.append([ keyboard.append([
@@ -1229,6 +1239,7 @@ def get_payment_methods_keyboard(amount_kopeks: int, language: str = DEFAULT_LAN
callback_data=_build_callback("cryptobot") callback_data=_build_callback("cryptobot")
) )
]) ])
has_direct_payment_methods = True
if settings.is_heleket_enabled(): if settings.is_heleket_enabled():
keyboard.append([ keyboard.append([
@@ -1237,15 +1248,24 @@ def get_payment_methods_keyboard(amount_kopeks: int, language: str = DEFAULT_LAN
callback_data=_build_callback("heleket") callback_data=_build_callback("heleket")
) )
]) ])
has_direct_payment_methods = True
keyboard.append([ if settings.is_support_topup_enabled():
InlineKeyboardButton( keyboard.append([
text=texts.t("PAYMENT_VIA_SUPPORT", "🛠️ Через поддержку"), InlineKeyboardButton(
callback_data="topup_support" text=texts.t("PAYMENT_VIA_SUPPORT", "🛠️ Через поддержку"),
) callback_data="topup_support"
]) )
])
if len(keyboard) == 1: if not keyboard:
keyboard.append([
InlineKeyboardButton(
text=texts.t("PAYMENTS_TEMPORARILY_UNAVAILABLE", "⚠️ Способы оплаты временно недоступны"),
callback_data="payment_methods_unavailable"
)
])
elif not has_direct_payment_methods and settings.is_support_topup_enabled():
keyboard.insert(0, [ keyboard.insert(0, [
InlineKeyboardButton( InlineKeyboardButton(
text=texts.t("PAYMENTS_TEMPORARILY_UNAVAILABLE", "⚠️ Способы оплаты временно недоступны"), text=texts.t("PAYMENTS_TEMPORARILY_UNAVAILABLE", "⚠️ Способы оплаты временно недоступны"),

View File

@@ -32,3 +32,12 @@ RULES_TEXT: |
2. Do not distribute spam or malicious content. 2. Do not distribute spam or malicious content.
3. Respect other community members. 3. Respect other community members.
PAYMENT_METHODS_NONE_AVAILABLE: |
💳 <b>Balance top-up methods</b>
⚠️ Payment methods are temporarily unavailable.
Please try again later.
Choose a top-up option:
SUPPORT_TOPUP_DISABLED: "Top-ups via support are disabled. Please use another payment method."

View File

@@ -32,3 +32,12 @@ RULES_TEXT: |
2. Не распространяйте спам и вредоносный контент. 2. Не распространяйте спам и вредоносный контент.
3. Уважайте других пользователей. 3. Уважайте других пользователей.
PAYMENT_METHODS_NONE_AVAILABLE: |
💳 <b>Способы пополнения баланса</b>
⚠️ В данный момент способы оплаты временно недоступны.
Попробуйте позже.
Выберите способ пополнения:
SUPPORT_TOPUP_DISABLED: "Пополнение через поддержку отключено. Попробуйте другой способ оплаты."

View File

@@ -254,6 +254,7 @@ class BotConfigurationService:
"SIMPLE_SUBSCRIPTION_TRAFFIC_GB": "SIMPLE_SUBSCRIPTION", "SIMPLE_SUBSCRIPTION_TRAFFIC_GB": "SIMPLE_SUBSCRIPTION",
"SIMPLE_SUBSCRIPTION_SQUAD_UUID": "SIMPLE_SUBSCRIPTION", "SIMPLE_SUBSCRIPTION_SQUAD_UUID": "SIMPLE_SUBSCRIPTION",
"DISABLE_TOPUP_BUTTONS": "PAYMENT", "DISABLE_TOPUP_BUTTONS": "PAYMENT",
"SUPPORT_TOPUP_ENABLED": "PAYMENT",
"ENABLE_NOTIFICATIONS": "NOTIFICATIONS", "ENABLE_NOTIFICATIONS": "NOTIFICATIONS",
"NOTIFICATION_RETRY_ATTEMPTS": "NOTIFICATIONS", "NOTIFICATION_RETRY_ATTEMPTS": "NOTIFICATIONS",
"NOTIFICATION_CACHE_HOURS": "NOTIFICATIONS", "NOTIFICATION_CACHE_HOURS": "NOTIFICATIONS",

View File

@@ -100,14 +100,14 @@ def get_available_payment_methods() -> List[Dict[str, str]]:
"callback": "topup_platega", "callback": "topup_platega",
}) })
# Поддержка всегда доступна if settings.is_support_topup_enabled():
methods.append({ methods.append({
"id": "support", "id": "support",
"name": "Через поддержку", "name": "Через поддержку",
"icon": "🛠️", "icon": "🛠️",
"description": "другие способы", "description": "другие способы",
"callback": "topup_support" "callback": "topup_support"
}) })
return methods return methods
@@ -118,7 +118,18 @@ def get_payment_methods_text(language: str) -> str:
texts = get_texts(language) texts = get_texts(language)
methods = get_available_payment_methods() methods = get_available_payment_methods()
if len(methods) <= 1: # Только поддержка if not methods:
return texts.t(
"PAYMENT_METHODS_NONE_AVAILABLE",
"""💳 <b>Способы пополнения баланса</b>
⚠️ В данный момент способы оплаты временно недоступны.
Попробуйте позже.
Выберите способ пополнения:""",
)
if len(methods) == 1 and methods[0]["id"] == "support":
return texts.t( return texts.t(
"PAYMENT_METHODS_ONLY_SUPPORT", "PAYMENT_METHODS_ONLY_SUPPORT",
"""💳 <b>Способы пополнения баланса</b> """💳 <b>Способы пополнения баланса</b>
@@ -186,7 +197,7 @@ def is_payment_method_available(method_id: str) -> bool:
elif method_id == "platega": elif method_id == "platega":
return settings.is_platega_enabled() and bool(settings.get_platega_active_methods()) return settings.is_platega_enabled() and bool(settings.get_platega_active_methods())
elif method_id == "support": elif method_id == "support":
return True # Поддержка всегда доступна return settings.is_support_topup_enabled()
else: else:
return False return False
@@ -204,7 +215,7 @@ def get_payment_method_status() -> Dict[str, bool]:
"cryptobot": settings.is_cryptobot_enabled(), "cryptobot": settings.is_cryptobot_enabled(),
"heleket": settings.is_heleket_enabled(), "heleket": settings.is_heleket_enabled(),
"platega": settings.is_platega_enabled() and bool(settings.get_platega_active_methods()), "platega": settings.is_platega_enabled() and bool(settings.get_platega_active_methods()),
"support": True "support": settings.is_support_topup_enabled()
} }
def get_enabled_payment_methods_count() -> int: def get_enabled_payment_methods_count() -> int: