U
    h$                     @   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_moder	    r   @/tmp/pip-unpacked-wheel-c81u5j2r/telethon/client/messageparse.py
parse_mode   s    "zMessageParseMethods.parse_moder
   modec                 C   s   t || _d S N)r   sanitize_parse_moder   r   r   r   r   r   4   s    c              	      sP   z0t || j|| j| |I dH ||< W dS  ttfk
rJ   Y 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  |dkr| j }n
t|}|s&|g fS |}||\}}|rL|sL|sLtdttt|D ]}|| }|jsv||= q\t	|t
jrtd|j}|r|drt|dn|j}| |||I dH }	|	s||= q\t	|t
jt
jfr\| |||jI dH }	|	s\||= q\||fS )zY
        Returns a (parsed message, entities) tuple depending on ``parse_mode``.
        r   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   s6    
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
D }ndS i i  |D ]}t |tjr~|j|j< q^t |tjtjfr|j| || t|dst|r|j |jj< n
|j  S q^t |tjr<t|jtjjkr<|j| || t|dr |j |jj< n|j|jjkr|j  S q^t |tjrt|jt|jjkr|j|jjkr|j| || |j  S q^t |tjr|j| || |j |jj< q^t |tjr^|j j!j|j"kr^tj#|jt$|jtj%|j!|j&dd}|| || |  S q^|dkr* S t |t't(fr>|n
t)|dd}|dkrl| j*t+ ,d|| dS t|s --|}	|	s| j*t+ ,d|| |	S z fd	d
|D W S  t.k
r   | j*t+ ,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 ||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+   ZrndZid_to_messageZ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  | nd qS r   )getr4   r5   r   r   r6      s   )/r    r   ZUpdateShortupdateZUpdatesZUpdatesCombinedupdates	itertoolschainZusersZchatsZUpdateMessageIDr1   r.   ZUpdateNewChannelMessageZUpdateNewMessager&   Z_finish_inithasattrr   Zis_list_likeZUpdateEditMessager   Z_entity_typeZpeerZ_EntityTypeZCHANNELZUpdateEditChannelMessager*   r2   ZUpdateNewScheduledMessageZUpdateMessagePollr3   r/   Zpoll_idMessageZget_peerZMessageMediaPollr0   r%   listgetattr_log__name__warningr7   KeyError)
r
   requestresultZ
input_chatr9   r   r8   r(   r.   msgr   r5   r   _get_response_messageq   s    	
 	



 

  
  	
  
z)MessageParseMethods._get_response_messageN)
rA   
__module____qualname__propertyr   setterstrr   r)   rG   r   r   r   r   r      s   #'r   )r:   r!   typing r   r   tlr   TYPE_CHECKINGZtelegramclientr   r   r   r   r   r   <module>   s   