Парсинг и создание форматированного текста¶
Telegram использует сложную систему entities для форматирования текста (жирный, курсив, ссылки и т.д.). CactusLib предоставляет мощные парсеры, которые полностью абстрагируют эту систему, позволяя вам работать с привычными HTML или Markdown.
Большинство плагинов теряют форматированный текст команды от пользователя и обрабатывают обычный текст. Это может привести к проблемам с форматированием, если пользователь использует форматирование в своих сообщениях.
Примеры¶
1. Прочитать форматирование сообщения и добавить к нему текст
class MyPlugin(CactusUtils.Plugin):
@command(doc="Добавляет подпись к ответному сообщению")
def sign(self, cmd: CactusUtils.Command):
# Проверяем, что это ответ на сообщение
reply = cmd.params.replyToMsg
if not reply:
cmd.answer("Ответьте на сообщение, которое нужно подписать.")
return HookResult(strategy=HookStrategy.CANCEL)
# 1. Получаем текст и entities из сообщения
original_text = reply.messageOwner.message
original_entities = list(reply.messageOwner.entities.toArray())
# 2. Конвертируем их в удобный HTML
html_text = self.utils.HTML.unparse(original_text, original_entities)
# 3. Добавляем свою подпись
signed_html = html_text + "\n\n✍️ <i>Подписано крутым кактусом</i>"
# 4. Отправляем новое сообщение, CactusLib автоматически его распарсит
cmd.answer(signed_html)
return HookResult(strategy=HookResult.CANCEL)
Как это работает: Вместо того чтобы работать со сложными entities, мы конвертируем их в простой HTML, дописываем что нужно, а затем cmd.answer (который по умолчанию использует HTML-парсер) делает всю работу по обратной конвертации.
2. Создание сообщения с форматированием из кода
class MyPlugin(CactusUtils.Plugin):
@command(doc="Показывает информацию о пользователе")
def whois(self, cmd: CactusUtils.Command):
# Предположим, мы получили данные пользователя
user_id = 12345
user_name = "John Doe"
user_premium = True
# Собираем HTML-строку
text = f"<b>Информация о пользователе:</b>\n"
text += f" • <b>ID:</b> <code>{user_id}</code>\n"
text += f" • <b>Имя:</b> {self.utils.escape_html(user_name)}\n"
if user_premium:
# <emoji> - премиум-эмодзи
text += " • <b>Статус:</b> <emoji id=5807614228864962198>👑</emoji> Premium"
# Просто отправляем собранную строку
cmd.answer(text)
return HookResult(strategy=HookStrategy.CANCEL)
3. Просмотр форматированного текста от пользователя и добавление к нему текста
class MyPlugin(CactusUtils.Plugin):
@command(doc="Добавляет подпись к вашему сообщению")
def append(self, cmd: CactusUtils.Command):
# Получаем текст и entities из "отправляемого" сообщения
html_text = cmd.html()
html_text += "\n\n✍️ <i>Подписано крутым кактусом</i>"
# Просто отправляем измененную строку
cmd.answer(html_text)
return HookResult(strategy=HookStrategy.CANCEL)