
    h'                     d    d dl Z d dlZd dlmZmZmZ  G d d          Zde j        defdZd Z	dS )	    N)AnyCallable	Coroutinec            	           e Zd ZdZd Zd Zd ZdedefdZ	dedefd	Z
ded
edeeeef         f         fdZdej        dedefdZdej        dedefdZdej        dedefdZdS )BackgroundSchedulerzf
    Schedules background tasks execution either in separate thread or in the running event loop.
    c                 `    d | _         g | _        t          j                    | _        d| _        d S )NF)_next_timer_event_loops	threadingLock_lock_stoppedselfs    P/var/www/html/auto_sub_bot/venv/lib/python3.11/site-packages/redis/background.py__init__zBackgroundScheduler.__init__   s,    ^%%
    c                 .    |                                   d S N)stopr   s    r   __del__zBackgroundScheduler.__del__   s    		r   c                 n   | j         5  | j        r	 ddd           dS d| _        | j        r | j                                         d| _        | j        D ]0}|                                r|                    |j                   1| j                                         ddd           dS # 1 swxY w Y   dS )zB
        Stop all scheduled tasks and clean up resources.
        NT)	r   r   r	   cancelr
   
is_runningcall_soon_threadsafer   clear)r   loops     r   r   zBackgroundScheduler.stop   s(    Z 	& 	&} 	& 	& 	& 	& 	& 	& 	& 	& !DM ( '')))#'  ) 9 9??$$ 9--di888##%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s   	B*A?B**B.1B.delaycallbackc                    | j         5  | j        r	 ddd           dS 	 ddd           n# 1 swxY w Y   t          j                    }| j         5  | j                            |           ddd           n# 1 swxY w Y   t          j        t          || j	        ||g|R d          }|
                                 dS )zI
        Runs callable task once after certain delay in seconds.
        NTtargetargsdaemon)r   r   asyncionew_event_loopr
   appendr   Thread_start_event_loop_in_thread_call_laterstart)r   r   r   r#   r   threads         r   run_oncezBackgroundScheduler.run_once(   sh    Z 	 	} 	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 %''Z 	+ 	+$$T***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ !.(%ADAA
 
 

 	   	+//A77A;>A;intervalc                    | j         5  | j        r	 ddd           dS 	 ddd           n# 1 swxY w Y   t          j                    }| j         5  | j                            |           ddd           n# 1 swxY w Y   t          j        t          || j	        ||g|R d          }|
                                 dS )zN
        Runs recurring callable task with given interval in seconds.
        NTr!   )r   r   r%   r&   r
   r'   r   r(   r)   _call_later_recurringr+   )r   r/   r   r#   r   r,   s         r   run_recurringz!BackgroundScheduler.run_recurring=   sh    Z 	 	} 	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 %''Z 	+ 	+$$T***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ !.2HhNNN
 
 

 	r.   coro.c                    K    j         5   j        r	 ddd           dS 	 ddd           n# 1 swxY w Y   t          j                    t	          |g|R   fd                               _        dS )z
        Runs recurring coroutine with given interval in seconds in the current event loop.
        To be used only from an async context. No additional threads are created.
        Nc                      j         5  j        r	 d d d            d S 	 d d d            n# 1 swxY w Y                                                _        d S r   r   r   
call_laterr	   )r/   r   r   tickwrappeds   r   r8   z5BackgroundScheduler.run_recurring_async.<locals>.tick`   s      =                       GIII#x>>Ds   	,00)r   r   r%   get_running_loop_async_to_sync_wrapperr7   r	   )r   r/   r3   r#   r   r8   r9   s   ``  @@@r   run_recurring_asyncz'BackgroundScheduler.run_recurring_asyncR   s      Z 	 	} 	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 '))(t;d;;;	? 	? 	? 	? 	? 	? 	? 	? 	?  ??8T::s   	266r   c                     | j         5  | j        r	 d d d            d S 	 d d d            n# 1 swxY w Y    |j        ||g|R  | _        d S r   r6   )r   r   r   r   r#   s        r   r*   zBackgroundScheduler._call_laterl   s     Z 	 	} 	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 +4?5(BTBBB   	+//c                     | j         5  | j        r	 d d d            d S 	 d d d            n# 1 swxY w Y    | j        ||| j        |||g|R   d S r   )r   r   r*   _execute_recurringr   r   r/   r   r#   s        r   r1   z)BackgroundScheduler._call_later_recurringt   s     Z 	 	} 	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	(D3T8X	
PT	
 	
 	
 	
 	
 	
r>   c                 8   | j         5  | j        r	 ddd           dS 	 ddd           n# 1 swxY w Y   	  ||  n# t          $ r Y nw xY w| j         5  | j        r	 ddd           dS 	 ddd           n# 1 swxY w Y    | j        ||| j        |||g|R   dS )zR
        Executes recurring callable task with given interval in seconds.
        N)r   r   	Exceptionr*   r@   rA   s        r   r@   z&BackgroundScheduler._execute_recurring   s    Z 	 	} 	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 		HdOOO 	 	 	D	 Z 	 	} 	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	(D3T8X	
PT	
 	
 	
 	
 	
 	
s-   	+//= 
A
	A
	A77A;>A;N)__name__
__module____qualname____doc__r   r   r   floatr   r-   r2   r   r   r<   r%   AbstractEventLoopr*   r1   r@    r   r   r   r      sd            & & &(e x    *e x    *;;%-c9S#s]3K.K%L; ; ; ;4C-C6;CGOC C C C
'
 
 	
 
 
 

'
 
 	
 
 
 
 
 
r   r   
event_loopcall_soon_cbc           	         t          j        |             | j        || g|R   	 |                                  	 t          j        |           }|D ]}|                                 |                     t          j        |ddi           n# t          $ r Y nw xY w| 	                                 dS # | 	                                 w xY w# 	 t          j        |           }|D ]}|                                 |                     t          j        |ddi           n# t          $ r Y nw xY w| 	                                 w # | 	                                 w xY wxY w)z
    Starts event loop in a thread and schedule callback as soon as event loop is ready.
    Used to be able to schedule tasks using loop.call_later.

    :param event_loop:
    :return:
    return_exceptionsTN)
r%   set_event_loop	call_soonrun_forever	all_tasksr   run_until_completegatherrC   close)rK   rL   r#   pendingtasks        r   r)   r)      s    :&&&Jz9D9999   	'
33G  ))@4@@     	 	 	D	 J	'
33G  ))@4@@     	 	 	D	 Jsl   C AB B2 
BB2 BB2 2CEADE
D,)E+D,,E/EEEc                       fd}|S )a  
    Wraps an asynchronous function so it can be used with loop.call_later.

    :param loop: The event loop in which the coroutine will be executed.
    :param coro_func: The coroutine function to wrap.
    :param args: Positional arguments to pass to the coroutine function.
    :param kwargs: Keyword arguments to pass to the coroutine function.
    :return: A regular function suitable for loop.call_later.
    c                  @    t          j          i            d S )N)r   )r%   ensure_future)r#   	coro_funckwargsr   s   r   r9   z'_async_to_sync_wrapper.<locals>.wrapped   s.    ii888tDDDDDDr   rJ   )r   r[   r#   r\   r9   s   ```` r   r;   r;      s=    E E E E E E E E Nr   )
r%   r   typingr   r   r   r   rI   r)   r;   rJ   r   r   <module>r^      s         + + + + + + + + + +V
 V
 V
 V
 V
 V
 V
 V
r)9A   <    r   