From e9f84d937708a8edb4ad896cb98f8eb4aa5e1b23 Mon Sep 17 00:00:00 2001 From: hexdev Date: Sun, 3 May 2026 07:03:53 +0700 Subject: [PATCH] fix: enhance insufficient funds message and update subscription controls logic --- bot/handlers/buy.py | 2 +- bot/handlers/menus.py | 4 +-- bot/keyboards/client.py | 25 +++++++++--------- bot/texts.py | 57 +--------------------------------------- services/user_service.py | 6 +---- 5 files changed, 18 insertions(+), 76 deletions(-) diff --git a/bot/handlers/buy.py b/bot/handlers/buy.py index 73f69f4..dcc5d09 100644 --- a/bot/handlers/buy.py +++ b/bot/handlers/buy.py @@ -176,7 +176,7 @@ async def proceed_to_checkout( if effective_balance < amount: await cb.message.edit_text( - INSUFFICIENT_FUNDS.format(balance=user.balance, amount=amount), reply_markup=deposit_kb + INSUFFICIENT_FUNDS.format(balance=user.balance, amount=amount, diff=abs(amount-user.balance)), reply_markup=deposit_kb ) return diff --git a/bot/handlers/menus.py b/bot/handlers/menus.py index ebfb15d..be64f00 100644 --- a/bot/handlers/menus.py +++ b/bot/handlers/menus.py @@ -149,7 +149,7 @@ async def sub_info( deps.user_service.format_subscription_message( rw_user, link=user.subscription_link, autorenew=sub.autorenew ), - reply_markup=subscription_controls(sub.autorenew), + reply_markup=subscription_controls(show_autorenew=bool(rw_user), current_autorenewal_status=sub.autorenew), ) @@ -183,5 +183,5 @@ async def toggle_autorenewal( deps.user_service.format_subscription_message( rw_user, link=user.subscription_link, autorenew=sub.autorenew ), - reply_markup=subscription_controls(sub.autorenew), + reply_markup=subscription_controls(show_autorenew=bool(rw_user), current_autorenewal_status=sub.autorenew), ) diff --git a/bot/keyboards/client.py b/bot/keyboards/client.py index 5b7d722..08ba02e 100644 --- a/bot/keyboards/client.py +++ b/bot/keyboards/client.py @@ -54,18 +54,19 @@ deposit_kb: InlineKeyboardMarkup = InlineKeyboardBuilder( ).as_markup() -def subscription_controls(current_autorenewal_status: bool) -> InlineKeyboardMarkup: - autorenewal_text = ( - "🟢 Включить автопродление" - if not current_autorenewal_status - else "🔴 Отключить автопродление" - ) - return InlineKeyboardBuilder( - [ - [InlineKeyboardButton(text=autorenewal_text, callback_data="toggle:autorenewal")], - [_return_to_menu_btn], - ] - ).as_markup() +def subscription_controls(show_autorenew: bool, current_autorenewal_status: bool = None) -> InlineKeyboardMarkup: + builder = InlineKeyboardBuilder() + + if show_autorenew: + autorenewal_text = ( + "🟢 Включить автопродление" + if not current_autorenewal_status + else "🔴 Отключить автопродление" + ) + builder.row(InlineKeyboardButton(text=autorenewal_text, callback_data="toggle:autorenewal")) + + builder.row(_return_to_menu_btn) + return builder.as_markup() def _return_btn(data: str = "menu:main", text: str = "⬅️ Назад") -> InlineKeyboardButton: diff --git a/bot/texts.py b/bot/texts.py index 7ef7e0d..08d4136 100644 --- a/bot/texts.py +++ b/bot/texts.py @@ -185,7 +185,7 @@ BILL_CREATION = _BILL_TEMPLATE + _DIVIDER + GENERAL_PROCESSING BILL_CREATED = _BILL_TEMPLATE + _DIVIDER + _BILL_LINK -INSUFFICIENT_FUNDS = "⚠️ Недостаточно средств для проведения операции.\n\n💰 Текущий баланс: {balance}₽\n💸 Требуется: {amount}₽" +INSUFFICIENT_FUNDS = "⚠️ Недостаточно средств для проведения операции.\n\n💰 Текущий баланс: {balance}₽\n💸 Требуется: {amount}₽\n\n❗ Пополните баланс на {diff}₽" SUCCESSFULLY_CREATED_SUBSCRIPTION = ( "💚 Ваша подписка успешно оплачена! Ссылка на добавления доступна в главном меню." ) @@ -205,58 +205,3 @@ SUPPORT_INIT = "🎧 Тех. Поддержка Malenia — не здес SUPPORT_MSG_SENT = "⏳ Приняли ваше сообщение. Мы постараемся ответить на него в ближайшее время.\nВернуться в меню: /cancel" SUPPORT_SIGNATURE = "📡 Ответ от Malenia:" - - -# ============================================================ -# ШАБЛОНЫ — ЗАЯВКИ И ТИКЕТЫ -# ============================================================ - -SUPPORT_SUBSCRIPTION = ( - "🎫 ВХОДЯЩИЙ ЗАПРОС:\n\n" - + _SUPPORT_USER_DESCRIPTION - + "\n" - + _DIVIDER - + "🗓️ Срок: {duration} мес.\n" - + "📱 Устройства: {devices}\n" - + "🏳️ Whitelists: {whitelist_description}\n\n" - + "💰 К оплате: {price}₽" -) - -ADMIN_TICKET_WITH_RW = ( - "🎫 ТИКЕТ T-{ticket_number:04d}\n\n" - + _SUPPORT_USER_DESCRIPTION - + "\n" - + _DIVIDER - + "📊 ТЕХ. ДАННЫЕ (Remnawave)\n\n" - + "{status_icon} Статус: {status}\n" - + "📅 Deadline: {expire_date}\n" - + "⏳ Остаток: {days_left}\n" - + "📊 Трафик: {used_traffic}\n" - + "📱 HWID: {hwid_limit}\n" - + "🎯 Squads: {squads}\n\n" - + _DIVIDER - + "🔑 UUID: {remnawave_uuid}" -) - -ADMIN_TICKET_WITHOUT_RW = ( - "🎫 ТИКЕТ T-{ticket_number:04d}\n\n" - + _SUPPORT_USER_DESCRIPTION - + "\n" - + _DIVIDER - + NO_SUBSCRIPTION -) - -ADMIN_STANDARD_FALLBACK = "❌ Ошибка выполнения. Проверь логи, что-то пошло не по чертежу." - - -# ============================================================ -# АДМИНСКАЯ ХУЙНЯ -# ============================================================ - -ADMIN_PROMOTION_INIT = "👥 Введите текст рассылки" -ADMIN_PROMOTION_CONFIRMATION = "❓ Отправить сообщение всем пользователям бота?" -SUCCESSFULLY_SENT_PROMOTION = "Успешно разосланно {user_count} пользователям." -SPECIFY_REFERAL_PAYMENT_AMOUNT = "Укажите количество средств для перевода рефералу пользователя." -USER_NO_REFERAL = "❌ У пользователя нет реферала." -INVALID_ARGUMENT_REFPAY = "❌ Укажите в аргументах количество средств, которые необходимо перевести рефералу пользователя." -SUCCESSFUL_REFPAY = "💸 Баланс реферала ({referal_id}) пополнен на {amount}₽" diff --git a/services/user_service.py b/services/user_service.py index 3e09eba..0e8fefb 100644 --- a/services/user_service.py +++ b/services/user_service.py @@ -80,11 +80,7 @@ class UserService: user = await self.user_repository.get_user_by_id(session, user_id) - if not rw_user: - return user - - link = utils.get_subscription_link(rw_user.short_uuid) - + link = utils.get_subscription_link(rw_user.short_uuid) if rw_user else None user = await self.user_repository.update_user_link(session, user_id, link) return user