a
    /3e"                     @   s   d dl Z d dlZd dlZd dlmZ zd dlmZ dZW n   dZY n0 G dd deZ	G dd	 d	e	Z
G d
d de	ZG dd de	ZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZdS )    N)	apihelper)RedisTFc                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )HandlerBackendzJ
    Class for saving (next step|reply) handlers.

    :meta private:
    Nc                 C   s   |d u ri }|| _ d S N)handlers)selfr    r   K/home/pi/bot/my_env/lib/python3.9/site-packages/telebot/handler_backends.py__init__   s    zHandlerBackend.__init__c                 C   s
   t  d S r   NotImplementedErrorr   handler_group_idhandlerr   r   r	   register_handler   s    zHandlerBackend.register_handlerc                 C   s
   t  d S r   r   r   r   r   r   r	   clear_handlers   s    zHandlerBackend.clear_handlersc                 C   s
   t  d S r   r   r   r   r   r	   get_handlers   s    zHandlerBackend.get_handlers)N)__name__
__module____qualname____doc__r
   r   r   r   r   r   r   r	   r      s
   
r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )MemoryHandlerBackend
    :meta private:
    c                 C   s,   || j v r| j | | n|g| j |< d S r   )r   appendr   r   r   r	   r   &   s    
z%MemoryHandlerBackend.register_handlerc                 C   s   | j |d  d S r   r   popr   r   r   r	   r   ,   s    z#MemoryHandlerBackend.clear_handlersc                 C   s   | j |d S r   r   r   r   r   r	   r   /   s    z!MemoryHandlerBackend.get_handlersc                 C   s
   t  d S r   r   )r   filenamedel_file_after_loadingr   r   r	   load_handlers2   s    z"MemoryHandlerBackend.load_handlersN)r   r   r   r   r   r   r   r   r   r   r   r	   r   "   s
   r   c                       sp   e Zd ZdZd fdd	Zdd Zd	d
 Zdd Zdd Zdd Z	dddZ
edddZedddZ  ZS )FileHandlerBackendr   N./.handler-saves/handlers.savex   c                    s0   t t| | || _|| _t|| j| _d S r   )	superr    r
   r   delay	threadingTimersave_handlerstimer)r   r   r   r$   	__class__r   r	   r
   :   s    zFileHandlerBackend.__init__c                 C   s4   || j v r| j | | n|g| j |< |   d S r   )r   r   start_save_timerr   r   r   r	   r   @   s    
z#FileHandlerBackend.register_handlerc                 C   s   | j |d  |   d S r   r   r   r+   r   r   r   r	   r   G   s    z!FileHandlerBackend.clear_handlersc                 C   s   | j |d }|   |S r   r,   )r   r   r   r   r   r	   r   K   s    zFileHandlerBackend.get_handlersc                 C   s>   | j  s:| jdkr|   nt| j| j| _ | j   d S )Nr   )r(   is_aliver$   r'   r%   r&   startr   r   r   r	   r+   P   s
    


z#FileHandlerBackend.start_save_timerc                 C   s   |  | j| j d S r   )dump_handlersr   r   r/   r   r   r	   r'   X   s    z FileHandlerBackend.save_handlersTc                 C   s0   |s
| j }| j||d}|d ur,| j| d S )N)r   )r   return_load_handlersr   update)r   r   r   tmpr   r   r	   r   [   s
    z FileHandlerBackend.load_handlerswbc                 C   s   |j dddd }tj|dd t|d |6}tjd u rHt| | ntj| | W d    n1 sj0    Y  tj	|rt
| t|d | d S )N/   )maxsplitr   T)exist_okz.tmp)rsplitosmakedirsopenr   CUSTOM_SERIALIZERpickledumppathisfileremoverename)r   r   Z	file_modedirsfiler   r   r	   r0   b   s    
,
z FileHandlerBackend.dump_handlersc                 C   s~   t j| rzt j| dkrzt| d2}tjd u r>t|}ntj|}W d    n1 s^0    Y  |rvt 	|  |S d S )Nr   rb)
r:   r@   rA   getsizer<   r   r=   r>   loadrB   )r   r   rE   r   r   r   r	   r1   r   s    
*
z'FileHandlerBackend.return_load_handlers)Nr!   r"   )NT)r4   )T)r   r   r   r   r
   r   r   r   r+   r'   r   staticmethodr0   r1   __classcell__r   r   r)   r	   r    6   s   
r    c                       sB   e Zd ZdZd fdd	Zd	d
 Zdd Zdd Zdd Z  Z	S )RedisHandlerBackendr   N	localhost  r   telebotc                    s6   t t| | tstd|| _t||||| _d S )Nz:Redis is not installed. Install it via 'pip install redis')r#   rK   r
   redis_installed	Exceptionprefixr   redis)r   r   hostportdbrQ   passwordr)   r   r	   r
      s
    zRedisHandlerBackend.__init__c                 C   s   d | jt|fS )N:)joinrQ   str)r   Zhandle_group_idr   r   r	   _key   s    zRedisHandlerBackend._keyc                 C   sL   g }| j | |}|r$t|}|| | j | |t| d S r   )rR   getrZ   r>   loadsr   setdumps)r   r   r   r   valuer   r   r	   r      s    

