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 = (
"🔴 Контекст данного взаимодействия сброшен. "
"Данные могут отличаться от указанных вами."
)
# ============================================================
# РЕФЕРАЛЬНАЯ СИСТЕМА
# ============================================================
REFERALS_MENU = (
"👥 Реферальная система\n\n"
f"{MALENIA_COINS} Ваш реферальный баланс: "
"{balance}₽\n"
f"{MALENIA_LINK} Ваша реферальная ссылка: "
"{link}"
)
# ============================================================
# ОФОРМЛЕНИЕ ПОДПИСКИ
# ============================================================
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"
"💰 Реферальный баланс: {balance}"
)
_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)