a
    y{Jh                     @   s  d dl Z d dlmZm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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#G dd deZ$G dd deZ%dS )    N)ABCabstractmethod)asynccontextmanager)AnyAsyncGeneratorCallableDictLiteralOptionalcast)Redis)ConnectionPool)Lock)ExpiryT)State)DEFAULT_DESTINYBaseEventIsolationBaseStorage	StateType
StorageKeytimeout<   .c                   @   s*   e Zd ZdZeeed edddZdS )
KeyBuilderz*
    Base class for Redis key builder
    datastatelockkeypartreturnc                 C   s   dS )z
        This method should be implemented in subclasses

        :param key: contextual key
        :param part: part of the record
        :return: key to be used in Redis queries
        N )selfr   r   r!   r!   K/var/www/shaz/venv/lib/python3.9/site-packages/aiogram/fsm/storage/redis.pybuild   s    	zKeyBuilder.buildN)	__name__
__module____qualname____doc__r   r   r	   strr$   r!   r!   r!   r#   r      s   r   c                   @   sH   e Zd ZdZdddddeeeedddd	Zeed
 edddZ	dS )DefaultKeyBuilderz
    Simple Redis key builder with default prefix.

    Generates a colon-joined string with prefix, chat_id, user_id,
    optional bot_id and optional destiny.
    Zfsm:Fprefix	separatorwith_bot_idwith_destinyN)r-   r.   r/   r0   r    c                C   s   || _ || _|| _|| _dS )z
        :param prefix: prefix for all records
        :param separator: separator
        :param with_bot_id: include Bot id in the key
        :param with_destiny: include destiny key
        Nr,   )r"   r-   r.   r/   r0   r!   r!   r#   __init__2   s    zDefaultKeyBuilder.__init__r   r   c                 C   s   | j g}| jr|t|j |t|j |jrD|t|j |t|j | jrh||j	 n|j	t
krztd|| | j|S )NzRedis key builder is not configured to use key destiny other the default.

Probably, you should set `with_destiny=True` in for DefaultKeyBuilder.
E.g: `RedisStorage(redis, key_builder=DefaultKeyBuilder(with_destiny=True))`)r-   r/   appendr)   Zbot_idZchat_idZ	thread_idZuser_idr0   Zdestinyr   
ValueErrorr.   join)r"   r   r   partsr!   r!   r#   r$   E   s    

zDefaultKeyBuilder.build)
r%   r&   r'   r(   r)   boolr1   r   r	   r$   r!   r!   r!   r#   r*   *   s   
r*   c                	   @   s   e Zd ZdZdddejejfeee	 ee
 ee
 eeddddZedeeeeef  ed dddZed	d
ddZddddZdeeddddZeee dddZeeeef ddddZeeeef d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_dumpsr    c                 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*   r8   r9   r:   r;   r<   r=   )r"   r8   r9   r:   r;   r<   r=   r!   r!   r#   r1   _   s    zRedisStorage.__init__urlconnection_kwargskwargsr    c                 K   s:   |du ri }t j|fi |}t|d}| f 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Zconnection_poolr8   r   from_urlr   clsr?   r@   rA   poolr8   r!   r!   r#   rD   w   s
    
zRedisStorage.from_urlRedisEventIsolation)rA   r    c                 K   s   t f | j| jd|S )N)r8   r9   )rH   r8   r9   )r"   rA   r!   r!   r#   create_isolation   s    zRedisStorage.create_isolationr    c                    s   | j jddI d H  d S )NT)Zclose_connection_pool)r8   acloser"   r!   r!   r#   close   s    zRedisStorage.close)r   r   r    c                    s^   | j |d}|d u r*| j|I d H  n0| jj|ttt|trF|j	n|| j
dI d H  d S )Nr   ex)r9   r$   r8   deletesetr   r)   
isinstancer   r   r:   )r"   r   r   	redis_keyr!   r!   r#   	set_state   s    zRedisStorage.set_stater   r    c                    sB   | j |d}| j|I d H }t|tr4|dS ttt	 |S )Nr   utf-8)
r9   r$   r8   getrR   bytesdecoder   r
   r)   r"   r   rS   valuer!   r!   r#   	get_state   s
    

zRedisStorage.get_state)r   r   r    c                    sL   | j |d}|s(| j|I d H  d S | jj|| || jdI d H  d S )Nr   rN   )r9   r$   r8   rP   rQ   r=   r;   )r"   r   r   rS   r!   r!   r#   set_data   s    zRedisStorage.set_datac                    sX   | j |d}| j|I d H }|d u r,i S t|tr@|d}ttt	t
f | |S )Nr   rV   )r9   r$   r8   rW   rR   rX   rY   r   r   r)   r   r<   rZ   r!   r!   r#   get_data   s    

zRedisStorage.get_data)N)N)r%   r&   r'   r(   jsonloadsdumpsr   r
   r   r   
_JsonLoads
_JsonDumpsr1   classmethodr)   r   r   rD   rI   rM   r   r   rT   r\   r]   r^   r!   r!   r!   r#   r7   Z   sN     

r7   c                   @   s~   e Zd Zdeee eeeef  ddddZ	e
deeeeef  ed dddZeeed d	d
dZddddZdS )rH   N)r8   r9   lock_kwargsr    c                 C   s0   |d u rt  }|d u rt}|| _|| _|| _d S N)r*   DEFAULT_REDIS_LOCK_KWARGSr8   r9   re   )r"   r8   r9   re   r!   r!   r#   r1      s    zRedisEventIsolation.__init__r>   c                 K   s:   |d u ri }t j|fi |}t|d}| f d|i|S )NrB   r8   rC   rE   r!   r!   r#   rD      s
    
zRedisEventIsolation.from_url)NNrU   c              	   C  sl   | j |d}| jjf d|i| jdti4 I d H  d V  W d   I d H  qh1 I d H s^0    Y  d S )Nr   name
lock_class)r9   r$   r8   r   re   r   )r"   r   rS   r!   r!   r#   r      s    *zRedisEventIsolation.lockrJ   c                    s   d S rf   r!   rL   r!   r!   r#   rM      s    zRedisEventIsolation.close)NN)N)r%   r&   r'   r   r
   r   r   r)   r   r1   rd   rD   r   r   r   r   rM   r!   r!   r!   r#   rH      s*      rH   )&r_   abcr   r   
contextlibr   typingr   r   r   r   r	   r
   r   Zredis.asyncio.clientr   Zredis.asyncio.connectionr   Zredis.asyncio.lockr   Zredis.typingr   Zaiogram.fsm.stater   Zaiogram.fsm.storage.baser   r   r   r   r   rg   rb   r)   rc   r   r*   r7   rH   r!   r!   r!   r#   <module>   s    $0j