
    F˝i                         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z  dz  ZdZ e	d	
       G d d             Z G d de      Z G d de      Z G d de      Z G d de      Zy)    )ABCabstractmethod)AsyncGeneratorMapping)asynccontextmanager)	dataclass)AnyLiteraloverload)StateNdefaultT)frozenc                   b    e Zd ZU eed<   eed<   eed<   dZedz  ed<   dZedz  ed<   eZ	eed<   y)
StorageKeybot_idchat_iduser_idN	thread_idbusiness_connection_iddestiny)
__name__
__module____qualname__int__annotations__r   r   strDEFAULT_DESTINYr        Q/home/leshdev/mybot/venv/lib/python3.12/site-packages/aiogram/fsm/storage/base.pyr   r      s8    KLL IsTz )-C$J-"GS"r   r   c                   >    e Zd ZdZe	 ddeded   dz  defd       Zy)	
KeyBuilderzBase class for key builder.Nkeypartdatastatelockreturnc                      y)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$   s      r    buildzKeyBuilder.build   s    r   N)	r   r   r   __doc__r   r   r
   r   r,   r   r   r    r"   r"      sC    % 9= -.5 
	 r   r"   c                   b    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Z	 ddeded   dz  defdZ	y)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_destinyr4   r5   r6   r7   r8   r)   Nc                J    || _         || _        || _        || _        || _        y)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
        Nr3   )r+   r4   r5   r6   r7   r8   s         r    __init__zDefaultKeyBuilder.__init__5   s*      "&+F((r   r#   r$   r%   c                    | j                   g}| j                  r$|j                  t        |j                               | j
                  r0|j                  r$|j                  t        |j                               |j                  t        |j                               |j                  r$|j                  t        |j                               |j                  t        |j                               | j                  r|j                  |j                         n |j                  t        k7  rd}t        |      |r|j                  |       | j                  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.)r4   r6   appendr   r   r7   r   r   r   r   r8   r   r   
ValueErrorr5   join)r+   r#   r$   partserror_messages        r    r,   zDefaultKeyBuilder.buildK   s    
 LLSZZ)++0J0JLLS7789S%&==LLS]]+,S%&LL%[[O+]  ]++LL~~""5))r   r-   )
r   r   r   r.   r   boolr:   r   r
   r,   r   r   r    r0   r0   *   s     !,1") ) 	)
 ) &*) ) 
)2 9=** -.5* 
	*r   r0   c            
       D   e Zd ZdZeddededdfd       Zedededz  fd       Z	edede
eef   ddfd	       Zededeeef   fd
       Zededededz  fd       Zededededefd       Z	 ddedededz  dedz  fdZdede
eef   deeef   fdZedd       Zy)BaseStoragez)
    Base class for all FSM storages
    Nr#   r'   r)   c                    K   yw)zn
        Set state for specified key

        :param key: storage key
        :param state: new state
        Nr   )r+   r#   r'   s      r    	set_statezBaseStorage.set_statek           c                    K   yw)z_
        Get key state

        :param key: storage key
        :return: current state
        Nr   r+   r#   s     r    	get_statezBaseStorage.get_statet   rF   rG   r&   c                    K   yw)ze
        Write data (replace)

        :param key: storage key
        :param data: new data
        Nr   )r+   r#   r&   s      r    set_datazBaseStorage.set_data}   rF   rG   c                    K   yw)zi
        Get current data for key

        :param key: storage key
        :return: current data
        Nr   rI   s     r    get_datazBaseStorage.get_data   rF   rG   storage_keydict_keyc                    K   yw)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+   rO   rP   s      r    	get_valuezBaseStorage.get_value   rF   rG   r   c                    K   yw)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+   rO   rP   r   s       r    rR   zBaseStorage.get_value   rF   rG   c                 d   K   | j                  |       d {   }|j                  ||      S 7 wr-   )rN   get)r+   rO   rP   r   r&   s        r    rR   zBaseStorage.get_value   s/      ]];//xx'** 0s   0.0c                    K   | j                  |       d{   }|j                  |       | j                  ||       d{    |j                         S 7 @7 w)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&   )rN   updaterL   copy)r+   r#   r&   current_datas       r    update_datazBaseStorage.update_data   sW      "]]s]33D!mm,m777  "" 47s!   AA+AAAAc                    K   yw)zC
        Close storage (database connection, file or etc.)
        Nr   r+   s    r    closezBaseStorage.close   rF   rG   r-   r)   N)r   r   r   r.   r   r   	StateTyperE   r   rJ   r   r	   rL   dictrN   r   rR   rZ   r]   r   r   r    rC   rC   f   s    : i 4   : #*   * GCH4E $   * c3h   :  t   :  s WZ   #	++ + t	+
 
t+#Z #wsCx7H #TRUWZRZ^ #  r   rC   c                   H    e Zd Zeededed   fd              Zedd       Zy)BaseEventIsolationr#   r)   )NNc                   K   d yw)z
        Isolate events with lock.
        Will be used as context manager

        :param key: storage key
        :return: An async generator
        Nr   rI   s     r    r(   zBaseEventIsolation.lock   s      
s   	Nc                    K   y wr-   r   r\   s    r    r]   zBaseEventIsolation.close   s	     rG   r^   )	r   r   r   r   r   r   r   r(   r]   r   r   r    rb   rb      sC    j ^J-G     r   rb   )abcr   r   collections.abcr   r   
contextlibr   dataclassesr   typingr	   r
   r   aiogram.fsm.stater   r   r_   r   r   r"   r0   rC   rb   r   r   r    <module>rk      s    # 3 * ! ) ) #%K$	 $# # # $9*
 9*xX# Xv r   