
    x'h!                        d dl Z d dlZd dlZd dlmZ 	 d dlmZ dZd dlm	Z	m
Z
  G d de      Z G d	 d
e      Z G d de      Z G d de      Z G d d      Z G d d      Z G d d      Z G d d      Zy#  dZY cxY w)    N)	apihelper)RedisTF)StateStatesGroupc                   *    e Zd ZdZddZd Zd Zd Zy)HandlerBackendzJ
    Class for saving (next step|reply) handlers.

    :meta private:
    Nc                     |i }|| _         y N)handlers)selfr   s     P/var/www/flask-api/venv/lib/python3.12/site-packages/telebot/handler_backends.py__init__zHandlerBackend.__init__   s    H     c                     t               r
   NotImplementedErrorr   handler_group_idhandlers      r   register_handlerzHandlerBackend.register_handler       !##r   c                     t               r
   r   r   r   s     r   clear_handlerszHandlerBackend.clear_handlers   r   r   c                     t               r
   r   r   s     r   get_handlerszHandlerBackend.get_handlers    r   r   r
   )__name__
__module____qualname____doc__r   r   r   r    r   r   r   r      s    
!
$$$r   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)MemoryHandlerBackend
    :meta private:
    c                 ~    || j                   v r| j                   |   j                  |       y |g| j                   |<   y r
   )r   appendr   s      r   r   z%MemoryHandlerBackend.register_handler(   s7    t}},MM*+227;/6iDMM*+r   c                 <    | j                   j                  |d        y r
   r   popr   s     r   r   z#MemoryHandlerBackend.clear_handlers.   s    *D1r   c                 :    | j                   j                  |d       S r
   r(   r   s     r   r   z!MemoryHandlerBackend.get_handlers1   s    }}  !1488r   c                     t               r
   r   )r   filenamedel_file_after_loadings      r   load_handlersz"MemoryHandlerBackend.load_handlers4   r   r   N)r   r   r   r    r   r   r   r.   r!   r   r   r#   r#   $   s    829$r   r#   c                   n     e Zd ZdZd fd	Zd Zd Zd Zd Zd Z	ddZ
edd	       Zedd
       Z xZS )FileHandlerBackendr$   c                     t         t        |   |       || _        || _        t        j                  || j                        | _        y r
   )	superr0   r   r,   delay	threadingTimersave_handlerstimer)r   r   r,   r3   	__class__s       r   r   zFileHandlerBackend.__init__<   s9     $0: 
__UD,>,>?
r   c                     || j                   v r| j                   |   j                  |       n|g| j                   |<   | j                          y r
   )r   r&   start_save_timerr   s      r   r   z#FileHandlerBackend.register_handlerB   sC    t}},MM*+227;/6iDMM*+r   c                 \    | j                   j                  |d        | j                          y r
   r   r)   r:   r   s     r   r   z!FileHandlerBackend.clear_handlersI   s#    *D1r   c                 ^    | j                   j                  |d       }| j                          |S r
   r<   )r   r   r   s      r   r   zFileHandlerBackend.get_handlersM   s*    ==$$%5t<r   c                    | j                   j                         sj| j                  dk  r| j                          y t	        j
                  | j                  | j                        | _         | j                   j                          y y )Nr   )r7   is_aliver3   r6   r4   r5   startr   s    r   r:   z#FileHandlerBackend.start_save_timerR   sZ    zz""$zzQ""$&__TZZ9K9KL


  " %r   c                 P    | j                  | j                  | j                         y r
   )dump_handlersr   r,   rA   s    r   r6   z FileHandlerBackend.save_handlersZ   s    4==$--8r   c                     |s| j                   }| j                  ||      }|| j                  j                  |       y y )N)r-   )r,   return_load_handlersr   update)r   r,   r-   tmps       r   r.   z FileHandlerBackend.load_handlers]   s@    }}H''I_'`?MM  % r   c                    |j                  dd      d   }t        j                  |d       t        |dz   |      5 }t        j
                  t        j                  | |       n t        j
                  j                  | |       d d d        t        j                  j                  |      rt        j                  |       t        j                  |dz   |       y # 1 sw Y   WxY w)N/   )maxsplitr   T)exist_okz.tmp)rsplitosmakedirsopenr   CUSTOM_SERIALIZERpickledumppathisfileremoverename)r   r,   	file_modedirsfiles        r   rC   z FileHandlerBackend.dump_handlersd   s    sQ/2
