
    F˝i                         d dl Z d dlmZmZmZ d dlmZ d dl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)AsyncGeneratorCallableMapping)asynccontextmanager)Any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dz  de	dz  de	dz  de
ded	dfd
Ze	 ddedeeef   dz  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dz  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          R/home/leshdev/mybot/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_url8   sC     $ "&&s@.?@d+))&))r$   RedisEventIsolationc                 F    t        d| j                  | j                  d|S )N)r   r   r+   )r1   r   r   )r!   r'   s     r"   create_isolationzRedisStorage.create_isolationM   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.closeP   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!   r9   r:   	redis_keys       r"   	set_statezRedisStorage.set_stateS   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        d z  |      S 7 8w)Nr:   utf-8)	r   r>   r   getrB   bytesdecoder   rA   r!   r9   rC   values       r"   	get_statezRedisStorage.get_stateb   sd      $$**38	jjnnY//eU#<<((C$J&& 0s   ;A8A69A8datac                 |  K   t        |t              s#dt        |      j                   }t	        |      | 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 rM   r<   )rB   dicttype__name__r   r   r>   r   r?   r@   r   r   )r!   r9   rM   msgrC   s        r"   set_datazRedisStorage.set_datal   s     
 $%A$t*BUBUAVWC&s++$$**37	**##I...jjnnOOD!}}  
 	
 	
 /	
s$   A0B<2B83?B<2B:3B<: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)NrM   rF   )r   r>   r   rG   rB   rH   rI   r   rO   rA   r   r   rJ   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)rQ   
__module____qualname____doc__jsonloadsdumpsr	   r   r   
_JsonLoads
_JsonDumpsr#   classmethodrA   rO   r   r-   r3   r8   r   r   rD   rL   r   rS   rU   r+   r$   r"   r   r      sh    *.$(#'!%!%%%  $&% T>	%
 D.% % % 
%0  48**  S>D0* 	*
 
* *(] ]1F ]<    
	'' 
t'

 c3h
 
	
&
<
< 
c3h
<r$   r   c            
           e Zd Z	 	 ddededz  deeef   dz  ddfdZe		 ddedeeef   dz  d	edd fd
       Z
ededed   fd       ZddZy)r1   Nr   r   lock_kwargsr   c                 V    |
t               }|t        }|| _        || _        || _        y rV   )r   DEFAULT_REDIS_LOCK_KWARGSr   r   rb   )r!   r   r   rb   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,   r.   s         r"   r-   zRedisEventIsolation.from_url   sC     $ "&&s@.?@d+))&))r$   r9   )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   rg   rb   r   )r!   r9   rC   s      r"   rg   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rV   r+   r7   s    r"   r8   zRedisEventIsolation.close   s	     s   rV   rW   )rQ   rX   rY   r	   r   rO   rA   r   r#   r`   r-   r   r   r   rg   r8   r+   r$   r"   r1   r1      s     *.-1	''  $&' #s(^d*	'
 
'  48
*
*  S>D0
* 	
*
 

* 
*  

	# r$   r1   )#r[   collections.abcr   r   r   
contextlibr   typingr   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   rd   r^   rA   r_   r   r1   r+   r$   r"   <module>ru      st     = = *  & 3 #   3 #  'O c3h
c3h
n<; n<b&, &r$   