55 lines
2.0 KiB
Python
55 lines
2.0 KiB
Python
"""Small compatibility fixes for Kurigram versions with incomplete rich-text parsing."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
|
|
def _plain_text(value: Any) -> str:
|
|
if isinstance(value, str):
|
|
return value
|
|
if isinstance(value, (list, tuple)):
|
|
return "".join(_plain_text(item) for item in value)
|
|
nested = getattr(value, "text", None)
|
|
if nested is not None and nested is not value:
|
|
return _plain_text(nested)
|
|
return str(value)
|
|
|
|
|
|
def install_kurigram_compat() -> None:
|
|
"""Patch nested hashtag-like entities in Kurigram 2.2.x.
|
|
|
|
Kurigram's parser assumes TextMention/TextHashtag/TextCashtag/TextBotCommand
|
|
contain TextPlain. Telegram can legally nest formatting there, so the
|
|
parsed RichText object is passed to ``lstrip`` and message parsing crashes.
|
|
"""
|
|
from pyrogram import raw, types
|
|
from pyrogram.types.messages_and_media.rich_text import RichText
|
|
|
|
if getattr(RichText, "_nested_entity_compat", False):
|
|
return
|
|
|
|
original = RichText._parse
|
|
|
|
async def patched(client: Any, rich_text: Any, users: dict = {}, chats: dict = {}):
|
|
try:
|
|
return await original(client, rich_text, users, chats)
|
|
except AttributeError as exc:
|
|
if "lstrip" not in str(exc):
|
|
raise
|
|
|
|
handlers = (
|
|
(raw.types.TextMention, types.RichTextMention, "@", "username"),
|
|
(raw.types.TextHashtag, types.RichTextHashtag, "#", "hashtag"),
|
|
(raw.types.TextCashtag, types.RichTextCashtag, "$", "cashtag"),
|
|
(raw.types.TextBotCommand, types.RichTextBotCommand, "/", "bot_command"),
|
|
)
|
|
for raw_type, rich_type, prefix, field in handlers:
|
|
if isinstance(rich_text, raw_type):
|
|
content = await patched(client, rich_text.text, users, chats)
|
|
return rich_type(text=content, **{field: _plain_text(content).lstrip(prefix)})
|
|
raise
|
|
|
|
RichText._parse = staticmethod(patched)
|
|
RichText._nested_entity_compat = True
|