o
    HEDi2@                     @   s   d dl Z d dlZddlmZ ddlmZ dZdZdZ	dZ
d	Zd
ZdZG dd dZG dd dZG dd dZG dd deZdS )    N   )warn_deprecated)FSMStorageWarningkey	called_at
rate_limitresultexceededdeltaz$throttle_managerc                   @   sT  e Zd ZdZdd Zdd Zeddddeje	e
df d	eje	e
df d
eje	e
f eje	e
f ffddZdddddeje	e
df d	eje	e
df deje	 d
eje	 fddZdddddeje	e
df d	eje	e
df dejej d
ejfddZdddddeje	e
df d	eje	e
df dejej fddZdddddeje	e
df d	eje	e
df dejfddZdddddeje	e
df d	eje	e
df dejfddZddddeje	e
df d	eje	e
df fddZdddd deje	e
df d	eje	e
df d!eje fd"d#Zddddeje	e
df d	eje	e
df fd$d%Zd&d' Zdddddeje	e
df d	eje	e
df deje d
ejfd(d)Zdddd*deje	e
df d	eje	e
df d+ejfd,d-Zdddd*deje	e
df d	eje	e
df d+ejfd.d/Zddddeje	e
df d	eje	e
df fd0d1Zed2d3 ZdS )4BaseStoragez`
    You are able to save current user's state
    and data for all steps in states-storage
    c                       t )z
        You have to override this method and use when application shutdowns.
        Perhaps you would like to save data and etc.

        :return:
        NotImplementedErrorself r   i/var/www/www-root/data/www/ovozai.pdev.uz/venv/lib/python3.10/site-packages/aiogram/dispatcher/storage.pyclose   s   zBaseStorage.closec                    r   )zq
        You have to override this method for all asynchronous storages (e.g., Redis).

        :return:
        r   r   r   r   r   wait_closed    s   zBaseStorage.wait_closedNchatuserr   r   returnc                C   s@   |du r|du rt d|du r|}||fS |du r|}||fS )a1  
        In all storage's methods chat or user is always required.
        If one of them is not provided, you have to set missing value based on the provided one.

        This method performs the check described above.

        :param chat: chat_id
        :param user: user_id
        :return:
        Nz>`user` or `chat` parameter is required but no one is provided!)
ValueError)clsr   r   r   r   r   check_address(   s   zBaseStorage.check_addressr   r   defaultr   c                   r   )a;  
        Get current state of user in chat. Return `default` if no record is found.

        Chat or user is always required. If one of them is not provided,
        you have to set missing value based on the provided one.

        :param chat:
        :param user:
        :param default:
        :return:
        r   r   r   r   r   r   r   r   	get_stateB      zBaseStorage.get_statec                   r   )aE  
        Get state-data for user in chat. Return `default` if no data is provided in storage.

        Chat or user is always required. If one of them is not provided,
        you have to set missing value based on the provided one.

        :param chat:
        :param user:
        :param default:
        :return:
        r   r   r   r   r   get_dataS   r    zBaseStorage.get_datar   r   stater#   c                   r   )z
        Set new state for user in chat

        Chat or user is always required. If one of them is not provided,
        you have to set missing value based on the provided one.

        :param chat:
        :param user:
        :param state:
        r   r   r   r   r#   r   r   r   	set_stated      zBaseStorage.set_stater   r   datar(   c                   r   )z
        Set data for user in chat

        Chat or user is always required. If one of them is not provided,
        you have to set missing value based on the provided one.

        :param chat:
        :param user:
        :param data:
        r   r   r   r   r(   r   r   r   set_datat   r&   zBaseStorage.set_datac                   r   )aT  
        Update data for user in chat

        You can use data parameter or|and kwargs.

        Chat or user is always required. If one of them is not provided,
        you have to set missing value based on the provided one.

        :param data:
        :param chat:
        :param user:
        :param kwargs:
        :return:
        r   r   r   r   r(   kwargsr   r   r   update_data      zBaseStorage.update_datac                      | j ||i dI dH  dS )z
        Reset data for user in chat.

        Chat or user is always required. If one of them is not provided,
        you have to set missing value based on the provided one.

        :param chat:
        :param user:
        :return:
        r'   N)r*   r   r   r   r   r   r   
reset_data      zBaseStorage.reset_dataTr   r   	with_datar4   c                   sL   | j ||d\}}| j||ddI dH  |r$| j||i dI dH  dS dS )aY  
        Reset state for user in chat.
        You may desire to use this method when finishing conversations.

        Chat or user is always required. If one of this is not presented,
        you have to set missing value based on the provided one.

        :param chat:
        :param user:
        :param with_data:
        :return:
        r   Nr"   r'   )r   r%   r*   )r   r   r   r4   r   r   r   reset_state   s   zBaseStorage.reset_statec                   s   | j ||ddI dH  dS )z
        Finish conversation for user in chat.

        Chat or user is always required. If one of them is not provided,
        you have to set missing value based on the provided one.

        :param chat:
        :param user:
        :return:
        Tr3   N)r5   r0   r   r   r   finish   r2   zBaseStorage.finishc                 C   s   dS NFr   r   r   r   r   
has_bucket   s   zBaseStorage.has_bucketc                   r   )aA  
        Get bucket for user in chat. Return `default` if no data is provided in storage.

        Chat or user is always required. If one of them is not provided,
        you have to set missing value based on the provided one.

        :param chat:
        :param user:
        :param default:
        :return:
        r   r   r   r   r   
get_bucket   r    zBaseStorage.get_bucketr   r   bucketr;   c                   r   )z
        Set bucket for user in chat

        Chat or user is always required. If one of them is not provided,
        you have to set missing value based on the provided one.

        :param chat:
        :param user:
        :param bucket:
        r   r   r   r   r;   r   r   r   
set_bucket   r&   zBaseStorage.set_bucketc                   r   )aZ  
        Update bucket for user in chat

        You can use bucket parameter or|and kwargs.

        Chat or user is always required. If one of them is not provided,
        you have to set missing value based on the provided one.

        :param bucket:
        :param chat:
        :param user:
        :param kwargs:
        :return:
        r   r   r   r   r;   r,   r   r   r   update_bucket   r.   zBaseStorage.update_bucketc                   r/   )z
        Reset bucket dor user in chat.

        Chat or user is always required. If one of them is not provided,
        you have to set missing value based on the provided one.

        :param chat:
        :param user:
        :return:
        r:   N)r=   r0   r   r   r   reset_bucket  r2   zBaseStorage.reset_bucketc                 C   s>   ddl m} | d u rd S t| tr| S t| |r| jS t| S )N   )State)filters.staterB   
isinstancestrr#   )valuerB   r   r   r   resolve_state  s   

zBaseStorage.resolve_state) __name__
__module____qualname____doc__r   r   classmethodtypingUnionrE   intr   Optionalr   Dictr!   AnyStrr%   r*   r-   r1   boolr5   r6   r8   dictr9   r=   r?   r@   staticmethodrG   r   r   r   r   r      s   	













r   c                   @   s   e Zd Zdd Zdd Zddeje deje fdd	Zddeje dej	fd
dZ
ddej	fddZddejej fddZddej	fddZddeje fddZdd Zdd ZdS )
FSMContextc                 C   s"   || _ | j j||d\| _| _d S Nr   )storager   r   r   )r   rX   r   r   r   r   r   __init__%  s   zFSMContext.__init__c                 C   s   t | S N)FSMContextProxyr   r   r   r   proxy)  s   zFSMContext.proxyNr   r   c                       | j j| j| j|dI d H S Nr   )rX   r   r   r   r   r   r   r   r   r   ,     zFSMContext.get_statec                    r]   r^   )rX   r!   r   r   r_   r   r   r   r!   /  r`   zFSMContext.get_datar(   c                    s*   | j jd| j| j|d|I d H  d S )Nr'   r   )rX   r-   r   r   r   r(   r,   r   r   r   r-   2  s   (zFSMContext.update_datar#   c                    "   | j j| j| j|dI d H  d S )Nr"   )rX   r%   r   r   )r   r#   r   r   r   r%   5      zFSMContext.set_statec                    rb   )Nr'   )rX   r*   r   r   )r   r(   r   r   r   r*   8  rc   zFSMContext.set_dataTr4   c                    rb   )Nr3   )rX   r5   r   r   )r   r4   r   r   r   r5   ;  rc   zFSMContext.reset_statec                        | j j| j| jdI d H  d S rW   )rX   r1   r   r   r   r   r   r   r1   >     zFSMContext.reset_datac                    rd   rW   )rX   r6   r   r   r   r   r   r   r6   A  re   zFSMContext.finishrZ   )T)rH   rI   rJ   rY   r\   rM   rP   rE   r   rQ   r!   r-   rR   r%   r*   rS   r5   r1   r6   r   r   r   r   rV   $  s     rV   c                       s  e Zd Zdef fddZdd Zdd Zdd	 Zedefd
dZ	dd Z
edd Zejdd Zejdd Zd6ddZdd Zd7ddZdd Zd7ddZd7ddZd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Z  Z S )8r[   fsm_contextc                    s6   t t|   || _i | _i | _d | _d| _d| _d S )NFT)	superr[   rY   rf   _copy_data_state	_is_dirty_closed)r   rf   	__class__r   r   rY   F  s   
zFSMContextProxy.__init__c                    s   |   I d H  | S rZ   loadr   r   r   r   
__aenter__P  s   zFSMContextProxy.__aenter__c                    s"   |d u r|   I d H  d| _d S NT)saverl   )r   exc_typeexc_valexc_tbr   r   r   	__aexit__T  s   
zFSMContextProxy.__aexit__c                 C   s   | j rtdd S )NzProxy is closed!)rl   LookupErrorr   r   r   r   _check_closedY  s   zFSMContextProxy._check_closedc                    s   | |}|  I dH  |S )z6
        :param fsm_context:
        :return:
        Nro   )r   rf   r\   r   r   r   create]  s   zFSMContextProxy.createc                    sP   d| _ |   | j I d H | _| | j I d H  t| j	| _
