o
    Fh                     @   s   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 deZ"G dd deZ#dS )    N)asynccontextmanager)AnyAsyncGeneratorCallableDictMappingOptionalcast)Redis)ConnectionPool)Lock)ExpiryT)DataNotDictLikeError)State)BaseEventIsolationBaseStorageDefaultKeyBuilder
KeyBuilder	StateType
StorageKeytimeout<   .c                   @   s  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
dZe	d!dedeeeef  ded	d fddZded	dfddZd"ddZ	d!deded	dfddZded	ee fddZdedeeef d	dfddZded	eeef fdd ZdS )#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                 C   s6   |du rt  }|| _|| _|| _|| _|| _|| _dS )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    r!   L/var/www/html/venv/lib/python3.10/site-packages/aiogram/fsm/storage/redis.py__init__   s   
zRedisStorage.__init__urlconnection_kwargskwargsc                 K   s:   |du ri }t j|fi |}t|d}| 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`
        Nconnection_poolr   r!   r   from_urlr
   clsr$   r%   r&   poolr   r!   r!   r"   r*   7   s
   
zRedisStorage.from_urlRedisEventIsolationc                 K   s   t d| j| jd|S )N)r   r   r!   )r.   r   r   )r    r&   r!   r!   r"   create_isolationI   s   zRedisStorage.create_isolationc                    s   | j jddI d H  d S )NT)close_connection_pool)r   acloser    r!   r!   r"   closeL   s   zRedisStorage.closekeystatec                    sb   | j |d}|d u r| j|I d H  d S | jj|ttt|tr%|j	n|| j
dI d H  d S )Nr5   ex)r   buildr   deletesetr	   str
isinstancer   r5   r   )r    r4   r5   	redis_keyr!   r!   r"   	set_stateO   s   zRedisStorage.set_statec                    sD   | j |d}| j|I d H }t|tr|dS ttt	 |S )Nr5   utf-8)
r   r8   r   getr<   bytesdecoder	   r   r;   r    r4   r=   valuer!   r!   r"   	get_state^   s   

zRedisStorage.get_statedatac                    sl   t |tstdt|j | j|d}|s$| j|I d H  d S | jj	|| 
|| jdI d H  d S )Nz-Data must be a dict or dict-like object, got rF   r6   )r<   dictr   type__name__r   r8   r   r9   r:   r   r   )r    r4   rF   r=   r!   r!   r"   set_datah   s   
zRedisStorage.set_datac                    sZ   | j |d}| j|I d H }|d u ri S t|tr!|d}ttt	t
f | |S )NrF   r?   )r   r8   r   r@   r<   rA   rB   r	   r   r;   r   r   rC   r!   r!   r"   get_data|   s   

zRedisStorage.get_dataNr   N)rI   
__module____qualname____doc__jsonloadsdumpsr
   r   r   r   
_JsonLoads
_JsonDumpsr#   classmethodr;   r   r   r*   r/   r3   r   r   r>   rE   r   rJ   rK   r!   r!   r!   r"   r      sx    







r   c                
   @   s   e Zd Z		ddedee deeeef  ddfddZ	e
	dded	eeeef  d
edd fddZededed fddZdddZdS )r.   Nr   r   lock_kwargsr   c                 C   s0   |d u rt  }|d u rt}|| _|| _|| _d S rL   )r   DEFAULT_REDIS_LOCK_KWARGSr   r   rW   )r    r   r   rW   r!   r!   r"   r#      s   
zRedisEventIsolation.__init__r$   r%   r&   c                 K   s:   |d u ri }t j|fi |}t|d}| dd|i|S )Nr'   r   r!   r)   r+   r!   r!   r"   r*      s
   
zRedisEventIsolation.from_urlr4   )NNc              	   C  sp   | j |d}| jjdd|i| jdti4 I d H  d V  W d   I d H  d S 1 I d H s1w   Y  d S )Nlockname
lock_classr!   )r   r8   r   rY   rW   r   )r    r4   r=   r!   r!   r"   rY      s
   *.zRedisEventIsolation.lockc                    s   d S rL   r!   r2   r!   r!   r"   r3      s   zRedisEventIsolation.closerL   rM   )rI   rN   rO   r
   r   r   r   r;   r   r#   rV   r*   r   r   r   rY   r3   r!   r!   r!   r"   r.      s<    
r.   )$rQ   
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   rX   rT   r;   rU   r   r.   r!   r!   r!   r"   <module>   s    $ 	o