z$RedisHandlerBackend.register_handlerc                 C   s   | j | | d S r   )rR   deleterZ   r   r   r   r	   r      s    z"RedisHandlerBackend.clear_handlersc                 C   s2   d }| j | |}|r.t|}| | |S r   )rR   r[   rZ   r>   r\   r   )r   r   r   r_   r   r   r	   r      s    

z RedisHandlerBackend.get_handlers)NrL   rM   r   rN   N)
r   r   r   r   r
   rZ   r   r   r   rJ   r   r   r)   r	   rK      s   rK   c                   @   s,   e Zd ZdZddddZedddZdS )Statez
    Class representing a state.

    .. code-block:: python3

        class MyStates(StatesGroup):
            my_state = State() # returns my_state:State string.
    Nreturnc                 C   s
   d | _ d S r   namer/   r   r   r	   r
      s    zState.__init__c                 C   s   | j S r   rd   r/   r   r   r	   __str__   s    zState.__str__)r   r   r   r   r
   rY   rf   r   r   r   r	   ra      s   ra   c                   @   s*   e Zd ZdZddddZedd ZdS )StatesGroupz
    Class representing common states.

    .. code-block:: python3

        class MyStates(StatesGroup):
            my_state = State() # returns my_state:State string.
    Nrb   c                 C   s`   g }| j  D ]F\}}|dst|st|trd| j|f|_| |_	|
| q|| _d S )N__rW   )__dict__items
startswithcallable
isinstancera   rX   r   re   groupr   _state_list)cls
state_listre   r_   r   r   r	   __init_subclass__   s    zStatesGroup.__init_subclass__c                 C   s   | j S r   )ro   r/   r   r   r	   rq      s    zStatesGroup.state_list)r   r   r   r   rr   propertyrq   r   r   r   r	   rg      s   
rg   c                   @   s6   e Zd ZU dZdZeed< dd Zdd Zdd	 Z	d
S )BaseMiddlewarea-  
    Base class for middleware.
    Your middlewares should be inherited from this class.

    Set update_sensitive=True if you want to get different updates on
    different functions. For example, if you want to handle pre_process for
    message update, then you will have to create pre_process_message function, and
    so on. Same applies to post_process.

    .. note::
        If you want to use middleware, you have to set use_class_middlewares=True in your
        TeleBot instance.

    .. code-block:: python3
        :caption: Example of class-based middlewares.

        class MyMiddleware(BaseMiddleware):
            def __init__(self):
                self.update_sensitive = True
                self.update_types = ['message', 'edited_message']
            
            def pre_process_message(self, message, data):
                # only message update here
                pass

            def post_process_message(self, message, data, exception):
                pass # only message update here for post_process

            def pre_process_edited_message(self, message, data):
                # only edited_message update here
                pass

            def post_process_edited_message(self, message, data, exception):
                pass # only edited_message update here for post_process
    Fupdate_sensitivec                 C   s   d S r   r   r/   r   r   r	   r
      s    zBaseMiddleware.__init__c                 C   s   t d S r   r   )r   messagedatar   r   r	   pre_process   s    zBaseMiddleware.pre_processc                 C   s   t d S r   r   )r   rv   rw   	exceptionr   r   r	   post_process   s    zBaseMiddleware.post_processN)
r   r   r   r   ru   bool__annotations__r
   rx   rz   r   r   r   r	   rt      s
   
$rt   c                   @   s   e Zd ZdZddddZdS )SkipHandlerz
    Class for skipping handlers.
    Just return instance of this class 
    in middleware to skip handler.
    Update will go to post_process,
    but will skip execution of handler.
    Nrb   c                 C   s   d S r   r   r/   r   r   r	   r
     s    zSkipHandler.__init__r   r   r   r   r
   r   r   r   r	   r}      s   r}   c                   @   s   e Zd ZdZddddZdS )CancelUpdatez
    Class for canceling updates.
    Just return instance of this class 
    in middleware to skip update.
    Update will skip handler and execution
    of post_process in middlewares.
    Nrb   c                 C   s   d S r   r   r/   r   r   r	   r
     s    zCancelUpdate.__init__r~   r   r   r   r	   r     s   r   c                   @   s   e Zd ZdZddddZdS )ContinueHandlinga   
    Class for continue updates in handlers.
    Just return instance of this class 
    in handlers to continue process.
    
    .. code-block:: python3
        :caption: Example of using ContinueHandling

        @bot.message_handler(commands=['start'])
        def start(message):
            bot.send_message(message.chat.id, 'Hello World!')
            return ContinueHandling()
        
        @bot.message_handler(commands=['start'])
        def start2(message):
            bot.send_message(message.chat.id, 'Hello World2!')
    
    Nrb   c                 C   s   d S r   r   r/   r   r   r	   r
   &  s    zContinueHandling.__init__r~   r   r   r   r	   r     s   r   )r:   r>   r%   rN   r   rR   r   rO   objectr   r   r    rK   ra   rg   rt   r}   r   r   r   r   r   r	   <module>   s$   
K"1