U
    ;gk4                     @   s   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Zd dlm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZmZmZmZ d dlmZ d d	lmZmZmZmZ d
dlmZmZ e e!Z"G dd dZ#G dd dZ$dS )    N)sha1)BytesIO)raw)
Connection)mtproto)RPCErrorInternalServerErrorAuthKeyDuplicated	FloodWaitServiceUnavailableBadMsgNotificationSecurityCheckMismatch)layer)TLObjectMsgContainerIntFutureSalts   )MsgId
MsgFactoryc                   @   s   e Zd Zdd ZdS )Resultc                 C   s   d | _ t | _d S N)valueasyncioEventeventself r   X/opt/bot/vods_filmes/script/venv/lib/python3.8/site-packages/pyrogram/session/session.py__init__*   s    zResult.__init__N)__name__
__module____qualname__r    r   r   r   r   r   )   s   r   c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dddd	Z
d#deeeeedddZdd Zdd Zdd Zdd Zdd Zdd ZdefeeedddZeeefeeeedd d!Zd"S )$Session      
      i  zauth key not foundztransport floodz
invalid DC)i  i  i  Fzpyrogram.Client)clientdc_idauth_key	test_modeis_mediais_cdnc                 C   s   || _ || _|| _|| _|| _|| _d | _t| dd  | _	t
d| _t | _d| _t | _i | _g | _d | _t | _d | _t | _t | _d S )Ni   r   )r)   r*   r+   r,   r-   r.   
connectionr   digestauth_key_idosurandom
session_idr   msg_factorysaltsetpending_acksresultsstored_msg_ids	ping_taskr   r   ping_task_event	recv_task
is_startedZget_event_looploop)r   r)   r*   r+   r,   r-   r.   r   r   r   r    >   s&    	

zSession.__init__c                    s  t | j| j| jj| jj| j| _z| j I d H  | j	
|  | _| jtjjdd| jdI d H  | js| jtjjttjj| jj I d H | jj| jj| jj| jj| jjdtjj dd| jdI d H  | j	
|  | _t !dt t !d| jj| jj t !d	| jj| jj W n t"k
rP } z| # I d H  |W 5 d }~X Y q  t$t%fk
rv   | # I d H  Y q  t&k
r } z| # I d H  |W 5 d }~X Y q X qq | j'(  t !d
 d S )Nr   )ping_idtimeout )api_idapp_versiondevice_modelsystem_versionZsystem_lang_code	lang_codeZ	lang_packquery)r   rJ   zSession initialized: Layer %szDevice: %s - %szSystem: %s (%s)zSession started))r   r*   r,   r)   Zipv6proxyr-   r0   connectr@   create_taskrecv_workerr>   sendr   	functionsZPingSTART_TIMEOUTr.   ZInvokeWithLayerr   ZInitConnectionZstoragerE   rF   rG   rH   rI   helpZ	GetConfigping_workerr<   loginfor	   stopOSErrorr   	Exceptionr?   r8   r   er   r   r   startf   sV     

