o
    LDi                     @   s   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 deZ!G dd deZ"dS )    N)AsyncGeneratorCallableMapping)asynccontextmanager)Any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dB de	dB de	dB de
ded	dfd
dZe	d!dedeeef dB 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dB 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   e/var/www/www-root/data/www/77.83.87.30/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(   8   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_isolationM   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    closeP   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 )Nr3   ex)r   buildr   deletesetr   str
isinstancer   r3   r   )r   r2   r3   	redis_keyr   r   r    	set_stateS   s   zRedisStorage.set_statec                    sD   | j |d}| j|I d H }t|tr|dS ttd B |S )Nr3   utf-8)	r   r6   r   getr:   bytesdecoder   r9   r   r2   r;   valuer   r   r    	get_stateb   s   

zRedisStorage.get_statedatac                    sp   t |tsdt|j }t|| 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 rD   r4   )r:   dicttype__name__r   r   r6   r   r7   r8   r   r   )r   r2   rD   msgr;   r   r   r    set_datal   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 )NrD   r=   )r   r6   r   r>   r:   r?   r@   r   rE   r9   r   r   rA   r   r   r    get_data   s   

zRedisStorage.get_dataNr   N)rG   
__module____qualname____doc__jsonloadsdumpsr   r   r   
_JsonLoads
_JsonDumpsr!   classmethodr9   rE   r   r(   r-   r1   r   r   r<   rC   r   rI   rJ   r   r   r   r    r      sx    







r   c                
   @   s   e Zd Z		ddededB deeef dB ddfddZe		dded	eeef dB 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 rK   )r   DEFAULT_REDIS_LOCK_KWARGSr   r   rV   )r   r   r   rV   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_urlr2   )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   r6   r   rX   rV   r
   )r   r2   r;   r   r   r    rX      s
   *.zRedisEventIsolation.lockc                    s   d S rK   r   r0   r   r   r    r1      s   zRedisEventIsolation.closerK   rL   )rG   rM   rN   r   r   rE   r9   r   r!   rU   r(   r   r   r   rX   r1   r   r   r   r    r,      s<    
r,   )#rP   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   rW   rS   r9   rT   r   r,   r   r   r   r    <module>   s      	q