o
    LDi                     @   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   d/var/www/www-root/data/www/77.83.87.30/venv/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 )NzDefault 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    	<[