d| _d S r7   )rl   clearrf   r   rj   updater!   copydeepcopyri   rh   rk   r   r   r   r   rp   g  s   
zFSMContextProxy.loadc                 C   s   | j S rZ   )rj   r   r   r   r   r#   p  s   zFSMContextProxy.statec                 C   s   |    || _d| _d S rr   ry   rj   rk   )r   rF   r   r   r   r#   t     
c                 C   s   |    d | _d| _d S rr   r   r   r   r   r   r#   {  r   Fc                    sf   |    | j| jks|r| jj| jdI d H  | js|r'| j| jI d H  d| _t	| j| _d S )N)r(   F)
ry   rh   ri   rf   r*   rk   r%   r#   r}   r~   )r   forcer   r   r   rs     s   
zFSMContextProxy.savec                 C   s   | ` | j S rZ   )r#   ri   r{   r   r   r   r   r{     s   
zFSMContextProxy.clearNc                 C   s   | j ||S rZ   )ri   get)r   rF   r   r   r   r   r     s   zFSMContextProxy.getc                 C      |    | j||S rZ   )ry   ri   
setdefaultr   r   r   r   r   r   r        zFSMContextProxy.setdefaultc                 K   s,   |    |d u r
i }| jj|fi | d S rZ   )ry   ri   r|   ra   r   r   r   r|     s   zFSMContextProxy.updatec                 C   r   rZ   )ry   ri   popr   r   r   r   r     r   zFSMContextProxy.popc                 C   
   | j  S rZ   )ri   keysr   r   r   r   r        
zFSMContextProxy.keysc                 C   r   rZ   )ri   valuesr   r   r   r   r     r   zFSMContextProxy.valuesc                 C   r   rZ   )ri   itemsr   r   r   r   r     r   zFSMContextProxy.itemsc                 C   s   t | jS rZ   )r}   r~   ri   r   r   r   r   as_dict  s   zFSMContextProxy.as_dictc                 C   s
   t | jS rZ   )lenri   r   r   r   r   __len__  r   zFSMContextProxy.__len__c                 C   r   rZ   )ri   __iter__r   r   r   r   r     r   zFSMContextProxy.__iter__c                 C   s
   | j | S rZ   ri   r   itemr   r   r   __getitem__  r   zFSMContextProxy.__getitem__c                 C   s   |    || j|< d S rZ   ry   ri   )r   r   rF   r   r   r   __setitem__  r   zFSMContextProxy.__setitem__c                 C   s   |    | j|= d S rZ   r   )r   r   r   r   r   __delitem__  s   zFSMContextProxy.__delitem__c                 C   s
   || j v S rZ   r   r   r   r   r   __contains__  r   zFSMContextProxy.__contains__c                 C   sD   | j r
d| j  dnd}| jj d| d| j }| jr |d7 }|S )N'z	<default>z	 state = z	, data = z, closed = True)r#   rn   rH   ri   rl   )r   readable_stater   r   r   r   __str__  s
   zFSMContextProxy.__str__)FrZ   )!rH   rI   rJ   rV   rY   rq   rw   ry   rL   rz   rp   propertyr#   setterdeleterrs   r{   r   r   r|   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   rm   r   r[   E  s>    
		







r[   c                
   @   s$  e Zd ZdZdd Zdd Zdddddejee	df d	ejee	df d
ej
e dej
e fddZdddddejee	df d	ejee	df d
ej
e dejfddZdddddejee	df d	ejee	df dejfddZdddddejee	df d	ejee	df dej
ej fddZdddddejee	df d	ejee	df dejfddZdddddejee	df d	ejee	df d
ej
e dejfddZdddddejee	df d	ejee	df dejfddZdddddejee	df d	ejee	df dejfd d!Zed"d# ZdS )$DisabledStoragezM
    Empty storage. Use it if you don't want to use Finite-State Machine
    c                       d S rZ   r   r   r   r   r   r        zDisabledStorage.closec                    r   rZ   r   r   r   r   r   r     r   zDisabledStorage.wait_closedNr   r   r   r   r   c                   r   rZ   r   r   r   r   r   r     s   zDisabledStorage.get_statec                      |    i S rZ   _warnr   r   r   r   r!        zDisabledStorage.get_datar'   r(   c                      |    d S rZ   r   r+   r   r   r   r-        zDisabledStorage.update_datar"   r#   c                   r   rZ   r   r$   r   r   r   r%     r   zDisabledStorage.set_statec                   r   rZ   r   r)   r   r   r   r*     r   zDisabledStorage.set_datac                   r   rZ   r   r   r   r   r   r9     r   zDisabledStorage.get_bucketr:   r;   c                   r   rZ   r   r<   r   r   r   r=     r   zDisabledStorage.set_bucketc                   r   rZ   r   r>   r   r   r   r?     r   zDisabledStorage.update_bucketc                   C   s   t dtd d S )Nu   You haven’t set any storage yet so no states and no data will be saved. 
You can connect MemoryStorage for debug purposes or non-essential data.   )warnr   r   r   r   r   r   
  s   zDisabledStorage._warn)rH   rI   rJ   rK   r   r   rM   rN   rE   rO   rP   r   rQ   r!   r-   rR   r%   r*   rT   r9   r=   r?   rU   r   r   r   r   r   r     s    








r   )r}   rM   utils.deprecatedr   r   utils.exceptionsr   KEY	LAST_CALL
RATE_LIMITRESULTEXCEEDED_COUNTDELTATHROTTLE_MANAGERr   rV   r[   r   r   r   r   r   <module>   s$      ! 
