feat(promo): Добавлена локализация при изменении процента скидки и логи при активации промокода на скидку
This commit is contained in:
@@ -445,10 +445,7 @@ async def promo_edit_field_handler(callback: types.CallbackQuery, state: FSMCont
|
|||||||
}
|
}
|
||||||
|
|
||||||
prompt_key = prompts.get(field, "error_occurred_try_again")
|
prompt_key = prompts.get(field, "error_occurred_try_again")
|
||||||
if field == "discount_percentage":
|
prompt_text = _(prompt_key)
|
||||||
prompt_text = "Enter the new discount percentage (1-100):"
|
|
||||||
else:
|
|
||||||
prompt_text = _(prompt_key)
|
|
||||||
|
|
||||||
await state.set_state(AdminStates.waiting_for_promo_edit_details)
|
await state.set_state(AdminStates.waiting_for_promo_edit_details)
|
||||||
await callback.message.edit_text(prompt_text)
|
await callback.message.edit_text(prompt_text)
|
||||||
|
|||||||
@@ -165,6 +165,21 @@ async def process_promo_code_input(message: types.Message, state: FSMContext,
|
|||||||
f"Discount promo code '{code_input}' successfully applied for user {user.id}."
|
f"Discount promo code '{code_input}' successfully applied for user {user.id}."
|
||||||
)
|
)
|
||||||
discount_pct = result_discount # Returns percentage
|
discount_pct = result_discount # Returns percentage
|
||||||
|
|
||||||
|
# Send notification about discount promo activation
|
||||||
|
if settings.LOG_PROMO_ACTIVATIONS:
|
||||||
|
try:
|
||||||
|
from bot.services.notification_service import NotificationService
|
||||||
|
notification_service = NotificationService(bot, settings, i18n)
|
||||||
|
await notification_service.notify_discount_promo_activation(
|
||||||
|
user_id=user.id,
|
||||||
|
promo_code=code_input.upper(),
|
||||||
|
discount_percentage=discount_pct,
|
||||||
|
username=user.username
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Failed to send discount promo activation notification: {e}")
|
||||||
|
|
||||||
response_to_user_text = _(
|
response_to_user_text = _(
|
||||||
"discount_promo_code_applied_success",
|
"discount_promo_code_applied_success",
|
||||||
code=hcode(code_input.upper()),
|
code=hcode(code_input.upper()),
|
||||||
|
|||||||
@@ -271,15 +271,15 @@ class NotificationService:
|
|||||||
"""Send notification about promo code activation"""
|
"""Send notification about promo code activation"""
|
||||||
if not self.settings.LOG_PROMO_ACTIVATIONS:
|
if not self.settings.LOG_PROMO_ACTIVATIONS:
|
||||||
return
|
return
|
||||||
|
|
||||||
admin_lang = self.settings.DEFAULT_LANGUAGE
|
admin_lang = self.settings.DEFAULT_LANGUAGE
|
||||||
_ = lambda k, **kw: self.i18n.gettext(admin_lang, k, **kw) if self.i18n else k
|
_ = lambda k, **kw: self.i18n.gettext(admin_lang, k, **kw) if self.i18n else k
|
||||||
|
|
||||||
user_display = self._format_user_display(
|
user_display = self._format_user_display(
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
username=username,
|
username=username,
|
||||||
)
|
)
|
||||||
|
|
||||||
message = _(
|
message = _(
|
||||||
"log_promo_activation",
|
"log_promo_activation",
|
||||||
user_display=user_display,
|
user_display=user_display,
|
||||||
@@ -287,7 +287,33 @@ class NotificationService:
|
|||||||
bonus_days=bonus_days,
|
bonus_days=bonus_days,
|
||||||
timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Send to log channel
|
||||||
|
profile_keyboard = self._build_profile_keyboard(_, user_id)
|
||||||
|
await self._send_to_log_channel(message, reply_markup=profile_keyboard)
|
||||||
|
|
||||||
|
async def notify_discount_promo_activation(self, user_id: int, promo_code: str, discount_percentage: int,
|
||||||
|
username: Optional[str] = None):
|
||||||
|
"""Send notification about discount promo code activation"""
|
||||||
|
if not self.settings.LOG_PROMO_ACTIVATIONS:
|
||||||
|
return
|
||||||
|
|
||||||
|
admin_lang = self.settings.DEFAULT_LANGUAGE
|
||||||
|
_ = lambda k, **kw: self.i18n.gettext(admin_lang, k, **kw) if self.i18n else k
|
||||||
|
|
||||||
|
user_display = self._format_user_display(
|
||||||
|
user_id=user_id,
|
||||||
|
username=username,
|
||||||
|
)
|
||||||
|
|
||||||
|
message = _(
|
||||||
|
"log_promo_discount_activation",
|
||||||
|
user_display=user_display,
|
||||||
|
promo_code=promo_code,
|
||||||
|
discount_percentage=discount_percentage,
|
||||||
|
timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
)
|
||||||
|
|
||||||
# Send to log channel
|
# Send to log channel
|
||||||
profile_keyboard = self._build_profile_keyboard(_, user_id)
|
profile_keyboard = self._build_profile_keyboard(_, user_id)
|
||||||
await self._send_to_log_channel(message, reply_markup=profile_keyboard)
|
await self._send_to_log_channel(message, reply_markup=profile_keyboard)
|
||||||
|
|||||||
@@ -208,6 +208,7 @@
|
|||||||
"csv_no": "No",
|
"csv_no": "No",
|
||||||
"admin_promo_edit_select_field": "Select a field to edit:",
|
"admin_promo_edit_select_field": "Select a field to edit:",
|
||||||
"admin_promo_prompt_bonus_days": "Enter the new number of bonus days:",
|
"admin_promo_prompt_bonus_days": "Enter the new number of bonus days:",
|
||||||
|
"admin_promo_prompt_discount_percentage": "Enter the new discount percentage (1-100):",
|
||||||
"admin_promo_prompt_max_activations": "Enter the new maximum number of activations:",
|
"admin_promo_prompt_max_activations": "Enter the new maximum number of activations:",
|
||||||
"admin_promo_prompt_validity_days": "Enter the new validity period in days (0 for indefinite):",
|
"admin_promo_prompt_validity_days": "Enter the new validity period in days (0 for indefinite):",
|
||||||
"admin_promo_edit_success": "Promo code updated successfully.",
|
"admin_promo_edit_success": "Promo code updated successfully.",
|
||||||
@@ -313,6 +314,7 @@
|
|||||||
"log_payment_received": "{provider_emoji} <b>Payment Received</b>\n\n👤 User: {user_display}\n💰 Amount: <b>{amount} {currency}</b>\n📅 Period: <b>{months} mo.</b>\n🏦 Provider: {payment_provider}\n🕐 Time: {timestamp}",
|
"log_payment_received": "{provider_emoji} <b>Payment Received</b>\n\n👤 User: {user_display}\n💰 Amount: <b>{amount} {currency}</b>\n📅 Period: <b>{months} mo.</b>\n🏦 Provider: {payment_provider}\n🕐 Time: {timestamp}",
|
||||||
"log_payment_received_traffic": "{provider_emoji} <b>Payment Received</b>\n\n👤 User: {user_display}\n💰 Amount: <b>{amount} {currency}</b>\n🗂 Traffic: <b>{traffic_gb} GB</b>\n🏦 Provider: {payment_provider}\n🕐 Time: {timestamp}",
|
"log_payment_received_traffic": "{provider_emoji} <b>Payment Received</b>\n\n👤 User: {user_display}\n💰 Amount: <b>{amount} {currency}</b>\n🗂 Traffic: <b>{traffic_gb} GB</b>\n🏦 Provider: {payment_provider}\n🕐 Time: {timestamp}",
|
||||||
"log_promo_activation": "🎁 <b>Promo Code Activated</b>\n\n👤 User: {user_display}\n🏷 Code: <code>{promo_code}</code>\n🎯 Bonus: <b>+{bonus_days}d</b>\n🕐 Time: {timestamp}",
|
"log_promo_activation": "🎁 <b>Promo Code Activated</b>\n\n👤 User: {user_display}\n🏷 Code: <code>{promo_code}</code>\n🎯 Bonus: <b>+{bonus_days}d</b>\n🕐 Time: {timestamp}",
|
||||||
|
"log_promo_discount_activation": "💰 <b>Discount Promo Code Activated</b>\n\n👤 User: {user_display}\n🏷 Code: <code>{promo_code}</code>\n💵 Discount: <b>{discount_percentage}%</b>\n🕐 Time: {timestamp}",
|
||||||
"log_trial_activation": "🆓 <b>Trial Activated</b>\n\n👤 User: {user_display}\n⏰ Valid until: <b>{end_date}</b>\n🕐 Time: {timestamp}",
|
"log_trial_activation": "🆓 <b>Trial Activated</b>\n\n👤 User: {user_display}\n⏰ Valid until: <b>{end_date}</b>\n🕐 Time: {timestamp}",
|
||||||
"log_panel_sync": "{status_emoji} <b>Panel Synchronization</b>\n\n📊 Status: <b>{status}</b>\n👥 Users processed: <b>{users_processed}</b>\n📋 Subscriptions synced: <b>{subs_synced}</b>\n🕐 Time: {timestamp}\n\n📝 Details:\n{details}",
|
"log_panel_sync": "{status_emoji} <b>Panel Synchronization</b>\n\n📊 Status: <b>{status}</b>\n👥 Users processed: <b>{users_processed}</b>\n📋 Subscriptions synced: <b>{subs_synced}</b>\n🕐 Time: {timestamp}\n\n📝 Details:\n{details}",
|
||||||
"log_suspicious_promo": "⚠️ <b>Suspicious Promo Code Attempt</b>\n\n👤 User: {user_display}\n🆔 ID: <code>{user_id}</code>\n📝 Input: <pre>{suspicious_input}</pre>\n🕐 Time: {timestamp}",
|
"log_suspicious_promo": "⚠️ <b>Suspicious Promo Code Attempt</b>\n\n👤 User: {user_display}\n🆔 ID: <code>{user_id}</code>\n📝 Input: <pre>{suspicious_input}</pre>\n🕐 Time: {timestamp}",
|
||||||
|
|||||||
@@ -218,6 +218,7 @@
|
|||||||
"csv_no": "Нет",
|
"csv_no": "Нет",
|
||||||
"admin_promo_edit_select_field": "Выберите поле для редактирования:",
|
"admin_promo_edit_select_field": "Выберите поле для редактирования:",
|
||||||
"admin_promo_prompt_bonus_days": "Введите новое количество бонусных дней:",
|
"admin_promo_prompt_bonus_days": "Введите новое количество бонусных дней:",
|
||||||
|
"admin_promo_prompt_discount_percentage": "Введите новый процент скидки (от 1 до 100):",
|
||||||
"admin_promo_prompt_max_activations": "Введите новое максимальное количество активаций:",
|
"admin_promo_prompt_max_activations": "Введите новое максимальное количество активаций:",
|
||||||
"admin_promo_prompt_validity_days": "Введите новый срок действия в днях (0 для бессрочного):",
|
"admin_promo_prompt_validity_days": "Введите новый срок действия в днях (0 для бессрочного):",
|
||||||
"admin_promo_edit_success": "Промокод успешно обновлен.",
|
"admin_promo_edit_success": "Промокод успешно обновлен.",
|
||||||
@@ -314,6 +315,7 @@
|
|||||||
"log_payment_received": "{provider_emoji} <b>Получен платеж</b>\n\n👤 Пользователь: {user_display}\n💰 Сумма: <b>{amount} {currency}</b>\n📅 Период: <b>{months} мес.</b>\n🏦 Провайдер: {payment_provider}\n🕐 Время: {timestamp}",
|
"log_payment_received": "{provider_emoji} <b>Получен платеж</b>\n\n👤 Пользователь: {user_display}\n💰 Сумма: <b>{amount} {currency}</b>\n📅 Период: <b>{months} мес.</b>\n🏦 Провайдер: {payment_provider}\n🕐 Время: {timestamp}",
|
||||||
"log_payment_received_traffic": "{provider_emoji} <b>Получен платеж</b>\n\n👤 Пользователь: {user_display}\n💰 Сумма: <b>{amount} {currency}</b>\n🗂 Трафик: <b>{traffic_gb} ГБ</b>\n🏦 Провайдер: {payment_provider}\n🕐 Время: {timestamp}",
|
"log_payment_received_traffic": "{provider_emoji} <b>Получен платеж</b>\n\n👤 Пользователь: {user_display}\n💰 Сумма: <b>{amount} {currency}</b>\n🗂 Трафик: <b>{traffic_gb} ГБ</b>\n🏦 Провайдер: {payment_provider}\n🕐 Время: {timestamp}",
|
||||||
"log_promo_activation": "🎁 <b>Активирован промокод</b>\n\n👤 Пользователь: {user_display}\n🏷 Код: <code>{promo_code}</code>\n🎯 Бонус: <b>+{bonus_days} дн.</b>\n🕐 Время: {timestamp}",
|
"log_promo_activation": "🎁 <b>Активирован промокод</b>\n\n👤 Пользователь: {user_display}\n🏷 Код: <code>{promo_code}</code>\n🎯 Бонус: <b>+{bonus_days} дн.</b>\n🕐 Время: {timestamp}",
|
||||||
|
"log_promo_discount_activation": "💰 <b>Активирован промокод на скидку</b>\n\n👤 Пользователь: {user_display}\n🏷 Код: <code>{promo_code}</code>\n💵 Скидка: <b>{discount_percentage}%</b>\n🕐 Время: {timestamp}",
|
||||||
"log_trial_activation": "🆓 <b>Активирован триал</b>\n\n👤 Пользователь: {user_display}\n⏰ Действует до: <b>{end_date}</b>\n🕐 Время: {timestamp}",
|
"log_trial_activation": "🆓 <b>Активирован триал</b>\n\n👤 Пользователь: {user_display}\n⏰ Действует до: <b>{end_date}</b>\n🕐 Время: {timestamp}",
|
||||||
"log_panel_sync": "{status_emoji} <b>Синхронизация с панелью</b>\n\n📊 Статус: <b>{status}</b>\n👥 Обработано пользователей: <b>{users_processed}</b>\n📋 Синхронизировано подписок: <b>{subs_synced}</b>\n🕐 Время: {timestamp}\n\n📝 Детали:\n{details}",
|
"log_panel_sync": "{status_emoji} <b>Синхронизация с панелью</b>\n\n📊 Статус: <b>{status}</b>\n👥 Обработано пользователей: <b>{users_processed}</b>\n📋 Синхронизировано подписок: <b>{subs_synced}</b>\n🕐 Время: {timestamp}\n\n📝 Детали:\n{details}",
|
||||||
"log_suspicious_promo": "⚠️ <b>Подозрительная попытка ввода промокода</b>\n\n👤 Пользователь: {user_display}\n🆔 ID: <code>{user_id}</code>\n📝 Ввод: <pre>{suspicious_input}</pre>\n🕐 Время: {timestamp}",
|
"log_suspicious_promo": "⚠️ <b>Подозрительная попытка ввода промокода</b>\n\n👤 Пользователь: {user_display}\n🆔 ID: <code>{user_id}</code>\n📝 Ввод: <pre>{suspicious_input}</pre>\n🕐 Время: {timestamp}",
|
||||||
|
|||||||
Reference in New Issue
Block a user