from misc.utils import fetch_quote from db.models.tickets import TicketStatus # ============================================================ # PREMIUM EMOJI # ============================================================ class PremiumEmoji: def __init__(self, emoji_id: int, emoji: str): self.emoji_id = emoji_id self.emoji = emoji def __str__(self) -> str: return f'{self.emoji}' # — Иконки бота MALENIA_LOGO = PremiumEmoji(5265053829522562789, "☀️") MALENIA_HEART = PremiumEmoji(5276516908257025723, "❤️") MALENIA_LINK = PremiumEmoji(5276012730636082950, "🔗") MALENIA_COINS = PremiumEmoji(5276298354551199712, "🪙") MALENIA_LOCKED = PremiumEmoji(5276346642868508688, "🔒") MALENIA_SUPPORT = PremiumEmoji(5275968088746006467, "🎧") # ============================================================ # МАППИНГИ # ============================================================ TICKET_STATUS_EMOJIS = { TicketStatus.CLOSED.value: "🔴", TicketStatus.OPEN.value: "🟢", TicketStatus.PENDING.value: "🟡", } # ============================================================ # СТАТУСЫ ПОДПИСКИ # ============================================================ # — Иконки статусов STATUS_ICON_ACTIVE = "🟢" STATUS_ICON_DISABLED = "🔴" STATUS_ICON_EXPIRED = "🟡" STATUS_ICON_LIMITED = "🟠" STATUS_ICON_UNKNOWN = "⚪" # — Тексты статусов STATUS_ACTIVE = "Активна" STATUS_DISABLED = "Отключена" STATUS_EXPIRED = "Истекла" STATUS_LIMITED = "Превышен лимит трафика" STATUS_UNKNOWN = "Неизвестен" # ============================================================ # ФОРМАТИРОВАНИЕ ДАННЫХ # ============================================================ # — Дни до истечения подписки DAYS_LEFT_POSITIVE = "{days} дн." DAYS_LEFT_EXPIRED = "истекла {days} дн. назад" DAYS_LEFT_TODAY = "истекает сегодня" # — Username NO_USERNAME = "нет username" USERNAME_DISPLAY = "@{username}" # — Internal Squads NO_SQUADS = "нет" # — HWID лимит UNLIMITED_HWID = "без ограничений" # — Трафик NO_TRAFFIC_LIMIT = "без ограничений" TRAFFIC_WITH_LIMIT = "{used} / {limit}" TRAFFIC_NO_LIMIT = "{used}" # — Прочее NOTHING_PLACEHOLDER = "🍃" # ============================================================ # ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС # ============================================================ MAIN_MENU = ( str(MALENIA_LOGO) + " Malenia — {quote}\n\n" + f"{MALENIA_COINS} Личный кабинет\n" + f"{MALENIA_LINK} Ваша ссылка на подписку: {{link}}" ) FAQ_TEXT = "faq" GENERAL_PROCESSING = "⏳ Выполняю..." STANDARD_FALLBACK = ( "❌ Что-то пошло не так, прожмите /start и повторите попытку позже." ) CALLBACK_FALLBACK = "❌ Что-то пошло не так" CONTEXT_REINITIATED = ( "🔴 Контекст данного взаимодействия сброшен. " "Данные могут отличаться от указанных вами." ) # ============================================================ # ОФОРМЛЕНИЕ ПОДПИСКИ # ============================================================ SUBSCRIPTION_DEVICE_SELECTOR = ( "выбери колво устройств епта. тут ещё цена есть смотри опа: {price}" ) SUBSCRIPTION_DURATION_SELECTOR = ( "тут короче сколько время. а ещё цена смотри ОПА {price}" ) WHITELISTS_ALREADY_ON = "уже включены!" TEMP_SUPPORT_FORM = "обратитесь в поддержку, прикрепив текст ниже:\n\n" CHECKOUT_PAYMENT_CHOICE = ( "в поддержку чирканите епта там всё обьяснят\n" + TEMP_SUPPORT_FORM ) # ============================================================ # ПОДДЕРЖКА # ============================================================ SUPPORT_INIT = ( f"{MALENIA_SUPPORT} Что-то не работает? Жалоба? Предложение?\n" "— всё сюда, желательно со скриншотами. " "Чем детальнее описание, тем быстрее ответ.\n\n" "❌ Для отмены — /cancel" ) SUPPORT_MSG_SENT = ( "⏳ Сообщение отправлено. Для выхода — /cancel, " "вы можете вернуться сюда из главного меню в любое время." ) SUPPORT_SIGNATURE = "✍️ Сообщение от технической поддержки:" # ============================================================ # ШАБЛОНЫ — ОБЩИЕ БЛОКИ # ============================================================ # Используется в SUPPORT_SUBSCRIPTION и ADMIN_TICKET_WITH_RW _SUPPORT_USER_DESCRIPTION = ( "👤 Имя: {full_name}\n" "🔗 Username: {username_display}\n" "🆔 Telegram ID: {telegram_id}\n\n" ) _DIVIDER = "━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" # ============================================================ # ШАБЛОНЫ — ЗАЯВКИ И ТИКЕТЫ # ============================================================ SUPPORT_SUBSCRIPTION = ( "🎫 ЗАЯВКА НА ПОКУПКУ:\n\n" + _SUPPORT_USER_DESCRIPTION + "\n" + _DIVIDER + "🗓️ Подписка на {duration} месяцев.\n" + "📱 Количество устройств: {devices}\n" + "🏳️ Белые списки: {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" + "📅 Истекает: {expire_date}\n" + "⏳ Осталось: {days_left}\n" + "📊 Трафик: {used_traffic}\n" + "📱 HWID лимит: {hwid_limit}\n" + "🎯 Internal Squads: {squads}\n\n" + _DIVIDER + "🔑 UUID в Remnawave: {remnawave_uuid}" ) ADMIN_TICKET_WITHOUT_RW = ( "🎫 ТИКЕТ T-{ticket_number:04d}\n\n" "👤 Имя: {full_name}\n" "🔗 Username: {username_display}\n" "🆔 Telegram ID: {telegram_id}\n\n" + _DIVIDER + "⚠️ Аккаунт в Remnawave не найден" ) ADMIN_STANDARD_FALLBACK = ( "❌ Что-то пошло не так, обратитесь к логам для подробностей." ) # ============================================================ # ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ # ============================================================ def build_main_menu_text(link: str) -> str: return MAIN_MENU.format(quote=fetch_quote(), link=link)