o
    Xzjë  ã                   @   sV   d dl Z d dlZd dlZd dlZddlmZ ddlmZ ddlm	Z	 G dd„ dƒZ
dS )é    Né   )Ú	TLRequest)ÚMessageContainer)Ú	TLMessagec                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚMessagePackeraN  
    This class packs `RequestState` as outgoing `TLMessages`.

    The purpose of this class is to support putting N `RequestState` into a
    queue, and then awaiting for "packed" `TLMessage` in the other end. The
    simplest case would be ``State -> TLMessage`` (1-to-1 relationship) but
    for efficiency purposes it's ``States -> Container`` (N-to-1).

    This addresses several needs: outgoing messages will be smaller, so the
    encryption and network overhead also is smaller. It's also a central
    point where outgoing requests are put, and where ready-messages are get.
    c                 C   s(   || _ t ¡ | _t ¡ | _|t | _d S ©N)	Ú_stateÚcollectionsÚdequeÚ_dequeÚasyncioÚEventÚ_readyÚ__name__Ú_log)ÚselfÚstateÚloggers© r   ú\/var/www/kodo/tsheker/venv/lib/python3.10/site-packages/telethon/extensions/messagepacker.pyÚ__init__   s   

zMessagePacker.__init__c                 C   ó   | j  |¡ | j ¡  d S r   )r   Úappendr   Úset)r   r   r   r   r   r      ó   zMessagePacker.appendc                 C   r   r   )r   Úextendr   r   )r   Ústatesr   r   r   r   #   r   zMessagePacker.extendc                 Ã   sv  �| j s| j ¡  | j ¡ I dH  t ¡ }g }d}| j r†t|ƒtjkr†| j  	¡ }|t|j
ƒtj 7 }|tjkrd| jj||j
t|jtƒ|jrI|jjndd�|_| |¡ | j d|j|jjjt|jƒ¡ q|rm| j  |¡ n| j d|jjjt|j
ƒ¡ |j tdƒ¡ d}q|sŠdS t|ƒdkr³t  !d	tj"t|ƒ¡| #¡  }t ¡ }| jj||d
d�}|D ]}||_$q­| #¡ }||fS )zÌ
        Returns (batch, data) if one or more items could be retrieved.

        If the cancellation occurs or only invalid items were in the
        queue, (None, None) will be returned instead.
        Nr   )Úafter_idzAssigned msg_id = %d to %s (%x)z:Message payload for %s is too long (%d) and cannot be sentzRequest payload is too big)NNé   z<IiF)Úcontent_related)%r   r   ÚclearÚwaitÚioÚBytesIOÚlenr   ÚMAXIMUM_LENGTHÚpopleftÚdatar   ÚSIZE_OVERHEADÚMAXIMUM_SIZEr   Úwrite_data_as_messageÚ
isinstanceÚrequestr   ÚafterÚmsg_idr   r   ÚdebugÚ	__class__r   ÚidÚ
appendleftÚwarningÚfutureÚset_exceptionÚ
ValueErrorÚstructÚpackÚCONSTRUCTOR_IDÚgetvalueÚcontainer_id)r   ÚbufferÚbatchÚsizer   r'   r;   Úsr   r   r   Úget'   sb   €


þ
þþÿÿþÿzMessagePacker.getN)r   Ú
__module__Ú__qualname__Ú__doc__r   r   r   r@   r   r   r   r   r      s    r   )r   r	   r"   r7   Útlr   Útl.core.messagecontainerr   Útl.core.tlmessager   r   r   r   r   r   Ú<module>   s    