from __future__ import annotations
from html import escape
from typing import Dict, Optional
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
DEFAULT_LANGUAGE = "ru"
SUPPORTED_LANGUAGES = ("ru", "uk")
Language = str
SERVICES_RU = (
"🌐 1. Покупка/продажа криптовалюты за наличные — лучшие условия "
"во всех странах и крупных городах.\n\n"
"💸 2. Перестановка наличных — выдача день в день.\n\n"
"💳 3. Оплата на карты\n\n"
"• Покупка/продажа криптовалюты.\n\n"
"• Оплата на карты EUR, TRY, KZT, PLN, THB.\n\n"
"• Оплата физ.лиц (со счетов в ЕС): USD, EUR, GBP через Wise, Paysera, Revolut, ZEN.\n\n"
"• Прием/оплата UAH: ТОВ, ФОП, физлица.\n\n"
"• Оплата по ссылкам: Visa, Mastercard, American Express.\n\n"
"• Оплата Инвойсов (USD, EUR): товар, логистика, маркетинг, IT, Консалтинг, "
"тур. услуги, авто (Copart, IAAI), оплата авто в ЕС.\n\n"
"🔒 4. Электронные деньги и платежные системы\n\n"
"• Payeer, Capitalist, Perfect Money, Skrill, AdvCash, Payoneer.\n\n"
"• Оплата Юань на карты: AliPay, WeChat Pay."
)
SERVICES_UK = (
"🌐 1. Купівля/продаж криптовалюти за готівку — найкращі умови "
"в усіх країнах і великих містах.\n\n"
"💸 2. Перестановка готівки — видача в той же день.\n\n"
"💳 3. Оплата на картки\n\n"
"• Купівля/продаж криптовалюти.\n\n"
"• Оплата на картки EUR, TRY, KZT, PLN, THB.\n\n"
"• Оплата фіз.осіб (з рахунків в ЄС): USD, EUR, GBP через Wise, Paysera, Revolut, ZEN.\n\n"
"• Прийом/оплата UAH: ТОВ, ФОП, фізособи.\n\n"
"• Оплата за посиланнями: Visa, Mastercard, American Express.\n\n"
"• Оплата інвойсів (USD, EUR): товар, логістика, маркетинг, IT, консалтинг, "
"тур. послуги, авто (Copart, IAAI), оплата авто в ЄС.\n\n"
"🔒 4. Електронні гроші та платіжні системи\n\n"
"• Payeer, Capitalist, Perfect Money, Skrill, AdvCash, Payoneer.\n\n"
"• Оплата юаня на картки: AliPay, WeChat Pay."
)
TEXTS: Dict[str, Dict[str, str]] = {
"ru": {
"welcome": (
"Здравствуйте!\n\n"
"Напишите ваш запрос — менеджер ответит здесь.\n\n"
"Укажите что конкретно вам нужно сделать.\n\n"
"🔶 Все наши услуги посмотрите по кнопке ниже."
),
"ack": "Спасибо, подождите ответ.",
"cooldown": "Подождите немного, не спамьте.",
"send_failed": (
"Не удалось отправить сообщение менеджеру. Попробуйте позже."
),
"choose_language": "Выберите язык / Оберіть мову:",
"language_set": "Язык сохранён: русский.",
"prefix_bot": "Бот:",
"prefix_manager": "Менеджер:",
"lang_button": "Ru",
"services_button": "Список услуг",
"services": SERVICES_RU,
"client_blocked": (
"⚠️ Клиент заблокировал бота. Сообщение не доставлено."
),
"deliver_failed": "⚠️ Не удалось доставить сообщение клиенту.",
"edit_failed": "⚠️ Не удалось обновить сообщение у клиента.",
"deleted_notice": "🗑 Сообщение удалено.",
},
"uk": {
"welcome": (
"Вітаємо!\n\n"
"Напишіть ваш запит — менеджер відповість тут.\n\n"
"Вкажіть, що саме вам потрібно зробити.\n\n"
"🔶 Всі наші послуги подивіться по кнопці нижче."
),
"ack": "Дякуємо, зачекайте на відповідь.",
"cooldown": "Зачекайте трохи, не спамте.",
"send_failed": (
"Не вдалося надіслати повідомлення менеджеру. Спробуйте пізніше."
),
"choose_language": "Оберіть мову / Выберите язык:",
"language_set": "Мову збережено: українська.",
"prefix_bot": "Бот:",
"prefix_manager": "Менеджер:",
"lang_button": "Ukr",
"services_button": "Список послуг",
"services": SERVICES_UK,
"client_blocked": (
"⚠️ Клієнт заблокував бота. Повідомлення не доставлено."
),
"deliver_failed": "⚠️ Не вдалося доставити повідомлення клієнту.",
"edit_failed": "⚠️ Не вдалося оновити повідомлення у клієнта.",
"deleted_notice": "🗑 Повідомлення видалено.",
},
}
def normalize_language(language: Optional[str]) -> Optional[str]:
if language is None:
return None
code = language.strip().lower()
if code in SUPPORTED_LANGUAGES:
return code
return None
def resolve_language(language: Optional[str]) -> str:
return normalize_language(language) or DEFAULT_LANGUAGE
def t(language: Optional[str], key: str) -> str:
lang = resolve_language(language)
return TEXTS[lang][key]
def format_prefix(language: Optional[str], key: str) -> str:
return f"{escape(t(language, key))}"
def format_labeled_message(label: str, text: str) -> str:
"""Label + plain text body (body is escaped)."""
return f"{escape(label)}\n\n{escape(text)}"
def format_labeled_html(label: str, html_body: str) -> str:
"""Label + pre-formatted HTML body (body is not escaped)."""
return f"{escape(label)}\n\n{html_body}"
def format_bot_message(language: Optional[str], text: str) -> str:
return format_labeled_message(t(language, "prefix_bot"), text)
def format_bot_html(language: Optional[str], html_body: str) -> str:
"""Bot prefix + pre-formatted HTML body (not escaped)."""
return f"{format_prefix(language, 'prefix_bot')}\n\n{html_body}"
def format_manager_message(language: Optional[str], text: str) -> str:
return format_labeled_message(t(language, "prefix_manager"), text)
def format_manager_html(language: Optional[str], html_body: str) -> str:
return format_labeled_html(t(language, "prefix_manager"), html_body)
def language_keyboard() -> InlineKeyboardMarkup:
return InlineKeyboardMarkup(
inline_keyboard=[
[
InlineKeyboardButton(
text=TEXTS[code]["lang_button"],
callback_data=f"lang:{code}",
)
]
for code in SUPPORTED_LANGUAGES
]
)
def services_keyboard(language: Optional[str]) -> InlineKeyboardMarkup:
return InlineKeyboardMarkup(
inline_keyboard=[
[
InlineKeyboardButton(
text=t(language, "services_button"),
callback_data="services",
)
]
]
)