
    ,h                         d dl 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 d dlmZ d dlmZ d dl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 ddiZedef   Zede f   Z! G d de      Z" G d de      Z#y)    N)asynccontextmanager)AnyAsyncGeneratorCallableDictMappingOptionalcast)Redis)ConnectionPool)Lock)ExpiryT)DataNotDictLikeError)State)BaseEventIsolationBaseStorageDefaultKeyBuilder
KeyBuilder	StateType
StorageKeytimeout<   .c                   .   e Zd ZdZdddej
                  ej                  fdedee	   dee
   dee
   deded	dfd
Ze	 ddedeeeef      ded	d fd       Zded	dfdZddZ	 ddeded	dfdZded	ee   fdZdedeeef   d	dfdZded	eeef   fdZy)RedisStoragez\
    Redis storage required :code:`redis` package installed (:code:`pip install redis`)
    Nrediskey_builder	state_ttldata_ttl
json_loads
json_dumpsreturnc                 p    |
t               }|| _        || _        || _        || _        || _        || _        y)z
        :param redis: Instance of Redis connection
        :param key_builder: builder that helps to convert contextual key to string
        :param state_ttl: TTL for state records
        :param data_ttl: TTL for data records
        N)r   r   r   r   r   r   r    )selfr   r   r   r   r   r    s          L/var/www/html/venv/lib/python3.12/site-packages/aiogram/fsm/storage/redis.py__init__zRedisStorage.__init__   s=     +-K
&" $$    urlconnection_kwargskwargsc                 b    |i }t        j                  |fi |}t        |      } | dd|i|S )ae  
        Create an instance of :class:`RedisStorage` with specifying the connection string

        :param url: for example :code:`redis://user:password@host:port/db`
        :param connection_kwargs: see :code:`redis` docs
        :param kwargs: arguments to be passed to :class:`RedisStorage`
        :return: an instance of :class:`RedisStorage`
        connection_poolr    r   from_urlr   clsr'   r(   r)   poolr   s         r$   r/   zRedisStorage.from_url7   sC     $ "&&s@.?@d+))&))r&   RedisEventIsolationc                 F    t        d| j                  | j                  d|S )N)r   r   r-   )r3   r   r   )r#   r)   s     r$   create_isolationzRedisStorage.create_isolationI   s"    "\AQAQ\U[\\r&   c                 X   K   | j                   j                  d       d {    y 7 w)NT)close_connection_pool)r   acloser#   s    r$   closezRedisStorage.closeL   s!     jjd;;;s    *(*keystatec           
      L  K   | j                   j                  |d      }|$| j                  j                  |       d {    y | j                  j	                  |t        t        t        |t              r|j                  n|      | j                         d {    y 7 `7 w)Nr<   ex)r   buildr   deletesetr
   str
isinstancer   r<   r   )r#   r;   r<   	redis_keys       r$   	set_statezRedisStorage.set_stateO   s     
 $$**38	=**##I...**..SE5)A%++uM>> !    /s#   =B$B  AB$B"B$"B$c                    K   | j                   j                  |d      }| j                  j                  |       d {   }t	        |t
              r|j                  d      S t        t        t           |      S 7 <w)Nr<   utf-8)
r   r@   r   getrD   bytesdecoder
   r	   rC   r#   r;   rE   values       r$   	get_statezRedisStorage.get_state^   sd      $$**38	jjnnY//eU#<<((HSM5)) 0s   ;A<A:=A<datac                 x  K   t        |t              s!t        dt        |      j                         | j
                  j                  |d      }|s$| j                  j                  |       d {    y | j                  j                  || j                  |      | j                         d {    y 7 E7 w)Nz-Data must be a dict or dict-like object, got rO   r>   )rD   dictr   type__name__r   r@   r   rA   rB   r    r   )r#   r;   rO   rE   s       r$   set_datazRedisStorage.set_datah   s     
 $%&?T
@S@S?TU  $$**37	**##I...jjnnOOD!}}  
 	
 	
 /	
s$   A.B:0B61?B:0B81B:8B:c                 .  K   | j                   j                  |d      }| j                  j                  |       d {   }|i S t	        |t
              r|j                  d      }t        t        t        t        f   | j                  |            S 7 Uw)NrO   rH   )r   r@   r   rI   rD   rJ   rK   r
   r   rC   r   r   rL   s       r$   get_datazRedisStorage.get_data|   sz      $$**37	jjnnY//=IeU#LL)EDcNDOOE$:;; 0s   ;BBABNr!   N)rS   
__module____qualname____doc__jsonloadsdumpsr   r	   r   r   
_JsonLoads
_JsonDumpsr%   classmethodrC   r   r   r/   r5   r:   r   r   rF   rN   r   rT   rV   r-   r&   r$   r   r      sb    -1'+&*!%!%%% j)% G$	%
 7#% % % 
%0 EI***24S>*B*UX*	* *"] ]1F ]<    
	** 
#*

 c3h
 
	
(
<
< 
c3h
<r&   r   c            
           e Zd Z	 	 ddedee   deeeef      ddfdZ	e
	 ddedeeeef      d	edd fd
       Zededed   fd       ZddZy)r3   Nr   r   lock_kwargsr!   c                 V    |
t               }|t        }|| _        || _        || _        y rW   )r   DEFAULT_REDIS_LOCK_KWARGSr   r   rc   )r#   r   r   rc   s       r$   r%   zRedisEventIsolation.__init__   s4     +-K3K
&&r&   r'   r(   r)   c                 b    |i }t        j                  |fi |}t        |      } | dd|i|S )Nr+   r   r-   r.   r0   s         r$   r/   zRedisEventIsolation.from_url   sC     $ "&&s@.?@d+))&))r&   r;   )NNc                  K   | j                   j                  |d      } | j                  j                  dd|i| j                  dt
        i4 d {    d  d d d       d {    y 7 7 # 1 d {  7  sw Y   y xY ww)Nlockname
lock_classr-   )r   r@   r   rh   rc   r   )r#   r;   rE   s      r$   rh   zRedisEventIsolation.lock   sz     
 $$**37	"4::??W	WT5E5EWRVW 	 	J	 	 	 	 	 	 	sH   ABA.BA2B(A0)B0B2B8A;9B Bc                    K   y wrW   r-   r9   s    r$   r:   zRedisEventIsolation.close   s	     s   rW   rX   )rS   rY   rZ   r   r	   r   r   rC   r   r%   ra   r/   r   r   r   rh   r:   r-   r&   r$   r3   r3      s     -104	'' j)' d38n-	'
 
'  7;
*
* $DcN3
* 	
*
 

* 
*  

	# r&   r3   )$r\   
contextlibr   typingr   r   r   r   r   r	   r
   redis.asyncio.clientr   redis.asyncio.connectionr   redis.asyncio.lockr   redis.typingr   aiogram.exceptionsr   aiogram.fsm.stater   aiogram.fsm.storage.baser   r   r   r   r   r   re   r_   rC   r`   r   r3   r-   r&   r$   <module>ru      st     * O O O & 3 #   3 #  'O c3h
c3h
l<; l<^&, &r&   