o
    4˜ŽjÖ  ã                   @   sÄ   d dl mZmZ d dlmZm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 eeB dB ZdZe	d	d
�G dd„ dƒƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )é    )ÚABCÚabstractmethod)ÚAsyncGeneratorÚMapping)Úasynccontextmanager)Ú	dataclass)ÚAnyÚLiteralÚoverload)ÚStateNÚdefaultT)Úfrozenc                   @   sR   e Zd ZU eed< eed< eed< dZedB ed< dZedB ed< eZ	eed< dS )Ú
StorageKeyÚbot_idÚchat_idÚuser_idNÚ	thread_idÚbusiness_connection_idÚdestiny)
Ú__name__Ú
__module__Ú__qualname__ÚintÚ__annotations__r   r   ÚstrÚDEFAULT_DESTINYr   © r   r   úU/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/aiogram/fsm/storage/base.pyr      s   
 r   c                   @   s6   e Zd ZdZe	d	deded dB defdd„ƒZdS )
Ú
KeyBuilderzBase class for key builder.NÚkeyÚpart©ÚdataÚstateÚlockÚreturnc                 C   s   dS )zÂ
        Build key to be used in storage's db queries

        :param key: contextual key
        :param part: part of the record
        :return: key to be used in storage's db queries
        Nr   )Úselfr   r    r   r   r   Úbuild   s    zKeyBuilder.build©N)	r   r   r   Ú__doc__r   r   r	   r   r'   r   r   r   r   r      s    ýþ
ýür   c                   @   sb   e Zd ZdZddddddœdededed	ed
eddfdd„Z	ddeded dB defdd„Z	dS )ÚDefaultKeyBuildera$  
    Simple key builder with default prefix.

    Generates a colon-joined string with prefix, chat_id, user_id,
    optional bot_id, business_connection_id, destiny and field.

    Format:
     :code:`<prefix>:<bot_id?>:<business_connection_id?>:<chat_id>:<user_id>:<destiny?>:<field?>`
    Úfsmú:F©ÚprefixÚ	separatorÚwith_bot_idÚwith_business_connection_idÚwith_destinyr.   r/   r0   r1   r2   r%   Nc                C   s"   || _ || _|| _|| _|| _dS )a  
        :param prefix: prefix for all records
        :param separator: separator
        :param with_bot_id: include Bot id in the key
        :param with_business_connection_id: include business connection id
        :param with_destiny: include destiny key
        Nr-   )r&   r.   r/   r0   r1   r2   r   r   r   Ú__init__5   s
   
zDefaultKeyBuilder.__init__r   r    r!   c                 C   s´   | j g}| jr| t|jƒ¡ | jr|jr| t|jƒ¡ | t|jƒ¡ |jr0| t|jƒ¡ | t|j	ƒ¡ | j
rB| |j¡ n|jtkrMd}t|ƒ‚|rT| |¡ | j |¡S )Nz˜Default key builder is not configured to use key destiny other than the default.

Probably, you should set `with_destiny=True` in for DefaultKeyBuilder.)r.   r0   Úappendr   r   r1   r   r   r   r   r2   r   r   Ú
ValueErrorr/   Újoin)r&   r   r    ÚpartsÚerror_messager   r   r   r'   K   s$   
ÿ
zDefaultKeyBuilder.buildr(   )
r   r   r   r)   r   Úboolr3   r   r	   r'   r   r   r   r   r*   *   s8    ùýüûúù
øýþ
ýür*   c                
   @   s  e Zd ZdZeddededdfdd„ƒZedededB fdd	„ƒZ	eded
e
eef ddfdd„ƒZededeeef fdd„ƒZededededB fdd„ƒZededededefdd„ƒZ	ddedededB dedB fdd„Zded
e
eef deeef fdd„Zeddd„ƒZdS )ÚBaseStoragez)
    Base class for all FSM storages
    Nr   r#   r%   c                 Ã   ó   �dS )zn
        Set state for specified key

        :param key: storage key
        :param state: new state
        Nr   )r&   r   r#   r   r   r   Ú	set_statek   ó    zBaseStorage.set_statec                 Ã   r;   )z_
        Get key state

        :param key: storage key
        :return: current state
        Nr   ©r&   r   r   r   r   Ú	get_statet   r=   zBaseStorage.get_stater"   c                 Ã   r;   )ze
        Write data (replace)

        :param key: storage key
        :param data: new data
        Nr   )r&   r   r"   r   r   r   Úset_data}   r=   zBaseStorage.set_datac                 Ã   r;   )zi
        Get current data for key

        :param key: storage key
        :return: current data
        Nr   r>   r   r   r   Úget_data†   r=   zBaseStorage.get_dataÚstorage_keyÚdict_keyc                 Ã   r;   )z¸
        Get single value from data by key

        :param storage_key: storage key
        :param dict_key: value key
        :return: value stored in key of dict or ``None``
        Nr   )r&   rB   rC   r   r   r   Ú	get_value�   r=   zBaseStorage.get_valuer   c                 Ã   r;   )zç
        Get single value from data by key

        :param storage_key: storage key
        :param dict_key: value key
        :param default: default value to return
        :return: value stored in key of dict or default
        Nr   )r&   rB   rC   r   r   r   r   rD   ™   r=   c                 Ã   s   �|   |¡I d H }| ||¡S r(   )rA   Úget)r&   rB   rC   r   r"   r   r   r   rD   ¤   s   €c                 Ã   s:   �| j |d�I dH }| |¡ | j||d�I dH  | ¡ S )z¤
        Update date in the storage for key (like dict.update)

        :param key: storage key
        :param data: partial data
        :return: new data
        )r   N)r   r"   )rA   Úupdater@   Úcopy)r&   r   r"   Úcurrent_datar   r   r   Úupdate_data­   s
   €
zBaseStorage.update_datac                 Ã   r;   )zC
        Close storage (database connection, file or etc.)
        Nr   ©r&   r   r   r   Úcloseº   r=   zBaseStorage.closer(   ©r%   N)r   r   r   r)   r   r   Ú	StateTyper<   r   r?   r   r   r@   ÚdictrA   r
   rD   rI   rK   r   r   r   r   r:   f   s6     	üþýü
û&	r:   c                   @   s8   e Zd Zeededed fdd„ƒƒZed	dd„ƒZdS )
ÚBaseEventIsolationr   r%   )NNc                 C  s   �dV  dS )z˜
        Isolate events with lock.
        Will be used as context manager

        :param key: storage key
        :return: An async generator
        Nr   r>   r   r   r   r$   Â   s   €

zBaseEventIsolation.lockNc                 Ã   s   �d S r(   r   rJ   r   r   r   rK   Î   s   €zBaseEventIsolation.closerL   )	r   r   r   r   r   r   r   r$   rK   r   r   r   r   rO   Á   s    
rO   )Úabcr   r   Úcollections.abcr   r   Ú
contextlibr   Údataclassesr   Útypingr   r	   r
   Úaiogram.fsm.stater   r   rM   r   r   r   r*   r:   rO   r   r   r   r   Ú<module>   s    	<[