o
    @Mh!                     @   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 d dlm	Z	m
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G dd dZG dd dZG dd dZG dd dZdS )    N)	apihelper)RedisTF)StateStatesGroupc                   @   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/var/www/html/venv/lib/python3.10/site-packages/telebot/handler_backends.py__init__   s   
zHandlerBackend.__init__c                 C      t  r   NotImplementedErrorr	   handler_group_idhandlerr
   r
   r   register_handler      zHandlerBackend.register_handlerc                 C   r   r   r   r	   r   r
   r
   r   clear_handlers   r   zHandlerBackend.clear_handlersc                 C   r   r   r   r   r
   r
   r   get_handlers    r   zHandlerBackend.get_handlersr   )__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 | | d S |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   1   s   z!MemoryHandlerBackend.get_handlersc                 C   r   r   r   )r	   filenamedel_file_after_loadingr
   r
   r   load_handlers4   r   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   B   s   
z#FileHandlerBackend.register_handlerc                 C   s   | j |d  |   d S r   r   r    r/   r   r
   r
   r   r   I   s   z!FileHandlerBackend.clear_handlersc                 C   s   | j |d }|   |S r   r0   )r	   r   r   r
   r
   r   r   M   s   zFileHandlerBackend.get_handlersc                 C   sD   | j  s | jdkr|   d S t| j| j| _ | j   d S d S )Nr   )r,   is_aliver(   r+   r)   r*   startr	   r
   r
   r   r/   R   s   

z#FileHandlerBackend.start_save_timerc                 C   s   |  | j| j d S r   )dump_handlersr   r!   r3   r
   r
   r   r+   Z      z FileHandlerBackend.save_handlersTc                 C   s4   |s| j }| j||d}|d ur| j| d S 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 |}tjd u r$t| | ntj| | W d    n1 s5w   Y  tj	|rEt
| t|d | d S )N/   )maxsplitr   T)exist_okz.tmp)rsplitosmakedirsopenr   CUSTOM_SERIALIZERpickledumppathisfileremoverename)r   r!   	file_modedirsfiler
   r
   r   r4   d   s   

z FileHandlerBackend.dump_handlersc                 C   s   t j| r=t j| dkr?t| d}tjd u rt|}ntj|}W d    n1 s/w   Y  |r;t 	|  |S d S d S )Nr   rb)
r?   rE   rF   getsizerA   r   rB   rC   loadrG   )r!   r"   rK   r   r
   r
   r   r6   t   s   

z'FileHandlerBackend.return_load_handlers)Nr%   r&   )NT)r9   )T)r   r   r   r   r   r   r   r   r/   r+   r#   staticmethodr4   r6   __classcell__r
   r
   r-   r   r$   8   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'   rQ   r   redis_installed	Exceptionprefixr   redis)r	   r   hostportdbrW   passwordr-   r
   r   r      s
   zRedisHandlerBackend.__init__c                 C   s   d | jt|fS )N:)joinrW   str)r	   handle_group_idr
   r
   r   _key   r5   zRedisHandlerBackend._keyc                 C   sL   g }| j | |}|rt|}|| | j | |t| d S r   )rX   getra   rC   loadsr   setdumps)r	   r   r   r   valuer
   r
   r   r      s   

z$RedisHandlerBackend.register_handlerc                 C   s   | j | | d S r   )rX   deletera   r   r
   r
   r   r      s   z"RedisHandlerBackend.clear_handlersc                 C   s2   d }| j | |}|rt|}| | |S r   )rX   rb   ra   rC   rc   r   )r	   r   r   rf   r
   r
   r   r      s   

z RedisHandlerBackend.get_handlers)NrR   rS   r   rT   N)
r   r   r   r   r   ra   r   r   r   rP   r
   r
   r-   r   rQ      s    rQ   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      d S r   r
   r3   r
   r
   r   r         zBaseMiddleware.__init__c                 C      t r   r   )r	   messagedatar
   r
   r   pre_process   rk   zBaseMiddleware.pre_processc                 C   rl   r   r   )r	   rm   rn   	exceptionr
   r
   r   post_process   rk   zBaseMiddleware.post_processN)
r   r   r   r   ri   bool__annotations__r   ro   rq   r
   r
   r
   r   rh      s   
 $rh   c                   @      e Zd ZdZ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.
    returnNc                 C   rj   r   r
   r3   r
   r
   r   r      rk   zSkipHandler.__init__rv   Nr   r   r   r   r   r
   r
   r
   r   ru          ru   c                   @   rt   )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.
    rv   Nc                 C   rj   r   r
   r3   r
   r
   r   r      rk   zCancelUpdate.__init__rw   rx   r
   r
   r
   r   rz      ry   rz   c                   @   rt   )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!')
    
    rv   Nc                 C   rj   r   r
   r3   r
   r
   r   r     rk   zContinueHandling.__init__rw   rx   r
   r
   r
   r   r{      s    r{   )r?   rC   r)   rT   r   rX   r   rU   telebot.statesr   r   objectr   r   r$   rQ   rh   ru   rz   r{   r
   r
   r
   r   <module>   s$    K"1