L iIdZddlZddlZddlmZddlmZmZmZm Z ddl m Z ddl m Z ddlmZddlmZdd lmZdd lmZdd lmZerdd l mZed ZGdd e Zy)zHThis module contains an object that represents a Telegram MessageEntity.N)Sequence) TYPE_CHECKINGFinalOptionalUnion) constants)TelegramObject)User)enum)de_json_optional) TextEncoding)JSONDict)Bot MessageEntityceZdZUdZdZ d.dddedededeed eed eed eed ee ffd Z e d/de dedddffd Z e dededefdZe deeefdedefdZe deeeefeeeeffdeeeffdZeej.Zeeeed< ej.j6Zeeed< ej.j8Zeeed< ej.j:Zeeed< ej.j<Zeeed< ej.j>Zeeed< ej.j@Z eeed < ej.jBZ!eeed!< ej.jDZ"eeed"< ej.jFZ#eeed#< ej.jHZ$eeed$< ej.jJZ%eeed%< ej.jLZ&eeed&< ej.jNZ'eeed'< ej.jPZ(eeed(< ej.jRZ)eeed)< ej.jTZ*eeed*< ej.jVZ+eeed+< ej.jXZ,eeed,< ej.jZZ-eeed-<xZ.S)0ra This object represents one special entity in a text message. For example, hashtags, usernames, URLs, etc. Objects of this class are comparable in terms of equality. Two objects of this class are considered equal, if their :attr:`type`, :attr:`offset` and :attr:`length` are equal. Args: type (:obj:`str`): Type of the entity. Can be :attr:`MENTION` (``@username``), :attr:`HASHTAG` (``#hashtag`` or ``#hashtag@chatusername``), :attr:`CASHTAG` (``$USD`` or ``USD@chatusername``), :attr:`BOT_COMMAND` (``/start@jobs_bot``), :attr:`URL` (``https://telegram.org``), :attr:`EMAIL` (``do-not-reply@telegram.org``), :attr:`PHONE_NUMBER` (``+1-212-555-0123``), :attr:`BOLD` (**bold text**), :attr:`ITALIC` (*italic text*), :attr:`UNDERLINE` (underlined text), :attr:`STRIKETHROUGH`, :attr:`SPOILER` (spoiler message), :attr:`BLOCKQUOTE` (block quotation), :attr:`CODE` (monowidth string), :attr:`PRE` (monowidth block), :attr:`TEXT_LINK` (for clickable text URLs), :attr:`TEXT_MENTION` (for users without usernames), :attr:`CUSTOM_EMOJI` (for inline custom emoji stickers). .. versionadded:: 20.0 Added inline custom emoji .. versionadded:: 20.8 Added block quotation offset (:obj:`int`): Offset in UTF-16 code units to the start of the entity. length (:obj:`int`): Length of the entity in UTF-16 code units. url (:obj:`str`, optional): For :attr:`TEXT_LINK` only, url that will be opened after user taps on the text. user (:class:`telegram.User`, optional): For :attr:`TEXT_MENTION` only, the mentioned user. language (:obj:`str`, optional): For :attr:`PRE` only, the programming language of the entity text. custom_emoji_id (:obj:`str`, optional): For :attr:`CUSTOM_EMOJI` only, unique identifier of the custom emoji. Use :meth:`telegram.Bot.get_custom_emoji_stickers` to get full information about the sticker. .. versionadded:: 20.0 Attributes: type (:obj:`str`): Type of the entity. Can be :attr:`MENTION` (``@username``), :attr:`HASHTAG` (``#hashtag`` or ``#hashtag@chatusername``), :attr:`CASHTAG` (``$USD`` or ``USD@chatusername``), :attr:`BOT_COMMAND` (``/start@jobs_bot``), :attr:`URL` (``https://telegram.org``), :attr:`EMAIL` (``do-not-reply@telegram.org``), :attr:`PHONE_NUMBER` (``+1-212-555-0123``), :attr:`BOLD` (**bold text**), :attr:`ITALIC` (*italic text*), :attr:`UNDERLINE` (underlined text), :attr:`STRIKETHROUGH`, :attr:`SPOILER` (spoiler message), :attr:`BLOCKQUOTE` (block quotation), :attr:`CODE` (monowidth string), :attr:`PRE` (monowidth block), :attr:`TEXT_LINK` (for clickable text URLs), :attr:`TEXT_MENTION` (for users without usernames), :attr:`CUSTOM_EMOJI` (for inline custom emoji stickers). .. versionadded:: 20.0 Added inline custom emoji .. versionadded:: 20.8 Added block quotation offset (:obj:`int`): Offset in UTF-16 code units to the start of the entity. length (:obj:`int`): Length of the entity in UTF-16 code units. url (:obj:`str`): Optional. For :attr:`TEXT_LINK` only, url that will be opened after user taps on the text. user (:class:`telegram.User`): Optional. For :attr:`TEXT_MENTION` only, the mentioned user. language (:obj:`str`): Optional. For :attr:`PRE` only, the programming language of the entity text. custom_emoji_id (:obj:`str`): Optional. For :attr:`CUSTOM_EMOJI` only, unique identifier of the custom emoji. Use :meth:`telegram.Bot.get_custom_emoji_stickers` to get full information about the sticker. .. versionadded:: 20.0 )custom_emoji_idlanguagelengthoffsettypeurluserN api_kwargsrrrrrrrrc>t ||tjtj |||_||_||_||_ ||_ ||_ ||_ |j |j|jf|_ |jy)Nr)super__init__r get_memberrMessageEntityTyperrrrrrr _id_attrs_freeze) selfrrrrrrrr __class__s ]/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/telegram/_messageentity.pyrzMessageEntity.__init__qs} J/)D)DdDQ ! ! "%$( '/ .=))T[[$++> databotrreturnc|j|}t|jdt||d<t|||S)z,See :meth:`telegram.TelegramObject.de_json`.r)r&r') _parse_datar getr rde_json)clsr&r'r#s r$r,zMessageEntity.de_jsonsAt$'(8$DV wDc22r%textentitiesc&ttjd|D}d}i}t|D]L\}}|dkDr||dz nd}|||}|t |j t jdzz }|||<Ng} |D]}} || j} || j| jz| z } tj| } | j5| | _| | _ ddd| j| | S#1swYxYw)uUtility functionality for converting the offset and length of entities from Unicode (:obj:`str`) to UTF-16 (``utf-16-le`` encoded :obj:`bytes`). Tip: Only the offsets and lengths calulated in UTF-16 is acceptable by the Telegram Bot API. If they are calculated using the Unicode string (:obj:`str` object), errors may occur when the text contains characters that are not in the Basic Multilingual Plane (BMP). For more information, see `Unicode `_ and `Plane (Unicode) `_. .. versionadded:: 21.4 Examples: Below is a snippet of code that demonstrates how to use this function to convert entities from Unicode to UTF-16 space. The ``unicode_entities`` are calculated in Unicode and the `utf_16_entities` are calculated in UTF-16. .. code-block:: python text = "𠌕 bold 𝄢 italic underlined: 𝛙𝌢𑁍" unicode_entities = [ MessageEntity(offset=2, length=4, type=MessageEntity.BOLD), MessageEntity(offset=9, length=6, type=MessageEntity.ITALIC), MessageEntity(offset=28, length=3, type=MessageEntity.UNDERLINE), ] utf_16_entities = MessageEntity.adjust_message_entities_to_utf_16( text, unicode_entities ) await bot.send_message( chat_id=123, text=text, entities=utf_16_entities, ) # utf_16_entities[0]: offset=3, length=4 # utf_16_entities[1]: offset=11, length=6 # utf_16_entities[2]: offset=30, length=6 Args: text (:obj:`str`): The text that the entities belong to entities (Sequence[:class:`telegram.MessageEntity`]): Sequence of entities with offset and length calculated in Unicode Returns: Sequence[:class:`telegram.MessageEntity`]: Sequence of entities with offset and length calculated in UTF-16 encoding c3fK|])}|j|j|jzf+ywN)rr).0xs r$ zBMessageEntity.adjust_message_entities_to_utf_16..s',_QRahh1888K-L,_s/1rN) sorted itertoolschain enumeratelenencoder UTF_16_LErrcopy _unfrozenappend)r.r/ positionsaccumulated_lengthposition_translationiposition last_position text_sliceoutentitytranslated_positionstranslated_length new_entitys r$!adjust_message_entities_to_utf_16z/MessageEntity.adjust_message_entities_to_utf_16s6b9??,_V^,_`a 02$Y/ @KAx01AIa!e,1MmH5J #j&7&7 8N8N&O"PTU"U U -?  *  @  #F#7 #F $V]]V]]%BCFZZ 6*J%%' 6$8 !$5 ! 6 JJz " #  6 6s DD byc6t|tr|nt|jddz}g}|D]V}t j|}|j 5|xj |z c_ddd|j|X|S#1swYxYw)uUtility functionality for shifting the offset of entities by a given amount. Examples: Shifting by an integer amount: .. code-block:: python text = "Hello, world!" entities = [ MessageEntity(offset=0, length=5, type=MessageEntity.BOLD), MessageEntity(offset=7, length=5, type=MessageEntity.ITALIC), ] shifted_entities = MessageEntity.shift_entities(1, entities) await bot.send_message( chat_id=123, text="!" + text, entities=shifted_entities, ) Shifting using a string: .. code-block:: python text = "Hello, world!" prefix = "𝄢" entities = [ MessageEntity(offset=0, length=5, type=MessageEntity.BOLD), MessageEntity(offset=7, length=5, type=MessageEntity.ITALIC), ] shifted_entities = MessageEntity.shift_entities(prefix, entities) await bot.send_message( chat_id=123, text=prefix + text, entities=shifted_entities, ) Tip: The :paramref:`entities` are *not* modified in place. The function returns a sequence of new objects. .. versionadded:: 21.5 Args: by (:obj:`str` | :obj:`int`): Either the amount to shift the offset by or a string whose length will be used as the amount to shift the offset by. In this case, UTF-16 encoding will be used to calculate the length. entities (Sequence[:class:`telegram.MessageEntity`]): Sequence of entities Returns: Sequence[:class:`telegram.MessageEntity`]: Sequence of entities with the offset shifted z utf-16-ler7N) isinstanceintr<r=r?r@rrA)rOr/effective_shiftrIrJrMs r$shift_entitieszMessageEntity.shift_entitiessj!+2s 3"RYY{=S9TXY9Y #F6*J%%' 5!!_4! 5 JJz "  #   5 5s BB argscd}g}|D]Y}|d|d}}t|dkDr|ddur|j||}|j|j||||z }[||fS)u Utility functionality for concatenating two text along with their formatting entities. Tip: This function is useful for prefixing an already formatted text with a new text and its formatting entities. In particular, it automatically correctly handles UTF-16 encoding. Examples: This example shows a callback function that can be used to add a prefix and suffix to the message in a :class:`~telegram.ext.CallbackQueryHandler`: .. code-block:: python async def prefix_message(update: Update, context: ContextTypes.DEFAULT_TYPE): prefix = "𠌕 bold 𝄢 italic underlined: 𝛙𝌢𑁍 | " prefix_entities = [ MessageEntity(offset=2, length=4, type=MessageEntity.BOLD), MessageEntity(offset=9, length=6, type=MessageEntity.ITALIC), MessageEntity(offset=28, length=3, type=MessageEntity.UNDERLINE), ] suffix = " | 𠌕 bold 𝄢 italic underlined: 𝛙𝌢𑁍" suffix_entities = [ MessageEntity(offset=5, length=4, type=MessageEntity.BOLD), MessageEntity(offset=12, length=6, type=MessageEntity.ITALIC), MessageEntity(offset=31, length=3, type=MessageEntity.UNDERLINE), ] message = update.effective_message first = (prefix, prefix_entities, True) second = (message.text, message.entities) third = (suffix, suffix_entities, True) new_text, new_entities = MessageEntity.concatenate(first, second, third) await update.callback_query.edit_message_text( text=new_text, entities=new_entities, ) Hint: The entities are *not* modified in place. The function returns a new sequence of objects. .. versionadded:: 21.5 Args: *args (tuple[:obj:`str`, Sequence[:class:`telegram.MessageEntity`]] | tuple[:obj:`str`, Sequence[:class:`telegram.MessageEntity`], :obj:`bool`]): Arbitrary number of tuples containing the text and its entities to concatenate. If the last element of the tuple is a :obj:`bool`, it is used to determine whether to adjust the entities to UTF-16 via :meth:`adjust_message_entities_to_utf_16`. UTF-16 adjustment is disabled by default. Returns: tuple[:obj:`str`, Sequence[:class:`telegram.MessageEntity`]]: The concatenated text and its entities rr6r7T)r<rNextendrT)r-rU output_textoutput_entitiesargr.r/s r$ concatenatezMessageEntity.concatenatesz /1 C VSV(D3x!|A$@@xP  " "3#5#5k8#L M 4 K O++r% ALL_TYPES BLOCKQUOTEBOLD BOT_COMMANDCASHTAGCODE CUSTOM_EMOJIEMAILEXPANDABLE_BLOCKQUOTEHASHTAGITALICMENTION PHONE_NUMBERPRESPOILER STRIKETHROUGH TEXT_LINK TEXT_MENTION UNDERLINEURL)NNNNr2)/__name__ __module__ __qualname____doc__ __slots__strrRrr rr classmethodr, staticmethod_SEMrNrrTtupleboolr\listrrr]r__annotations__r^r_r`rarbrcrdrerfrgrhrirjrkrlrmrnrorp __classcell__)r#s@r$rr(sDL[I"#"&)-*.  c]  tn 3-"#X&6383(5/3_33FFtFFFP<5c?<d<t<<|G,U39%uS$_'==>G, sDy G,G,R#'y'B'B"CIuT#YCI&88CCJc C!2277D%*7<'99EEKsEC#55==GU3Z=? 2277D%*7<(::GGL%*G"3399E5:9=(1(C(C(Y(Y5:Y$55==GU3Z=?"44;;FE#J;>#55==GU3Z=?(::GGL%*GD1155Cs5;#55==GU3Z=!* ; ; I IM5:IE%77AAIuSzAA(::GGL%*GD%77AAIuSzAA1155Cs5;r%)rtr?r9collections.abcrtypingrrrrtelegramrtelegram._telegramobjectr telegram._userr telegram._utilsr telegram._utils.argumentparsingr telegram._utils.stringsr telegram._utils.typesrrryrr%r$rsM&O $883 <0* r