D4((V#Y/ 	A4++3Hd+++004@		A 77>>(#IIh
		(V#X.	A 	As   ACC$c                    t         j                  j                  |       rt         j                  j                  |       dkD  rst	        | d      5 }t
        j                  t        j                  |      }nt
        j                  j                  |      }d d d        |rt        j                  |        S y y # 1 sw Y   $xY w)Nr   rb)
rN   rT   rU   getsizerP   r   rQ   rR   loadrV   )r,   r-   rZ   r   s       r   rE   z'FileHandlerBackend.return_load_handlerst   s    77>>(#(AA(Eh% F//7%{{40H(::??EH	F &		(#O )F#F Fs   AB77C )Nz./.handler-saves/handlers.savex   )NT)wb)T)r   r   r   r    r   r   r   r   r:   r6   r.   staticmethodrC   rE   __classcell__r8   s   @r   r0   r0   8   sT    @  
#9& / /  r   r0   c                   <     e Zd ZdZd fd	Zd Zd Zd Zd Z xZ	S )RedisHandlerBackendr$   c                     t         t        |   |       t        st	        d      || _        t        ||||      | _        y )Nz:Redis is not installed. Install it via 'pip install redis')r2   re   r   redis_installed	Exceptionprefixr   redis)r   r   hostportdbri   passwordr8   s          r   r   zRedisHandlerBackend.__init__   s;    !41(;XYY4r84
r   c                 N    dj                  | j                  t        |      f      S )N:)joinri   str)r   handle_group_ids     r   _keyzRedisHandlerBackend._key   s    xxc/&:;<<r   c                 (   g }| j                   j                  | j                  |            }|rt        j                  |      }|j                  |       | j                   j                  | j                  |      t        j                  |             y r
   )rj   getrt   rR   loadsr&   setdumps)r   r   r   r   values        r   r   z$RedisHandlerBackend.register_handler   se    

tyy)9:;||E*H 

tyy!12FLL4JKr   c                 X    | j                   j                  | j                  |             y r
   )rj   deletert   r   s     r   r   z"RedisHandlerBackend.clear_handlers   s    

$))$456r   c                     d }| j                   j                  | j                  |            }|r&t        j                  |      }| j                  |       |S r
   )rj   rv   rt   rR   rw   r   )r   r   r   rz   s       r   r   z RedisHandlerBackend.get_handlers   sH    

tyy)9:;||E*H 01r   )N	localhosti  r   telebotN)
r   r   r   r    r   rt   r   r   r   rb   rc   s   @r   re   re      s"    5=L7r   re   c                   2    e Zd ZU dZdZeed<   d Zd Zd Z	y)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                      y r
   r!   rA   s    r   r   zBaseMiddleware.__init__       r   c                     t         r
   r   )r   messagedatas      r   pre_processzBaseMiddleware.pre_process       !!r   c                     t         r
   r   )r   r   r   	exceptions       r   post_processzBaseMiddleware.post_process   r   r   N)
r   r   r   r    r   bool__annotations__r   r   r   r!   r   r   r   r      s$    "H #d"""r   r   c                       e Zd ZdZddZy)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.
    Nc                      y r
   r!   rA   s    r   r   zSkipHandler.__init__   r   r   returnNr   r   r   r    r   r!   r   r   r   r          r   r   c                       e Zd ZdZddZy)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.
    Nc                      y r
   r!   rA   s    r   r   zCancelUpdate.__init__   r   r   r   r   r!   r   r   r   r      r   r   r   c                       e Zd ZdZddZy)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!')
    
    Nc                      y r
   r!   rA   s    r   r   zContinueHandling.__init__  r   r   r   r   r!   r   r   r   r      s    $r   r   )rN   rR   r4   r   r   rj   r   rg   telebot.statesr   r   objectr   r#   r0   re   r   r   r   r   r!   r   r   <module>r      s    	   O
 .$V $*$> $(H HV. D." ."b	 		 	 KOs   A9 9A?