3
uQh$                 @   sX   d dl Z d dlZd dlZddlmZmZ ddlmZ ejrFddl	m
Z
 G dd dZdS )	    N   )helpersutils)types   )TelegramClientc               @   s^   e Zd ZeddddZejdedddZddddZddd	d
ZddddZ	dS )MessageParseMethodsr   )selfc             C   s   | j S )a  
        This property is the default parse mode used when sending messages.
        Defaults to `telethon.extensions.markdown`. It will always
        be either `None` or an object with ``parse`` and ``unparse``
        methods.

        When setting a different value it should be one of:

        * Object with ``parse`` and ``unparse`` methods.
        * A ``callable`` to act as the parse method.
        * A `str` indicating the ``parse_mode``. For Markdown ``'md'``
          or ``'markdown'`` may be used. For HTML, ``'htm'`` or ``'html'``
          may be used.

        The ``parse`` method should be a function accepting a single
        parameter, the text to parse, and returning a tuple consisting
        of ``(parsed message str, [MessageEntity instances])``.

        The ``unparse`` method should be the inverse of ``parse`` such
        that ``assert text == unparse(*parse(text))``.

        See :tl:`MessageEntity` for allowed message entities.

        Example
            .. code-block:: python

                # Disabling default formatting
                client.parse_mode = None

                # Enabling HTML as the default format
                client.parse_mode = 'html'
        )_parse_mode)r	    r   @/tmp/pip-build-2nz6shyl/telethon/telethon/client/messageparse.py
parse_mode   s    "zMessageParseMethods.parse_mode)r	   modec             C   s   t j|| _d S )N)r   sanitize_parse_moder
   )r	   r   r   r   r   r   4   s    c                sL   y.t j|| j|| j| j|I dH ||< dS  ttfk
rF   dS X dS )z{
        Helper method to replace ``entities[i]`` to mention ``user``,
        or do nothing if it can't be found.
        NTF)r   InputMessageEntityMentionNameoffsetlengthZget_input_entity
ValueError	TypeError)r	   entitiesiuserr   r   r   _replace_with_mention<   s    z)MessageParseMethods._replace_with_mentionc       
         s  |f kr| j }n
tj|}|s&|g fS |}|j|\}}|rP| rP| rPtdxttt|D ]}|| }|js|||= qbt	|t
jrtjd|j}|r|jdrt|jdn|j}| j|||I dH }	|	s||= qbt	|t
jt
jfrb| j|||jI dH }	|	sb||= qbW ||fS )zY
        Returns a (parsed message, entities) tuple depending on ``parse_mode``.
        zFailed to parse messagez^@|\+|tg://user\?id=(\d+)r   N)r
   r   r   parser   reversedrangelenr   
isinstancer   ZMessageEntityTextUrlrematchurlgroupintr   ZMessageEntityMentionNamer   Zuser_id)
r	   messager   Zoriginal_messageZmsg_entitiesr   emr   Z
is_mentionr   r   r   _parse_message_textJ   s4    


z'MessageParseMethods._parse_message_textc       
         s  t |tjr|jg}i }n8t |tjtjfrN|j}dd tj|j	|j
D }ndS i i  x|D ]}t |tjr|j|j< qbt |tjtjfr|jj| || t|dstj|r|j |jj< n|jS qbt |tjotj|jtjjkr6|jj| || t|dr|j |jj< n|j|jjkr|jS qbt |tjrtj|jtj|jjkr|j|jjkr|jj| || |jS qbt |tjr|jj| || |j |jj< qbt |tjrb|j j!j|j"krbtj#|jtj$|jtj%|j!|j&dd}|j| || |S qbW |dkr S t |t't(fr2|n
t)|dd}|dkr`| j*t+ j,d|| dS tj|s j-j-|}	|	s| j*t+ j,d|| |	S y fd	d
|D S  t.k
r   | j*t+ j,d|| Y nX  fdd
|D S )a&  
        Extracts the response message known a request and Update result.
        The request may also be the ID of the message to match.

        If ``request is None`` this method returns ``{id: message}``.

        If ``request.random_id`` is a list, this method returns a list too.
        c             S   s   i | ]}|t j|qS r   )r   get_peer_id).0xr   r   r   
<dictcomp>   s   z=MessageParseMethods._get_response_message.<locals>.<dictcomp>N	random_id)pollresults)idpeer_idmediaz;No random_id in %s to map to, returning None message for %sz)Request %s had missing message mapping %sc                s   g | ]} |  qS r   r   )r(   rnd)id_to_messagerandom_to_idr   r   
<listcomp>   s    z=MessageParseMethods._get_response_message.<locals>.<listcomp>z*Request %s had missing message mappings %sc                s&   g | ]}|kr j | nd qS )N)get)r(   r1   )r2   r3   r   r   r4      s   )/r   r   ZUpdateShortupdateZUpdatesZUpdatesCombinedupdates	itertoolschainZusersZchatsZUpdateMessageIDr.   r+   ZUpdateNewChannelMessageZUpdateNewMessager#   Z_finish_inithasattrr   Zis_list_likeZUpdateEditMessager   Z_entity_typeZpeerZ_EntityTypeZCHANNELZUpdateEditChannelMessager'   r/   ZUpdateNewScheduledMessageZUpdateMessagePollr0   r,   Zpoll_idMessageZget_peerZMessageMediaPollr-   r"   listgetattr_log__name__warningr5   KeyError)
r	   requestresultZ
input_chatr7   r   r6   r%   r+   msgr   )r2   r3   r   _get_response_messageq   s    		


 




	
z)MessageParseMethods._get_response_messageN)
r?   
__module____qualname__propertyr   setterstrr   r&   rE   r   r   r   r   r      s   #'r   )r8   r   typing r   r   tlr   ZTYPE_CHECKINGZtelegramclientr   r   r   r   r   r   <module>   s   