o
    @j3                     @   s   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
mZmZmZmZ d dlmZ eeeef  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)asynccontextmanager)	dataclass)AnyAsyncGeneratorDictLiteralOptionalUnionoverload)StatedefaultT)frozenc                   @   sR   e Zd ZU eed< eed< eed< dZee ed< dZee 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
   r   strDEFAULT_DESTINYr    r   r   g/var/www/www-root/data/www/ai-bot.pdev.uz/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ed  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   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e	d  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_destinyr0   r1   r2   r3   r4   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(   r0   r1   r2   r3   r4   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.)r0   r2   appendr   r   r3   r   r   r   r   r4   r   r   
ValueErrorr1   join)r(   r!   r"   partserror_messager   r   r   r)   K   s$   

zDefaultKeyBuilder.buildr*   )r   r   r   r+   r   boolr5   r   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e	 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e fddZedede	dedefddZ	ddede	dee dee 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_stateu   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(   rD   rE   r   r   r   	get_value   s   	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(   rD   rE   r   r   r   r   rF      s   
c                    s   |  |I d H }|||S r*   )rC   get)r(   rD   rE   r   r$   r   r   r   rF      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$   )rC   updaterB   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   s   zBaseStorage.closer*   r'   N)r   r   r   r+   r   r   	StateTyper>   r
   r   rA   r   r   rB   rC   r   rF   rK   rM   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   rL   r   r   r   rM      s   zBaseEventIsolation.closerN   )	r   r   r   r   r   r   r   r&   rM   r   r   r   r   rP      s    
rP   N)abcr   r   
contextlibr   dataclassesr   typingr   r   r   r	   r
   r   r   aiogram.fsm.stater   r   rO   r   r   r    r,   r<   rP   r   r   r   r   <module>   s    $	<_