zSession.startc              
      s   | j   | j  | j  | jd k	r4| jI d H  | j  | j I d H  | jr`| jI d H  | j	st
| jjrz| j| jI d H  W n, tk
r } zt| W 5 d }~X Y nX td d S )NzSession stopped)r?   clearr;   r=   r8   r<   r0   closer>   r-   callabler)   Zdisconnect_handlerrX   rT   	exceptionrU   rY   r   r   r   rV      s    




zSession.stopc                    s    |   I d H  |  I d H  d S r   )rV   r[   r   r   r   r   restart   s    zSession.restartc                    s  | j tjtjt|| j| j| j	I d H }t
|jtr>|jjn|g}td| |D ]}|jd dkr|j| jkrxqTn| j|j zt| jtjkr| jd tjd = | jr|j| jd k rtd|j| jkrtd|jt  d }|dkrtd|d	k rtd
W nH tk
rZ } z(td| | j I d H  W Y  d S d }~X Y nX t| j|j t
|jtj j!tj j"fr| j|jj# qTt
|jtj j$rqTd }t
|jtj j%tj j&fr|jj'}n^t
|jt(tj j)fr|jj*}n>t
|jtj j+r|jj}n"| j,d k	r2| j -| j,.|j || j/krTt0|jd|j| j/| _1| j/| j23  qTt| j| j4krtdt| j z&| 5tj j6t7| jddI d H  W n t8k
r   Y nX | j9  d S )NzReceived: %sr%   r   z.The msg_id is lower than all the stored valuesz/The msg_id is equal to any of the stored valuesl           zhThe msg_id belongs to over 30 seconds in the future. Most likely the client time has to be synchronized.izgThe msg_id belongs to over 300 seconds in the past. Most likely the client time has to be synchronized.zDiscarding packet: %sresultzSending %s acks)Zmsg_idsF):r@   run_in_executorpyrogramcrypto_executorr   unpackr   r5   r+   r2   
isinstancebodyr   messagesrT   debugZseq_nomsg_idr9   addlenr;   r$   STORED_MSG_IDS_MAX_SIZEr   r   rU   r0   r]   bisectinsortr   typesZMsgDetailedInfoZMsgNewDetailedInfoZanswer_msg_idZNewSessionCreatedr   BadServerSaltZ
bad_msg_idr   Z	RpcResultZ
req_msg_idZPongr)   rM   Zhandle_updatesr:   getattrr   r   r8   ACKS_THRESHOLDrO   ZMsgsAcklistrW   r\   )r   packetdatari   msgZ	time_diffrZ   rk   r   r   r   handle_packet   sx    








&zSession.handle_packetc              	      s   t d zt| j | jI d H  W q tjk
r>   Y nX qz(| t	j
jd| jd ddI d H  W q
 ttfk
r   Y q
X q
t d d S )NzPingTask startedr   r'   )rA   Zdisconnect_delayFzPingTask stopped)rT   rU   r   wait_forr=   waitPING_INTERVALTimeoutErrorrO   r   rP   ZPingDelayDisconnectWAIT_TIMEOUTrW   r   r   r   r   r   rS     s"    
 zSession.ping_workerc                    s   t d | j I d H }|d ks.t|dkrv|rZtt| }t d|t	j
|d | j r| j|   q| j| | q
t d d S )NzNetworkTask started   z$Server sent transport error: %s (%s)zunknown errorzNetworkTask stopped)rT   rU   r0   recvrm   r   readr   warningr$   TRANSPORT_ERRORSgetr?   is_setr@   rM   r`   ry   )r   rv   
error_coder   r   r   rN   %  s    
 
zSession.recv_workerT)rw   wait_responserC   c           	   
      s  |  |}|j}|r t | j|< td| | jtj	t
j|| j| j| j| jI d H }z| j|I d H  W n4 tk
r } z| j|d  |W 5 d }~X Y nX |rz"t| j| j |I d H  W n tjk
r   Y nX | j|j}|d krtdt|tjjr@t|tjjtjj fr0|j!}t"#|t$| t|tjj%rft&dt%j't%|j( t|tjj)r|j*| _| |||I d H S |S d S )NzSent: %szRequest timed outz%s: %s)+r6   rk   r   r:   rT   rj   r@   rc   rd   re   r   packr7   r5   r+   r2   r0   rO   rW   popr   rz   r   r{   r}   r   rg   r   rq   ZRpcErrorrP   InvokeWithoutUpdatesInvokeWithTakeoutrJ   r   Zraise_ittyper   r   r!   r   rr   Znew_server_salt)	r   rw   r   rC   messagerk   payloadrZ   rb   r   r   r   rO   =  sJ    


"
zSession.send)rJ   retriesrC   sleep_thresholdc           	   
      s  zt | j | jI d H  W n t jk
r4   Y nX t|tjj	tjj
frT|j}n|}d|jddd  }z| j||dI d H W S  tk
r } zH|j}||  krdkrn n td| jj|| t |I d H  W 5 d }~X Y qr tttfk
r } zx|dkr|d |dk r&tjntjdtj| d |t|pJt| t dI d H  | ||d |I d H  W Y S d }~X Y qrX qrd S )	N.r   rB   r   z@[%s] Waiting for %s seconds before continuing (required by "%s")r%   z[%s] Retrying "%s" due to: %sg      ?) r   rz   r?   r{   r~   r}   rg   r   rP   r   r   rJ   joinZQUALNAMEsplitrO   r
   r   rT   r   r)   namesleeprW   r   r   rU   r$   MAX_RETRIESstrreprinvoke)	r   rJ   r   rC   r   Zinner_queryZ
query_namerZ   amountr   r   r   r   p  s>       
 zSession.invokeN)FF)r!   r"   r#   rQ   r~   ZSLEEP_THRESHOLDr   rt   r|   rn   r   intbytesboolr    r[   rV   r`   ry   rS   rN   r   floatrO   r   r   r   r   r   r$   /   sJ     (7U6r$   )%r   ro   loggingr3   hashlibr   ior   rd   r   Zpyrogram.connectionr   Zpyrogram.cryptor   Zpyrogram.errorsr   r   r	   r
   r   r   r   Zpyrogram.raw.allr   Zpyrogram.raw.corer   r   r   r   Z	internalsr   r   	getLoggerr!   rT   r   r$   r   r   r   r   <module>   s    $
