B
    fdL)              
   @   sp  d dl Z d dlZ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m	Z	 d dl
m
Z
 d dlmZmZmZmZ d dlZd dlmZmZ d dlmZ d dlmZmZmZmZ dQd
deedddZdReeeed dddZdSdeed dddZed dddZddddZ edd d!d"Z!d#Z"d$Z#d%Z$d&Z%d'Z&ej'j(ee d(d)d*Z)ej'j(ed(d+d,Z*eed-d.d/Z+eed-d0d1Z,e-ed2d3d4Z.ee-d5d6d7Z/e-e-d8d9d:Z0e-e-e-d;d<d=Z1ejj2ee-d>d?d@Z3ejj4j5eejj6dAdBdCZ7dDeej8edE eeeeeej'j9 f f dFdGdHZ:eddIdJZ;ee ee dKdLdMZ<ee ee dNdOdPZ=dS )T    N)ThreadPoolExecutor)datetimetimezone)getpass)UnionListDictOptional)rawenums)types)FileIdFileTypePHOTO_TYPESDOCUMENT_TYPES F)hide)promptr   c         	      s>   t d,}t|rtnt| }t ||I dH S Q R X dS )z'Just like the built-in input, but async   N)r   	functoolspartialr   inputasyncioZget_event_loopZrun_in_executor)r   r   executorfunc r   2/tmp/pip-unpacked-wheel-rcokkf2l/pyrogram/utils.pyainput$   s    
r   )zraw.types.InputMediaPhotozraw.types.InputMediaDocument)file_idexpected_file_typettl_secondsreturnc             C   s   yt | }W n$ tk
r2   td|  dY nX |j}|d k	rd||krdtd|j d|j d|tjtjfkrtd|  |t	krt
jjt
jj|j|j|jd|dS |tkrt
jjt
jj|j|j|jd|dS td	|  d S )
NzFailed to decode "zS". The value does not represent an existing local file, HTTP URL, or valid file id.z	Expected z, got z file id insteadz,This file id can only be used for download: )idaccess_hashfile_reference)r"   r    zUnknown file id: )r   decode	Exception
ValueError	file_typenamer   Z	THUMBNAILZ
CHAT_PHOTOr   r
   r   ZInputMediaPhotoZ
InputPhotoZmedia_idr#   r$   r   ZInputMediaDocumentZInputDocument)r   r   r    decodedr(   r   r   r   get_input_media_from_file_id+   s2    r+   r   zraw.types.messages.Messagesztypes.Message)messagesrepliesr!   c          
      s   dd |j D }dd |jD }|js.t S g }x0|jD ]&}|tjj| |||ddI d H  q:W |rdd |jD }|rx |D ]}|jr|jj	}	P qW d}	| j
|	| |d dI d H }
x8|D ]0}||j	d }x|
D ]}|j	|kr||_qW qW t|S )	Nc             S   s   i | ]}||j qS r   )r"   ).0ir   r   r   
<dictcomp>\   s    z"parse_messages.<locals>.<dictcomp>c             S   s   i | ]}||j qS r   )r"   )r.   r/   r   r   r   r0   ]   s    r   )r-   c             S   s,   i | ]$}t |tjjs|jr|jj|jqS r   )
isinstancer
   r   ZMessageEmptyZreply_toZreply_to_msg_idr"   )r.   r/   r   r   r   r0   h   s   r   )Zreply_to_message_idsr-   )userschatsr,   r   r   appendMessage_parsechatr"   Zget_messageskeysgetZreply_to_message)clientr,   r-   r2   r3   parsed_messagesmessageZmessages_with_repliesmchat_idZreply_messagesZreply_idZreplyr   r   r   parse_messagesW   s4    &




r?   )r!   c          
   C   sd   |j }t|dd }g }xB|D ]:}|tj||d k	rJtjt|tjj	| dnd | d qW t
|S )N
channel_id)r"   typer:   )r"   r7   r:   )r,   getattrr4   r   r5   ZChatget_channel_idr   ZChatTypeZCHANNELr   )r:   updater,   r@   r;   r<   r   r   r   parse_deleted_messages   s    
"rE   z raw.base.InputBotInlineMessageID)msg_idc             C   sT   t | tjjr&td| j| j| j}ntd| j| j	| j| j}t
| dS )Nz<iqqz<iqiq=)r1   r
   r   InputBotInlineMessageIDstructpackdc_idr"   r#   owner_idbase64urlsafe_b64encoder%   rstrip)rF   Zinline_message_id_packedr   r   r   pack_inline_message_id   s    
