mirror of
https://github.com/BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot.git
synced 2026-02-26 14:21:25 +00:00
Update admin_notification_service.py
This commit is contained in:
@@ -288,9 +288,7 @@ class AdminNotificationService:
|
||||
return False
|
||||
|
||||
user_status = '🆕 Новый' if not user.has_had_paid_subscription else '🔄 Существующий'
|
||||
referrer_info = await self._get_referrer_info(db, user.referred_by_id)
|
||||
promo_group = await self._get_user_promo_group(db, user)
|
||||
promo_block = self._format_promo_group_block(promo_group)
|
||||
user_display = self._get_user_display(user)
|
||||
|
||||
trial_device_limit = subscription.device_limit
|
||||
@@ -308,28 +306,59 @@ class AdminNotificationService:
|
||||
user_id_label = self._get_user_identifier_label(user)
|
||||
user_id_display = self._get_user_identifier_display(user)
|
||||
|
||||
message = f"""🎯 <b>АКТИВАЦИЯ ТРИАЛА</b>
|
||||
# Получаем название тарифа (если режим тарифов)
|
||||
tariff_name = await self._get_tariff_name(db, subscription)
|
||||
|
||||
👤 <b>Пользователь:</b> {user_display}
|
||||
🆔 <b>{user_id_label}:</b> {user_id_display}
|
||||
📱 <b>Username:</b> @{getattr(user, 'username', None) or 'отсутствует'}
|
||||
👥 <b>Статус:</b> {user_status}
|
||||
message_lines = [
|
||||
'🎯 <b>АКТИВАЦИЯ ТРИАЛА</b>',
|
||||
'',
|
||||
f'👤 <b>Пользователь:</b> {user_display}',
|
||||
f'🆔 <b>{user_id_label}:</b> {user_id_display}',
|
||||
f'📱 <b>Username:</b> @{getattr(user, "username", None) or "отсутствует"}',
|
||||
f'👥 <b>Статус:</b> {user_status}',
|
||||
'',
|
||||
]
|
||||
|
||||
{promo_block}
|
||||
# Промогруппа — только название, без скидок
|
||||
if promo_group:
|
||||
message_lines.append(f'🏷️ <b>Промогруппа:</b> {promo_group.name}')
|
||||
else:
|
||||
message_lines.append('🏷️ <b>Промогруппа:</b> —')
|
||||
|
||||
⏰ <b>Параметры триала:</b>
|
||||
📅 Период: {settings.TRIAL_DURATION_DAYS} дней
|
||||
📊 Трафик: {self._format_traffic(settings.TRIAL_TRAFFIC_LIMIT_GB)}
|
||||
📱 Устройства: {trial_device_limit}
|
||||
🌐 Сервер: {subscription.connected_squads[0] if subscription.connected_squads else 'По умолчанию'}
|
||||
{payment_block}
|
||||
# Тариф триала (если есть)
|
||||
if tariff_name:
|
||||
message_lines.append(f'📦 <b>Тариф:</b> {tariff_name}')
|
||||
|
||||
📆 <b>Действует до:</b> {format_local_datetime(subscription.end_date, '%d.%m.%Y %H:%M')}
|
||||
🔗 <b>Реферер:</b> {referrer_info}
|
||||
message_lines.append('')
|
||||
|
||||
⏰ <i>{format_local_datetime(datetime.utcnow(), '%d.%m.%Y %H:%M:%S')}</i>"""
|
||||
message_lines.extend(
|
||||
[
|
||||
'⏰ <b>Параметры триала:</b>',
|
||||
f'📅 Период: {settings.TRIAL_DURATION_DAYS} дней',
|
||||
f'📊 Трафик: {self._format_traffic(settings.TRIAL_TRAFFIC_LIMIT_GB)}',
|
||||
f'📱 Устройства: {trial_device_limit}',
|
||||
f'🌐 Сервер: {subscription.connected_squads[0] if subscription.connected_squads else "По умолчанию"}',
|
||||
]
|
||||
)
|
||||
|
||||
return await self._send_message(message)
|
||||
if payment_block:
|
||||
message_lines.append(payment_block)
|
||||
|
||||
message_lines.append('')
|
||||
message_lines.append(
|
||||
f'📆 <b>Действует до:</b> {format_local_datetime(subscription.end_date, "%d.%m.%Y %H:%M")}'
|
||||
)
|
||||
|
||||
# Реферер — только если есть
|
||||
if user.referred_by_id:
|
||||
referrer_info = await self._get_referrer_info(db, user.referred_by_id)
|
||||
if referrer_info != 'Нет':
|
||||
message_lines.append(f'🔗 <b>Реферер:</b> {referrer_info}')
|
||||
|
||||
message_lines.append('')
|
||||
message_lines.append(f'⏰ <i>{format_local_datetime(datetime.utcnow(), "%d.%m.%Y %H:%M:%S")}</i>')
|
||||
|
||||
return await self._send_message('\n'.join(message_lines))
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f'Ошибка отправки уведомления о триале: {e}')
|
||||
@@ -540,35 +569,81 @@ class AdminNotificationService:
|
||||
payment_method = self._get_payment_method_display(transaction.payment_method)
|
||||
balance_change = user.balance_kopeks - old_balance
|
||||
subscription_status = self._get_subscription_status(subscription)
|
||||
promo_block = self._format_promo_group_block(promo_group)
|
||||
timestamp = format_local_datetime(datetime.utcnow(), '%d.%m.%Y %H:%M:%S')
|
||||
user_display = self._get_user_display(user)
|
||||
user_id_label = self._get_user_identifier_label(user)
|
||||
user_id_display = self._get_user_identifier_display(user)
|
||||
|
||||
return f"""💰 <b>ПОПОЛНЕНИЕ БАЛАНСА</b>
|
||||
# --- Основной блок ---
|
||||
message_lines: list[str] = [
|
||||
'💰 <b>ПОПОЛНЕНИЕ БАЛАНСА</b>',
|
||||
'',
|
||||
f'👤 {user_display} ({user_id_display})',
|
||||
]
|
||||
|
||||
👤 <b>Пользователь:</b> {user_display}
|
||||
🆔 <b>{user_id_label}:</b> {user_id_display}
|
||||
📱 <b>Username:</b> @{getattr(user, 'username', None) or 'отсутствует'}
|
||||
💳 <b>Статус:</b> {topup_status}
|
||||
username = getattr(user, 'username', None)
|
||||
if username:
|
||||
message_lines.append(f'📱 @{username}')
|
||||
|
||||
{promo_block}
|
||||
message_lines.append(f'💳 {topup_status}')
|
||||
|
||||
💰 <b>Детали пополнения:</b>
|
||||
💵 Сумма: {settings.format_price(transaction.amount_kopeks)}
|
||||
💳 Способ: {payment_method}
|
||||
🆔 ID транзакции: {transaction.id}
|
||||
# Промогруппа -- только название
|
||||
if promo_group:
|
||||
message_lines.append(f'🏷️ Промогруппа: {promo_group.name}')
|
||||
|
||||
💰 <b>Баланс:</b>
|
||||
📉 Было: {settings.format_price(old_balance)}
|
||||
📈 Стало: {settings.format_price(user.balance_kopeks)}
|
||||
➕ Изменение: +{settings.format_price(balance_change)}
|
||||
message_lines.append('')
|
||||
|
||||
🔗 <b>Реферер:</b> {referrer_info}
|
||||
📱 <b>Подписка:</b> {subscription_status}
|
||||
# --- Детали пополнения ---
|
||||
message_lines.extend(
|
||||
[
|
||||
f'💵 <b>{settings.format_price(transaction.amount_kopeks)}</b> | {payment_method}',
|
||||
'',
|
||||
f'📉 {settings.format_price(old_balance)} → 📈 {settings.format_price(user.balance_kopeks)}'
|
||||
f' (<b>+{settings.format_price(balance_change)}</b>)',
|
||||
]
|
||||
)
|
||||
|
||||
⏰ <i>{timestamp}</i>"""
|
||||
# --- Подписка ---
|
||||
message_lines.append(f'📱 Подписка: {subscription_status}')
|
||||
|
||||
# --- Реферер (только если есть) ---
|
||||
if referrer_info and referrer_info != 'Нет':
|
||||
message_lines.append(f'🔗 Реферер: {referrer_info}')
|
||||
|
||||
# --- Expandable blockquote с техническими деталями ---
|
||||
detail_lines: list[str] = [
|
||||
f'ID транзакции: {transaction.id}',
|
||||
f'Способ оплаты: {transaction.payment_method or "balance"}',
|
||||
]
|
||||
|
||||
if transaction.external_id:
|
||||
detail_lines.append(f'Внешний ID: {transaction.external_id}')
|
||||
|
||||
if transaction.description:
|
||||
desc = transaction.description
|
||||
if len(desc) > 120:
|
||||
desc = desc[:117] + '...'
|
||||
detail_lines.append(f'Описание: {desc}')
|
||||
|
||||
if transaction.created_at:
|
||||
detail_lines.append(f'Создана: {format_local_datetime(transaction.created_at, "%d.%m.%Y %H:%M:%S")}')
|
||||
|
||||
if transaction.completed_at:
|
||||
detail_lines.append(f'Завершена: {format_local_datetime(transaction.completed_at, "%d.%m.%Y %H:%M:%S")}')
|
||||
|
||||
if transaction.receipt_uuid:
|
||||
detail_lines.append(f'Чек UUID: {transaction.receipt_uuid}')
|
||||
|
||||
blockquote_body = '\n'.join(detail_lines)
|
||||
message_lines.extend(
|
||||
[
|
||||
'',
|
||||
f'<blockquote expandable>{blockquote_body}</blockquote>',
|
||||
]
|
||||
)
|
||||
|
||||
message_lines.append(f'<i>{timestamp}</i>')
|
||||
|
||||
return '\n'.join(message_lines)
|
||||
|
||||
async def _reload_topup_notification_entities(
|
||||
self,
|
||||
@@ -1121,21 +1196,27 @@ class AdminNotificationService:
|
||||
return self.enabled and bool(self.chat_id)
|
||||
|
||||
def _get_payment_method_display(self, payment_method: str | None) -> str:
|
||||
mulenpay_name = settings.get_mulenpay_display_name()
|
||||
method_names = {
|
||||
if not payment_method:
|
||||
return '💰 С баланса'
|
||||
|
||||
method_names: dict[str, str] = {
|
||||
'telegram_stars': '⭐ Telegram Stars',
|
||||
'yookassa': '💳 YooKassa (карта)',
|
||||
'tribute': '💎 Tribute (карта)',
|
||||
'mulenpay': f'💳 {mulenpay_name} (карта)',
|
||||
'pal24': '🏦 PayPalych (СБП)',
|
||||
'mulenpay': f'💳 {settings.get_mulenpay_display_name()} (карта)',
|
||||
'pal24': f'🏦 {settings.get_pal24_display_name()} (СБП)',
|
||||
'cryptobot': f'🪙 {settings.get_cryptobot_display_name()} (крипто)',
|
||||
'heleket': f'🪙 {settings.get_heleket_display_name()} (крипто)',
|
||||
'wata': f'💳 {settings.get_wata_display_name()}',
|
||||
'platega': f'💳 {settings.get_platega_display_name()}',
|
||||
'cloudpayments': f'💳 {settings.get_cloudpayments_display_name()}',
|
||||
'freekassa': f'💳 {settings.get_freekassa_display_name()}',
|
||||
'kassa_ai': f'💳 {settings.get_kassa_ai_display_name()}',
|
||||
'manual': '🛠️ Вручную (админ)',
|
||||
'balance': '💰 С баланса',
|
||||
}
|
||||
|
||||
if not payment_method:
|
||||
return '💰 С баланса'
|
||||
|
||||
return method_names.get(payment_method, '💰 С баланса')
|
||||
return method_names.get(payment_method, f'💳 {payment_method}')
|
||||
|
||||
def _format_traffic(self, traffic_gb: int) -> str:
|
||||
if traffic_gb == 0:
|
||||
|
||||
Reference in New Issue
Block a user