U
    gT                     @   s   d Z dZddlZddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZ er\ddlmZmZ dee
ee ed
ddZeeef eedddZdeeef ee
edddZed ee dddZdeee eedddZdS )zThis module contains convenience helper functions.

.. versionchanged:: 20.0
   Previously, the contents of this module were available through the (no longer existing)
   module ``telegram.utils.helpers``.
)create_deep_linked_urleffective_message_typeescape_markdownmention_htmlmention_markdown    Nescape)TYPE_CHECKINGOptionalUnion)MarkdownVersion)MessageTypeMessageUpdate   )textversionentity_typereturnc                 C   sd   t |dkrd}n6t |dkr@|dkr,d}qH|dkr:d}qHd}ntd	td
t| dd| S )a  Helper function to escape telegram markup symbols.

    .. versionchanged:: 20.3
        Custom emoji entity escaping is now supported.

    Args:
        text (:obj:`str`): The text.
        version (:obj:`int` | :obj:`str`): Use to specify the version of telegrams Markdown.
            Either ``1`` or ``2``. Defaults to ``1``.
        entity_type (:obj:`str`, optional): For the entity types
            :tg-const:`telegram.MessageEntity.PRE`, :tg-const:`telegram.MessageEntity.CODE` and
            the link part of :tg-const:`telegram.MessageEntity.TEXT_LINK` and
            :tg-const:`telegram.MessageEntity.CUSTOM_EMOJI`, only certain characters need to be
            escaped in :tg-const:`telegram.constants.ParseMode.MARKDOWN_V2`. See the `official API
            documentation <https://core.telegram.org/bots/api#formatting-options>`_ for details.
            Only valid in combination with ``version=2``, will be ignored else.
    r   z_*`[   )precodez\`)Z	text_linkZcustom_emojiz\)z\_*[]()~`>#+-=|{}.!z'Markdown version must be either 1 or 2!z([z])z\\\1)int
ValueErrorresubr   )r   r   r   Zescape_chars r   4/tmp/pip-unpacked-wheel-swnnwir2/telegram/helpers.pyr   -   s    r   )user_idnamer   c                 C   s   d|  dt | dS )a  
    Helper function to create a user mention as HTML tag.

    Args:
        user_id (:obj:`int`): The user's id which you want to mention.
        name (:obj:`str`): The name the mention is showing.

    Returns:
        :obj:`str`: The inline mention for the user as HTML.
    z<a href="tg://user?id=z">z</a>r   )r   r    r   r   r   r   P   s    r   )r   r    r   r   c                 C   s>   d|  }|dkr$d| d| dS dt ||d d| dS )a  
    Helper function to create a user mention in Markdown syntax.

    Args:
        user_id (:obj:`int`): The user's id which you want to mention.
        name (:obj:`str`): The name the mention is showing.
        version (:obj:`int` | :obj:`str`): Use to specify the version of Telegram's Markdown.
            Either ``1`` or ``2``. Defaults to ``1``.

    Returns:
        :obj:`str`: The inline mention for the user as Markdown.
    ztg://user?id=r   [z]())r   )r   )r   r    r   Ztg_linkr   r   r   r   ^   s    
r   )entityr   c                 C   sn   ddl m}m} t| |r | }n0t| |r<| js4dS | j}ntdt|  dtD ]}|| rT|  S qTdS )a  
    Extracts the type of message as a string identifier from a :class:`telegram.Message` or a
    :class:`telegram.Update`.

    Args:
        entity (:class:`telegram.Update` | :class:`telegram.Message`): The ``update`` or
            ``message`` to extract from.

    Returns:
        :obj:`str` | :obj:`None`: One of :class:`telegram.constants.MessageType` if the entity
        contains a message that matches one of those types. :obj:`None` otherwise.

    r   r   Nz/The entity is neither Message nor Update (got: r"   )telegramr   r   
isinstanceZeffective_message	TypeErrortyper   )r#   r   r   messageZmessage_typer   r   r   r   q   s    


r   F)bot_usernamepayloadgroupr   c                 C   sv   | dkst | dkrtdd|  }|s.|S t |dkrBtdtd|sVtd|r^d	nd
}| d| d| S )a   
    Creates a deep-linked URL for this :paramref:`~create_deep_linked_url.bot_username` with the
    specified :paramref:`~create_deep_linked_url.payload`. See
    https://core.telegram.org/bots/features#deep-linking to learn more.

    The :paramref:`~create_deep_linked_url.payload` may consist of the following characters:
    ``A-Z, a-z, 0-9, _, -``

    Note:
        Works well in conjunction with
        ``CommandHandler("start", callback, filters=filters.Regex('payload'))``

    Examples:
        * ``create_deep_linked_url(bot.get_me().username, "some-params")``
        * :any:`Deep Linking <examples.deeplinking>`

    Args:
        bot_username (:obj:`str`): The username to link to.
        payload (:obj:`str`, optional): Parameters to encode in the created URL.
        group (:obj:`bool`, optional): If :obj:`True` the user is prompted to select a group to
            add the bot to. If :obj:`False`, opens a one-on-one conversation with the bot.
            Defaults to :obj:`False`.

    Returns:
        :obj:`str`: An URL to start the bot with specific parameters.

    Raises:
        :exc:`ValueError`: If the length of the :paramref:`payload` exceeds 64 characters,
            contains invalid characters, or if the :paramref:`bot_username` is less than 4
            characters.
    N   z&You must provide a valid bot_username.zhttps://t.me/@   z7The deep-linking payload must not exceed 64 characters.z^[A-Za-z0-9_-]+$zVOnly the following characters are allowed for deep-linked URLs: A-Z, a-z, 0-9, _ and -Z
startgroupstart?=)lenr   r   match)r)   r*   r+   base_urlkeyr   r   r   r      s    "
r   )r   N)r   )NF)__doc____all__r   htmlr   typingr	   r
   r   Ztelegram._utils.typesr   Ztelegram.constantsr   r$   r   r   strr   r   r   r   r   boolr   r   r   r   r   <module>   s6        #"     