B
    fdk4                 @   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   </tmp/pip-unpacked-wheel-rcokkf2l/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  xt | j| j| jj| jj| j| _y| 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
rT } z| # I d H  |W d d }~X Y q t$t%fk
rz   | # I d H  Y q t&k
r } z| # I d H  |W d d }~X Y qX P qW | 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   rG   zSession initialized: Layer %szDevice: %s - %szSystem: %s (%s)zSession started))r   r(   r*   r'   Zipv6proxyr+   r.   connectr>   create_taskrecv_workerr<   sendr   	functionsZPingSTART_TIMEOUTr,   ZInvokeWithLayerr   ZInitConnectionZstoragerB   rC   rD   rE   rF   helpZ	GetConfigping_workerr:   loginfor	   stopOSErrorr   	Exceptionr=   r6   )r   er   r   r   startf   sP    
 
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ry| j| jI d H  W n, tk
r } zt| W d d }~X Y nX td d S )NzSession stopped)r=   clearr9   r;   r6   r:   r.   closer<   r+   callabler'   Zdisconnect_handlerrU   rQ   	exceptionrR   )r   rV   r   r   r   rS      s    




zSession.stopc                s    |   I d H  |  I d H  d S )N)rS   rW   )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| x|D ]}|jd dkr|j| jkr|qXn| j|j yt| 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rtd|d	k rtd
W n@ tk
rX } z td| | j I d H  d S d }~X Y nX t| j|j t
|jtj j!tj j"fr| j|jj# qXt
|jtj j$rqXd }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	r0| j -| j,.|j || j/krXt0|jd|j| j/| _1| j/| j23  qXW t| j| j4krtdt| j y&| 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   r3   r)   r0   
isinstancebodyr   messagesrQ   debugZseq_nomsg_idr7   addlenr9   r"   STORED_MSG_IDS_MAX_SIZEr   r   rR   r.   rY   bisectinsortr   typesZMsgDetailedInfoZMsgNewDetailedInfoZanswer_msg_idZNewSessionCreatedr   BadServerSaltZ
bad_msg_idr   Z	RpcResultZ
req_msg_idZPongr'   rJ   Zhandle_updatesr8   getattrr   r   r6   ACKS_THRESHOLDrL   ZMsgsAcklistrT   rX   )r   packetdatare   msgZ	time_diffrV   rg   r   r   r   handle_packet   sr    





&zSession.handle_packetc          	      s   t d x~yt| j | jI d H  W n tjk
r@   Y nX P y(| t	j
jd| jd ddI d H  W q ttfk
r   Y qX qW t d d S )NzPingTask startedr   r%   )r?   Zdisconnect_delayFzPingTask stopped)rQ   rR   r   wait_forr;   waitPING_INTERVALTimeoutErrorrL   r   rM   ZPingDelayDisconnectWAIT_TIMEOUTrT   r   )r   r   r   r   rP     s    

zSession.ping_workerc                s   t d x| j I d H }|d ks0t|dkrx|r\tt| }t d|t	j
|d | j rv| j|   P | j| | qW t d d S )NzNetworkTask started   z$Server sent transport error: %s (%s)zunknown errorzNetworkTask stopped)rQ   rR   r.   recvri   r   readr   warningr"   TRANSPORT_ERRORSgetr=   is_setr>   rJ   r\   ru   )r   rr   
error_coder   r   r   rK   %  s    

zSession.recv_workerT)rs   wait_responser@   c       	   
      s  |  |}|j}|r t | j|< td| | jtj	t
j|| j| j| j| jI d H }y| j|I d H  W n4 tk
r } z| j|d  |W d d }~X Y nX |ry"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)+r4   rg   r   r8   rQ   rf   r>   r_   r`   ra   r   packr5   r3   r)   r0   r.   rL   rT   popr   rv   r   rw   ry   r   rc   r   rm   ZRpcErrorrM   InvokeWithoutUpdatesInvokeWithTakeoutrG   r   Zraise_ittyper   r~   r   r   rn   Znew_server_salt)	r   rs   r   r@   messagerg   payloadrV   r^   r   r   r   rL   =  sH    
"
zSession.send)rG   retriesr@   sleep_thresholdc       	   
      s  y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  }xy| j||dI d H S  tk
r } zH|j}||  krdkrn n td| jj|| t |I d H  W d d }~X Y qv tttfk
r } zp|dkr|d |dk r(tjntjdtj| d |t|pLt| t dI d H  | ||d |I d H S d }~X Y qvX qvW d S )	N.r   )r@   r   z@[%s] Waiting for %s seconds before continuing (required by "%s")r#   z[%s] Retrying "%s" due to: %sg      ?) r   rv   r=   rw   rz   ry   rc   r   rM   r   r   rG   joinZQUALNAMEsplitrL   r
   r   rQ   r~   r'   namesleeprT   r   r   rR   r"   MAX_RETRIESstrreprinvoke)	r   rG   r   r@   r   Zinner_queryZ
query_namerV   amountr   r   r   r   p  s6     
zSession.invokeN)FF)r   r    r!   rN   rz   ZSLEEP_THRESHOLDr   rp   rx   rj   r   intbytesboolr   rW   rS   r\   ru   rP   rK   r   floatrL   r   r   r   r   r   r"   /   s,   	 !7U6r"   )%r   rk   loggingr1   hashlibr   ior   r`   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   rQ   r   r"   r   r   r   r   <module>   s    $
