from misc.utils import fetch_quote from db.models.tickets import TicketStatus 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}' ## EMOJIS MALENIA_LOGO = PremiumEmoji(5265053829522562789, "☀️") MALENIA_HEART = PremiumEmoji(5276516908257025723, "❤️") MALENIA_LINK = PremiumEmoji(5276012730636082950, "🔗") MALENIA_COINS = PremiumEmoji(5276298354551199712, "🪙") MALENIA_LOCKED = PremiumEmoji(5276346642868508688, "🔒") MALENIA_SUPPORT = PremiumEmoji(5275968088746006467, "🎧") ## MAPPING TICKET_STATUS_EMOJIS = { TicketStatus.CLOSED.value: "🔴", TicketStatus.OPEN.value: "🟢", TicketStatus.PENDING.value: "🟡", } ## TEXTS MAIN_MENU = ( str(MALENIA_LOGO) + " Malenia — {quote}\n\n" + f"{MALENIA_COINS} Личный кабинет" ) STANDARD_FALLBACK = ( "❌ Что-то пошло не так, прожмите /start и повторите попытку позже." ) GENERAL_PROCESSING = "⏳ Выполняю..." SUPPORT_INIT = f"{MALENIA_SUPPORT} Что-то не работает? Жалоба? Предложение?\n— всё сюда, желательно со скриншотами. Чем детальнее описание, тем быстрее ответ.\n\n❌ Для отмены — /cancel" SUPPORT_MSG_SENT = "⏳ Сообщение отправлено. Для выхода — /cancel, вы можете вернуться сюда из главного меню в любое время." SUPPORT_SIGNATURE = "✍️ Сообщение от технической поддержки:" ADMIN_TICKET_WITH_RW = ( "🎫 ТИКЕТ T-{ticket_number:04d}\n\n" "👤 Имя: {full_name}\n" "🔗 Username: {username_display}\n" "🆔 Telegram ID: {telegram_id}\n\n" "━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" "📋 ПОДПИСКА 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" "━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" "🔑 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" "━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" "⚠️ Аккаунт в Remnawave не найден" ) ADMIN_STANDARD_FALLBACK = ( "❌ Что-то пошло не так, обратитесь к логам для подробностей." ) ## FUNCTIONS def build_main_menu_text() -> str: return MAIN_MENU.format(quote=fetch_quote()) NO_USERNAME = "нет юзернейма" 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} дн. DAYS_LEFT_POSITIVE = "{days} дн." # Когда подписка уже истекла DAYS_LEFT_EXPIRED = "истекла {days} дн. назад" # Когда подписка истекает сегодня DAYS_LEFT_TODAY = "истекает сегодня" # Когда нет username в Telegram NO_USERNAME = "нет username" # Формат отображения username (с @) USERNAME_DISPLAY = "@{username}" # Когда у пользователя нет Internal Squads NO_SQUADS = "нет" # Когда лимит HWID не установлен (0 или None) UNLIMITED_HWID = "без ограничений" # Когда лимит трафика не установлен NO_TRAFFIC_LIMIT = "без ограничений" # Шаблон для отображения трафика с лимитом: {used} / {limit} TRAFFIC_WITH_LIMIT = "{used} / {limit}" # Шаблон для отображения трафика без лимита: {used} TRAFFIC_NO_LIMIT = "{used}"