o
    HEDi                     @   sb   d dl Z d dlZd dlZd dlZd dlmZ ddlmZ dZe	 Z
e
d G dd deZdS )	    N)
Connection   )BaseStorage)RethinkDBStorageasyncioc                   @   s  e Zd ZdZ										d;deded	ed
edeje deje deje dedeje deje	j
 fddZdefddZejdd Zdd Zdd Zdddddejeedf dejeedf deje deje fdd Zdddddejeedf dejeedf deje dejfd!d"Zdddd#dejeedf dejeedf d$ejej fd%d&Zdddd'dejeedf dejeedf d(ejfd)d*Zdddd'dejeedf dejeedf d(ejfd+d,Zd-d. Zdddddejeedf dejeedf deje dejfd/d0Zdddd1dejeedf dejeedf d2ejfd3d4Zdddd1dejeedf dejeedf d2ejfd5d6Zdejej eef  fd7d8Z!d9d: Z"dS )<r   a  
    RethinkDB-based storage for FSM.

    Usage:

    .. code-block:: python3

        storage = RethinkDBStorage(db='aiogram', table='aiogram', user='aiogram', password='aiogram_secret')
        dispatcher = Dispatcher(bot, storage=storage)

    And need to close connection when shutdown

    .. code-block:: python3

        await storage.close()
        await storage.wait_closed()

    	localhostom  aiogramN   hostportdbtableauth_keyuserpasswordtimeoutsslloopc                 C   sJ   || _ || _|| _|| _|| _|| _|| _|| _|	pi | _|
| _	d | _
d S N)_host_port_db_table	_auth_key_user	_password_timeout_ssl_loop_conn)selfr   r   r   r   r   r   r   r   r   r    r"   t/var/www/www-root/data/www/ovozai.pdev.uz/venv/lib/python3.10/site-packages/aiogram/contrib/fsm_storage/rethinkdb.py__init__$   s   

zRethinkDBStorage.__init__returnc                    sH   | j du r!tj| j| j| j| j| j| j| j	| j
| jd	I dH | _ | j S )z-
        Get or create a connection.
        N)	r   r   r   r   r   r   r   r   io_loop)r    rconnectr   r   r   r   r   r   r   r   r   r!   r"   r"   r#   r(   <   s   
	zRethinkDBStorage.connectc                 C  s   |   I d H }|V  d S r   )r(   r!   connr"   r"   r#   
connectionL   s   
zRethinkDBStorage.connectionc                    s   | j   d| _ dS )z%
        Close a connection.
        N)r    closer)   r"   r"   r#   r-   Q   s   

zRethinkDBStorage.closec                    s   dS )z
        Does nothing
        Nr"   r)   r"   r"   r#   wait_closedX   s   zRethinkDBStorage.wait_closed)chatr   defaultr/   r0   c             	      s   t t| j||d\}}|  4 I d H &}t| j|| d | 	|p)d 
|I d H W  d   I d H  S 1 I d H sAw   Y  d S )Nr/   r   state)mapstrcheck_addressr,   r'   r   r   getr0   resolve_staterunr!   r/   r   r0   r+   r"   r"   r#   	get_state^   s   0zRethinkDBStorage.get_statec             	         t t| j||d\}}|  4 I d H #}t| j|| d |p&i 	|I d H W  d   I d H  S 1 I d H s>w   Y  d S )Nr1   data
r3   r4   r5   r,   r'   r   r   r6   r0   r8   r9   r"   r"   r#   get_dataf   
   .0zRethinkDBStorage.get_data)r/   r   r2   r2   c             	      s   t t| j||d\}}|  4 I d H &}t| jjd||d| |iidd	|I d H  W d   I d H  d S 1 I d H sAw   Y  d S )Nr1   idr2   updateconflict)
r3   r4   r5   r,   r'   r   r   insertr7   r8   )r!   r/   r   r2   r+   r"   r"   r#   	set_statel   s   
.zRethinkDBStorage.set_state)r/   r   r<   r<   c             	         t t| j||d\}}|  4 I d H U}t| j||I d H r?t| j|	|dt
|ii|I d H  n t| jd||d|ii|I d H  W d   I d H  d S W d   I d H  d S 1 I d H spw   Y  d S )Nr1   r<   r@   r3   r4   r5   r,   r'   r   r   r6   r8   rA   literalrD   )r!   r/   r   r<   r+   r"   r"   r#   set_dataw      4,.zRethinkDBStorage.set_datac             	         t t| j||d\}}|  4 I d H #}t| jjd||d|iidd|I d H  W d   I d H  d S 1 I d H s>w   Y  d S )Nr1   r@   r<   rA   rB   	r3   r4   r5   r,   r'   r   r   rD   r8   )r!   r/   r   r<   kwargsr+   r"   r"   r#   update_data   
   0.zRethinkDBStorage.update_datac                 C   s   dS )NTr"   r)   r"   r"   r#   
has_bucket   s   zRethinkDBStorage.has_bucketc             	      r;   )Nr1   bucketr=   r9   r"   r"   r#   
get_bucket   r?   zRethinkDBStorage.get_bucket)r/   r   rQ   rQ   c             	      rF   )Nr1   rQ   r@   rG   )r!   r/   r   rQ   r+   r"   r"   r#   
set_bucket   rJ   zRethinkDBStorage.set_bucketc             	      rK   )Nr1   r@   rQ   rA   rB   rL   )r!   r/   r   rQ   rM   r+   r"   r"   r#   update_bucket   rO   zRethinkDBStorage.update_bucketc              	      s   |   4 I dH 9}g }t| j|I dH j}|D ]}t|d}| D ]}t|}|	||f q(qW d  I dH  |S 1 I dH sHw   Y  |S )z
        Get list of all stored chat's and user's

        :return: list of tuples where first element is chat id and second is user id
        Nr@   )
r,   r'   r   r   r8   itemsintpopkeysappend)r!   r+   resultrU   itemr/   keyr   r"   r"   r#   get_states_list   s   z RethinkDBStorage.get_states_listc              	      s`   |   4 I dH }t| j |I dH  W d  I dH  dS 1 I dH s)w   Y  dS )z$
        Reset states in DB
        N)r,   r'   r   r   deleter8   r*   r"   r"   r#   	reset_all   s   .zRethinkDBStorage.reset_all)
r   r   r	   r	   NNNr
   NN)#__name__
__module____qualname____doc__r4   rV   typingOptionaldictr   AbstractEventLoopr$   r   r(   
contextlibasynccontextmanagerr,   r-   r.   Unionr:   Dictr>   AnyStrrE   rI   rN   rP   rR   rS   rT   ListTupler]   r_   r"   r"   r"   r#   r      s    	



&
&


&
	&
&
&
	
r   )r   rh   rd   	rethinkdb!rethinkdb.asyncio_net.net_asyncior   dispatcher.storager   __all__	RethinkDBr'   set_loop_typer   r"   r"   r"   r#   <module>   s    
