o
    @Mh                     @   s   d Z zddlZW n ey   dZ Y nw ddlZddlZddlZddlmZmZm	Z	m
Z
 ddlmZmZ de	de	fdd	ZG d
d deZdS )T    NF)OptionalUnionCallableAny)StateStorageBaseStateDataContextfuncreturnc                    s    fdd}|S )Nc              	      s\   | j 4 I d H   | g|R i |I d H W  d   I d H  S 1 I d H s'w   Y  d S )N)lock)selfargskwargsr    Y/var/www/html/venv/lib/python3.10/site-packages/telebot/asyncio_storage/pickle_storage.pywrapper   s   0zwith_lock.<locals>.wrapperr   )r   r   r   r   r   	with_lock   s   r   c                   @   s\  e Zd ZdZ			d,dedee ddfd	d
ZdefddZdeddfddZ	dd Z
e			d-dedededee dee dee defddZe			d-dededee dee dee deedf fddZe			d-dededee dee dee defddZe			d-dedededeeeeef dee dee dee defd d!Ze			d-dededee dee dee defd"d#Ze			d-dededee dee dee defd$d%Z			d-dededee dee dee dee fd&d'Ze			d-dedededee dee dee defd(d)Zdefd*d+ZdS ).StatePickleStoragea  
    State storage based on pickle file.

    .. warning::

        This storage is not recommended for production use.
        Data may be corrupted. If you face a case where states do not work as expected,
        try to use another storage.

    .. code-block:: python3

        storage = StatePickleStorage()
        bot = AsyncTeleBot(token, storage=storage)

    :param file_path: Path to file where states will be stored.
    :type file_path: str

    :param prefix: Prefix for keys, default is "telebot".
    :type prefix: Optional[str]

    :param separator: Separator for keys, default is ":".
    :type separator: Optional[str]
    ./.state-save/states.pkltelebot:	file_path	separatorr	   Nc                 C   s4   t std|| _|| _|| _t | _|   d S )Nz4Please install aiofiles using `pip install aiofiles`)	aiofiles_installedImportErrorr   prefixr   asyncioLockr
   
create_dir)r   r   r   r   r   r   r   __init__0   s   
zStatePickleStorage.__init__c              	      s`   t | jd4 I d H }| I d H }t|W  d   I d H  S 1 I d H s)w   Y  d S )Nrb)aiofilesopenr   readpickleloads)r   fdatar   r   r   _read_from_file@   s
   0z"StatePickleStorage._read_from_filer'   c              	      s`   t | jd4 I d H }|t|I d H  W d   I d H  d S 1 I d H s)w   Y  d S )Nwb)r!   r"   r   writer$   dumps)r   r'   r&   r   r   r   _write_to_fileE   s   .z!StatePickleStorage._write_to_filec                 C   sp   t j| j\}}t j|dd t j| js6t| jd}ti | W d   dS 1 s/w   Y  dS dS )z2
        Create directory .save-handlers.
        T)exist_okr)   N)	ospathsplitr   makedirsisfiler"   r$   dump)r   dirsfilenamefiler   r   r   r   I   s   "zStatePickleStorage.create_dirchat_iduser_idstatebusiness_connection_idmessage_thread_idbot_idc           	   	      sb   |  ||| j| j|||}|  I d H }||vr!|i d||< n||| d< | |I d H  dS )N)r9   r'   r9   T_get_keyr   r   r(   r,   )	r   r7   r8   r9   r:   r;   r<   _keyr'   r   r   r   	set_stateS   s    
	zStatePickleStorage.set_statec              	      s<   |  ||| j| j|||}|  I d H }||i dS )Nr9   r>   r   r   r(   getr   r7   r8   r:   r;   r<   r?   r'   r   r   r   	get_staten   s   		zStatePickleStorage.get_statec              	      sP   |  ||| j| j|||}|  I d H }||v r&||= | |I d H  dS dS )NTFr=   rC   r   r   r   delete_state   s    		zStatePickleStorage.delete_statekeyvaluec              	      s~   |  ||| j| j|||}|  I d H }	|	|i }
||
d |< ||	vr-td| d||	| d |< | |	I d H  dS )Nr'   zStatePickleStorage: key z does not exist.T)r>   r   r   r(   rB   RuntimeErrorr,   )r   r7   r8   rF   rG   r:   r;   r<   r?   r'   
state_datar   r   r   set_data   s$   	zStatePickleStorage.set_datac              	      s>   |  ||| j| j|||}|  I d H }||i di S )Nr'   rA   rC   r   r   r   get_data   s   		zStatePickleStorage.get_datac              	      sV   |  ||| j| j|||}|  I d H }||v r)i || d< | |I d H  dS dS )Nr'   TFr=   rC   r   r   r   
reset_data   s    		zStatePickleStorage.reset_datac                 C   s   t | |||||dS )N)r7   r8   r:   r;   r<   )r   )r   r7   r8   r:   r;   r<   r   r   r   get_interactive_data   s   z'StatePickleStorage.get_interactive_datac           	   	      sJ   |  ||| j| j|||}|  I d H }||| d< | |I d H  dS )Nr'   Tr=   )	r   r7   r8   r'   r:   r;   r<   r?   	file_datar   r   r   save   s   
	zStatePickleStorage.savec                 C   s   d| j  d| j dS )NzStatePickleStorage(z, ))r   r   )r   r   r   r   __str__  s   zStatePickleStorage.__str__)r   r   r   )NNN)__name__
__module____qualname____doc__strr   r   dictr(   r,   r   r   intboolr@   r   rD   rE   floatrJ   rK   rL   rM   rO   rQ   r   r   r   r   r      s>   


	
r   )r   r!   r   r.   r$   r   typingr   r   r   r   $telebot.asyncio_storage.base_storager   r   r   r   r   r   r   r   <module>   s    