Skip to content

Commit fc850de

Browse files
author
Derssen
committed
Improved balance message formatting
1 parent e3a766d commit fc850de

File tree

2 files changed

+63
-38
lines changed

2 files changed

+63
-38
lines changed

handlers/balance.py

Lines changed: 62 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -17,64 +17,88 @@
1717
'UAH': '₴'
1818
}
1919

20+
# Жесткий порядок отображения (как ты привык)
21+
DISPLAY_ORDER = [
22+
'Zadarma',
23+
'DIDWW',
24+
'Streamtele',
25+
'Callii',
26+
'Wazzup24 Подписка',
27+
'Wazzup24 Баланс номера'
28+
]
29+
2030
@router.message(Command("balance"))
2131
async def handle_balance_command(message: Message, session: AsyncSession):
2232

2333
response_parts = ["💰 **Текущие балансы сервисов:**"]
2434

25-
# 1. Загружаем ВСЕ сервисы из БД
26-
stmt = select(Service).order_by(Service.id)
35+
# 1. Загружаем сервисы
36+
stmt = select(Service)
2737
result = await session.execute(stmt)
28-
services = result.scalars().all()
29-
30-
if not services:
31-
await message.answer("Сервисы не найдены в базе данных.")
32-
return
33-
34-
for service in services:
35-
# Получаем красивый символ валюты
36-
currency_symbol = CURRENCY_SYMBOLS.get(service.currency, service.currency or '$')
38+
services_unsorted = result.scalars().all()
39+
40+
# Превращаем в словарь для удобной сортировки: { 'Zadarma': ServiceObj, ... }
41+
services_map = {s.name: s for s in services_unsorted}
42+
43+
# 2. Проходимся строго по нашему списку порядка
44+
for name in DISPLAY_ORDER:
45+
service = services_map.get(name)
46+
if not service:
47+
continue # Если вдруг сервиса нет в базе, пропускаем
48+
49+
# Получаем символ валюты
50+
sym = CURRENCY_SYMBOLS.get(service.currency, '$')
3751

38-
# --- Логика для API сервисов ---
39-
# Если имя сервиса есть в списке API клиентов, пробуем обновить баланс
40-
# НО! Wazzup у тебя разбит на две части в БД. API клиент возвращает только один баланс.
41-
# Поэтому API опрашиваем только если точное совпадение имени или особая логика.
52+
# Переменные для вывода
53+
display_amount = 0.0
54+
status_suffix = ""
55+
is_subscription = False
4256

43-
real_balance = None
44-
is_api = False
57+
# --- ЛОГИКА ОПРЕДЕЛЕНИЯ ТИПА ---
4558

46-
if service.name in API_CLIENTS and SETTINGS.API_SERVICE_STATUSES.get(service.name, True):
59+
# A. Это API сервис? (Zadarma, DIDWW)
60+
if name in API_CLIENTS and SETTINGS.API_SERVICE_STATUSES.get(name, True):
4761
try:
48-
client = API_CLIENTS[service.name]
62+
client = API_CLIENTS[name]
4963
real_balance = await client.get_balance()
5064

51-
# Обновляем в БД, чтобы данные были свежими
65+
# Обновляем БД
5266
service.last_balance = real_balance
53-
is_api = True
67+
await session.commit()
68+
69+
display_amount = real_balance
70+
status_suffix = "(API)"
5471
except Exception:
55-
# Если ошибка API, используем то, что было в базе
56-
real_balance = service.last_balance
72+
display_amount = service.last_balance
73+
status_suffix = "(Ошибка API)"
74+
75+
# B. Это подписка? (Есть monthly_fee и это НЕ API сервис)
76+
# Пример: Streamtele, Wazzup24 Подписка
77+
elif service.monthly_fee and service.monthly_fee > 0:
78+
display_amount = service.monthly_fee
79+
# Формируем строку как в старом отчете: "Подписка: ₴1500.00"
80+
# Для этого suffix оставляем пустым, а префикс добавим в line
81+
is_subscription = True
82+
83+
# C. Это обычный ручной счет? (Callii, Wazzup24 Баланс номера)
5784
else:
58-
# Для ручных сервисов (Callii, Streamtele, Wazzup Подписки) берем из БД
59-
real_balance = service.last_balance
60-
61-
# Сохраняем обновление в БД
62-
await session.commit()
85+
display_amount = service.last_balance
86+
status_suffix = "(примерно)"
6387

64-
# --- Формирование строки вывода ---
65-
66-
status_text = "(API)" if is_api else "(примерно)"
67-
# Если это подписка (есть monthly_fee), меняем формат вывода
68-
if service.monthly_fee and service.monthly_fee > 0:
69-
status_text = f"Подписка: {currency_symbol}{service.monthly_fee:.2f}"
88+
# --- ФОРМИРОВАНИЕ СТРОКИ ---
7089

71-
line = f"• **{service.name}:** {currency_symbol}{real_balance:.2f} {status_text}"
90+
if is_subscription:
91+
# Особый формат для подписок: "• Streamtele: Подписка: ₴1500.00"
92+
# Обрати внимание: суффикса нет, слово "Подписка" внутри значения
93+
line = f"• **{name}:** Подписка: {sym}{display_amount:.2f}"
94+
else:
95+
# Стандартный формат: "• Zadarma: $0.00 (API)"
96+
line = f"• **{name}:** {sym}{display_amount:.2f} {status_suffix}"
97+
7298
response_parts.append(line)
7399

74-
# Добавляем дату следующей оплаты, если есть
75-
# Приоритет: next_alert_date (для Callii) или next_monthly_alert (для подписок)
100+
# Добавляем дату (если есть) с отступом
76101
alert_date = service.next_alert_date or service.next_monthly_alert
77-
78102
if alert_date:
79103
date_str = alert_date.strftime('%Y-%m-%d')
80104
response_parts.append(f" _След. оплата:_ {date_str}")

services/api_clients.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import aiohttp
22
import hashlib
33
import hmac
4+
import base64 # Добавили
45
import logging
56
from abc import ABC, abstractmethod
67
from config import SETTINGS

0 commit comments

Comments
 (0)