rP   )inline_message_idr!   c             C   s   | dt |  d   }t|}t |dkrVtd|}tjj|d |d |d dS td	|}tjj|d |d |d |d
 dS d S )NrG         z<iqqr   r      )rK   r"   r#   z<iqiq   )rK   rL   r"   r#   )	lenrM   urlsafe_b64decoderI   unpackr
   r   rH   ZInputBotInlineMessageID64)rQ   Zpaddedr*   unpackedr   r   r   unpack_inline_message_id   s    
rZ   lJ)l J)i  il   J))peerr!   c             C   s@   t | tjjr| jS t | tjjr(| jS t | tjjr<| jS dS )z&Get the raw peer id from a Peer objectN)	r1   r
   r   PeerUseruser_idPeerChatr>   PeerChannelr@   )r[   r   r   r   get_raw_peer_id   s    r`   c             C   sT   t | tjjr| jS t | tjjr*| j S t | tjjrBt| j	 S t
d|  dS )z*Get the non-raw peer id from a Peer objectzPeer type invalid: N)r1   r
   r   r\   r]   r^   r>   r_   MAX_CHANNEL_IDr@   r'   )r[   r   r   r   get_peer_id   s    
rb   )peer_idr!   c             C   s`   | dk r2t | krdS t|   kr(tk rNn qNdS nd|   k rFtkrNn ndS td|  d S )Nr   r7   ZchanneluserzPeer id invalid: )MIN_CHAT_IDMIN_CHANNEL_IDra   MAX_USER_IDr'   )rc   r   r   r   get_peer_type   s    rh   c             C   s   t |  S )N)ra   )rc   r   r   r   rC      s    rC   )br!   c             C   s   t | dS )Nbig)int
from_bytes)ri   r   r   r   btoi   s    rm   )r/   r!   c             C   s   |  ddS )N   rj   )to_bytes)r/   r   r   r   itob  s    rp   )datar!   c             C   s   t |  S )N)hashlibsha256digest)rq   r   r   r   rs     s    rs   )ari   r!   c             C   s   t dd t| |D S )Nc             s   s   | ]\}}||A V  qd S )Nr   )r.   r/   jr   r   r   	<genexpr>
  s    zxor.<locals>.<genexpr>)byteszip)ru   ri   r   r   r   xor	  s    rz   )algopasswordr!   c             C   sR   t | j|  | j }t | j| | j }td|| jd}t | j| | j S )Nsha512i )rs   salt1encodesalt2rr   pbkdf2_hmac)r{   r|   Zhash1Zhash2Zhash3r   r   r   compute_password_hash  s    r   )rr|   r!   c             C   s>  | j }|j}t|j}t|j}|j}| j}t|}| j}	t||}
t|
}t|||}t	|| }t|}|| | }xDt
d}t|}t|||}t|}tt	|| }|dkrzP qzW || | }|| }|| }t|||}t|}t	|}t	tt	|t	|t	|j t	|j | | | }tjj|	||dS )Nrn   r   )srp_idAZM1)Zcurrent_algoprm   rp   gZsrp_Br   r   powrs   osurandomrz   r~   r   r
   r   InputCheckPasswordSRP)r   r|   r{   Zp_bytesr   Zg_bytesr   ZB_bytesBr   Zx_bytesxZg_xZk_byteskZkg_xZa_bytesru   r   ZA_bytesuZg_bZuxZa_uxSZS_bytesZK_bytesZM1_bytesr   r   r   compute_password_check  s>    



4r   zpyrogram.Clientztypes.MessageEntity)r:   text
parse_modeentitiesr!   c                s^   |r8x|D ]
}| |_ q
W |dd |D I d H p0d  }}n| j||I d H  \}}||dS )Nc                s   g | ]}|  I d H qS )N)write)r.   entityr   r   r   
<listcomp>`  s    z'parse_text_entities.<locals>.<listcomp>)r<   r   )Z_clientparserparsevalues)r:   r   r   r   r   r   r   r   parse_text_entitiesU  s    

 r   c               C   s   t dtjS )Nr   )r   fromtimestampr   utcr   r   r   r   zero_datetimej  s    r   )tsr!   c             C   s   | rt | S d S )N)r   r   )r   r   r   r   timestamp_to_datetimen  s    r   )dtr!   c             C   s   | rt |  S d S )N)rk   	timestamp)r   r   r   r   datetime_to_timestampr  s    r   )r   )NN)r   )>r   rM   r   rr   r   rI   Zconcurrent.futures.threadr   r   r   r   typingr   r   r   r	   Zpyrogramr
   r   r   Zpyrogram.file_idr   r   r   r   strboolr   rk   r+   r?   rE   rP   rZ   rf   ra   re   ZMAX_USER_ID_OLDrg   baseZPeerr`   rb   rh   rC   rx   rm   rp   rs   rz   ZAPasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPowr   accountZPasswordr   r   Z	ParseModeZMessageEntityr   r   r   r   r   r   r   r   <module>   sb   	 +-
:&