o
    @Mh                     @   sb   d dl Z d dlZd dlZd dl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 )
    N)OptionalUnionCallable)StateStorageBaseStateDataContextfuncreturnc                    s    fdd}|S )Nc                    s@   | j   | g|R i |W  d    S 1 sw   Y  d S N)lock)selfargskwargsr    Q/var/www/html/venv/lib/python3.10/site-packages/telebot/storage/pickle_storage.pywrapper	   s   $z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 = TeleBot(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   s(   || _ || _|| _t | _|   d S r	   )r   prefixr   	threadingLockr
   
create_dir)r   r   r   r   r   r   r   __init__)   s
   
zStatePickleStorage.__init__c                 C   s:   t | jd}t|W  d    S 1 sw   Y  d S )Nrb)openr   pickleload)r   fr   r   r   _read_from_file6   s   $z"StatePickleStorage._read_from_filedatac                 C   s>   t | jd}t|| W d    d S 1 sw   Y  d S )Nwb)r   r   r    dump)r   r$   r"   r   r   r   _write_to_file:   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    r&   )r   dirsfilenamefiler   r   r   r   >   s   "zStatePickleStorage.create_dirchat_iduser_idstatebusiness_connection_idmessage_thread_idbot_idc           	   	   C   sT   |  ||| j| j|||}|  }||vr|i d||< n||| d< | | dS )N)r3   r$   r3   T_get_keyr   r   r#   r'   )	r   r1   r2   r3   r4   r5   r6   _keyr$   r   r   r   	set_stateH   s   
	
zStatePickleStorage.set_statec              	   C   s4   |  ||| j| j|||}|  }||i dS )Nr3   r8   r   r   r#   getr   r1   r2   r4   r5   r6   r9   r$   r   r   r   	get_statec   s   		zStatePickleStorage.get_statec              	   C   sB   |  ||| j| j|||}|  }||v r||= | | dS dS )NTFr7   r=   r   r   r   delete_statex   s   		
zStatePickleStorage.delete_statekeyvaluec              	   C   s`   |  ||| j| j|||}|  }	|	|i }
||
d |< ||	vr)td| d| |	 dS )Nr$   zPickleStorage: key z does not exist.T)r8   r   r   r#   r<   RuntimeErrorr'   )r   r1   r2   r@   rA   r4   r5   r6   r9   r$   
state_datar   r   r   set_data   s    	
zStatePickleStorage.set_datac              	   C   s6   |  ||| j| j|||}|  }||i di S )Nr$   r;   r=   r   r   r   get_data   s   		zStatePickleStorage.get_datac              	   C   sH   |  ||| j| j|||}|  }||v r"i || d< | | dS dS )Nr$   TFr7   r=   r   r   r   
reset_data   s   		
zStatePickleStorage.reset_datac                 C   s   t | |||||dS )N)r1   r2   r4   r5   r6   )r   )r   r1   r2   r4   r5   r6   r   r   r   get_interactive_data   s   z'StatePickleStorage.get_interactive_datac           	   	   C   s<   |  ||| j| j|||}|  }||| d< | | dS )Nr$   Tr7   )	r   r1   r2   r$   r4   r5   r6   r9   	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   r>   r?   floatrD   rE   rF   rG   rI   rK   r   r   r   r   r      s>   


	
r   )r)   r    r   typingr   r   r   telebot.storage.base_storager   r   r   r   r   r   r   r   <module>   s    