o
    5˜ŽjÎ  ã                	   @   sú   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 d dlm	Z	 d dl
mZ d dlmZ G dd	„ d	eƒZG d
d„ deƒZG dd„ deƒZdededefdd„Zejdœdedede	f defdd„Zejdœdededede	f defdd„ZdS )é    N)ÚCallable)Údatetime)Ú
itemgetter)ÚAny)Ú	parse_qsl)ÚTelegramObjectc                   @   sR   e Zd ZU dZeed< 	 eed< 	 eed< 	 dZedB ed< 	 dZedB ed< dS )Ú
WebAppChatzg
    This object represents a chat.

    Source: https://core.telegram.org/bots/webapps#webappchat
    ÚidÚtypeÚtitleNÚusernameÚ	photo_url)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚ__annotations__Ústrr   r   © r   r   úR/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/aiogram/utils/web_app.pyr      s   
 r   c                   @   s´   e Zd ZU dZeed< 	 dZedB ed< 	 eed< 	 dZ	edB ed< 	 dZ
edB ed< 	 dZedB ed< 	 dZedB ed	< 	 dZedB ed
< 	 dZedB ed< 	 dZedB ed< dS )Ú
WebAppUserz{
    This object contains the data of the Web App user.

    Source: https://core.telegram.org/bots/webapps#webappuser
    r	   NÚis_botÚ
first_nameÚ	last_namer   Úlanguage_codeÚ
is_premiumÚadded_to_attachment_menuÚallows_write_to_pmr   )r   r   r   r   r   r   r   Úboolr   r   r   r   r   r   r   r   r   r   r   r   r   $   s,   
 r   c                   @   s´   e Zd ZU dZdZedB ed< 	 dZedB ed< 	 dZ	edB ed< 	 dZ
edB ed< 	 dZedB ed< 	 dZedB ed< 	 dZedB ed	< 	 dZedB ed
< 	 eed< 	 eed< dS )ÚWebAppInitDatazà
    This object contains data that is transferred to the Web App when it is opened.
    It is empty if the Web App was launched from a keyboard button.

    Source: https://core.telegram.org/bots/webapps#webappinitdata
    NÚquery_idÚuserÚreceiverÚchatÚ	chat_typeÚchat_instanceÚstart_paramÚcan_send_afterÚ	auth_dateÚhash)r   r   r   r   r!   r   r   r"   r   r#   r$   r   r%   r&   r'   r(   r   r   r   r   r   r   r    E   s,   
 r    ÚtokenÚ	init_dataÚreturnc                 C   s¤   z
t t|dd�ƒ}W n
 ty   Y dS w d|vrdS | d¡}d dd„ t| ¡ tdƒd	�D ƒ¡}tj	d
|  
¡ tjd�}tj	| ¡ | 
¡ tjd� ¡ }t ||¡S )zó
    Check incoming WebApp init data signature

    Source: https://core.telegram.org/bots/webapps#validating-data-received-via-the-web-app

    :param token: bot Token
    :param init_data: data from frontend to be validated
    :return:
    T)Ústrict_parsingFr*   Ú
c                 s   s"   � | ]\}}|› d |› �V  qdS )ú=Nr   )Ú.0ÚkÚvr   r   r   Ú	<genexpr>ƒ   s   € 
ÿz)check_webapp_signature.<locals>.<genexpr>r   )Úkeys
   WebAppData)r5   ÚmsgÚ	digestmod)Údictr   Ú
ValueErrorÚpopÚjoinÚsortedÚitemsr   ÚhmacÚnewÚencodeÚhashlibÚsha256ÚdigestÚ	hexdigestÚcompare_digest)r+   r,   Úparsed_dataÚhash_Údata_check_stringÚ
secret_keyÚcalculated_hashr   r   r   Úcheck_webapp_signatureo   s(   
þ

ÿýürK   ©ÚloadsrM   .c                C   s\   i }t | ƒD ] \}}| d¡r| d¡s| d¡r"| d¡r"||ƒ}|||< qtdi |¤ŽS )a)  
    Parse WebApp init data and return it as WebAppInitData object

    This method doesn't make any security check, so you shall not trust to this data,
    use :code:`safe_parse_webapp_init_data` instead.

    :param init_data: data from frontend to be parsed
    :param loads:
    :return:
    ú[ú]Ú{Ú}Nr   )r   Ú
startswithÚendswithr    )r,   rM   Úresultr5   Úvaluer   r   r   Úparse_webapp_init_data�   s   ÿÿ
rV   c                C   s"   t | |ƒrt||d�S d}t|ƒ‚)a   
    Validate raw WebApp init data and return it as WebAppInitData object

    Raise :obj:`ValueError` when data is invalid

    :param token: bot token
    :param init_data: data from frontend to be parsed and validated
    :param loads:
    :return:
    rL   zInvalid init data signature)rK   rV   r9   )r+   r,   rM   r6   r   r   r   Úsafe_parse_webapp_init_data¨   s   
rW   )rA   r>   ÚjsonÚcollections.abcr   r   Úoperatorr   Útypingr   Úurllib.parser   Úaiogram.typesr   r   r   r    r   r   rK   rM   rV   rW   r   r   r   r   Ú<module>   s>    !*#ýÿ
ý
üüÿþ
üû