o
    Fh                  	   @   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mZ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)datetime)
itemgetter)AnyCallableOptional)	parse_qsl)TelegramObjectc                   @   sR   e Zd ZU dZeed< 	 eed< 	 eed< 	 dZee ed< 	 dZ	ee 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   H/var/www/html/venv/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e ed< 	 e	ed< 	 dZ
ee	 ed< 	 dZee	 ed< 	 dZee	 ed< 	 dZee ed	< 	 dZee ed
< 	 dZee ed< 	 dZee	 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   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e ed< 	 dZee	 ed< 	 dZ
ee	 ed< 	 dZee ed< 	 dZee ed< 	 dZee ed< 	 dZee ed	< 	 dZee 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   r!   D   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)r6   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_signaturen   s$   


rL   loadsrN   .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-   rN   resultr6   valuer   r   r   parse_webapp_init_data   s   
rW   c                C   s   t | |rt||dS td)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:
    rM   zInvalid init data signature)rL   rW   r:   )r,   r-   rN   r   r   r   safe_parse_webapp_init_data   s   
rX   )rB   r?   jsonr   operatorr   typingr   r   r   urllib.parser   aiogram.typesr   r	   r   r!   r   r    rL   rN   rW   rX   r   r   r   r   <module>   s<    !*!


