o
    @j                     @   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	 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Optionalcast)Redis)ConnectionPool)Lock)ExpiryT)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   h/var/www/www-root/data/www/ai-bot.pdev.uz/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(   6   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_isolationH   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    closeK   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_stateN   s   zRedisStorage.set_statec                    sD   | j |d}| j|I d H }t|tr|dS ttt	 |S )Nr3   utf-8)
r   r6   r   getr:   bytesdecoder   r   r9   r   r2   r;   valuer   r   r    	get_state]   s   

zRedisStorage.get_statedatac                    sN   | j |d}|s| j|I d H  d S | jj|| || jdI d H  d S )NrD   r4   )r   r6   r   r7   r8   r   r   )r   r2   rD   r;   r   r   r    set_datag   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   r   r9   r   r   rA   r   r   r    get_datav   s   

zRedisStorage.get_dataNr   N)__name__
__module____qualname____doc__jsonloadsdumpsr	   r   r   r   
_JsonLoads
_JsonDumpsr!   classmethodr9   r   r   r(   r-   r1   r   r   r<   rC   rE   rF   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 rG   )r   DEFAULT_REDIS_LOCK_KWARGSr   r   rS   )r   r   r   rS   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   rU   rS   r   )r   r2   r;   r   r   r    rU      s
   *.zRedisEventIsolation.lockc                    s   d S rG   r   r0   r   r   r    r1      s   zRedisEventIsolation.closerG   rH   )rI   rJ   rK   r	   r   r   r   r9   r   r!   rR   r(   r   r   r   rU   r1   r   r   r   r    r,      s<    
r,   )!rM   
contextlibr   typingr   r   r   r   r   r   redis.asyncio.clientr	   redis.asyncio.connectionr
   redis.asyncio.lockr   redis.typingr   aiogram.fsm.stater   aiogram.fsm.storage.baser   r   r   r   r   r   rT   rP   r9   rQ   r   r,   r   r   r   r    <module>   s      	j