
    soj                         d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	  ej
        e          Zdej        fdZ G d d	          Z G d
 d          ZdS )a  
Drop-in replacement for telegram.ext.JobQueue / telegram.ext.Job.

python-telegram-bot's own JobQueue is itself a thin wrapper around
APScheduler's AsyncIOScheduler, and APScheduler is already a direct
dependency of this project (see src/service/leaderboard_service.py's use of
CronTrigger), so this wrapper talks to it directly instead of going through
an intermediate Telegram-specific abstraction.
    N)AsyncIOScheduler)IntervalTrigger)DateTriggerreturnc                 d    t          | t          j                  r| S t          j        |           S )Nseconds)
isinstancedatetime	timedelta)values    /app/src/tg_compat/_jobqueue.py_as_timedeltar      s0    %+,, e,,,,    c                   :    e Zd ZdZd Zed             Zd Zd ZdS )JobzMirrors telegram.ext.Job.c                 L    || _         || _        || _        || _        || _        d S N)_aps_jobnamedata	_callback_application)selfaps_jobr   r   callbackapplications         r   __init__zJob.__init__   s,    		!'r   c                 @    | j         rt          | j         dd           nd S )Nnext_run_time)r   getattrr   s    r   next_tz
Job.next_t&   s#    @DWwt}ot<<<SWWr   c                 \    	 | j                                          d S # t          $ r Y d S w xY wr   )r   remove	Exceptionr"   s    r   schedule_removalzJob.schedule_removal*   sC    	M  """"" 	 	 	DD	s    
++c                 L  K   |                     |           }	 |                     |           d{V  dS # t          $ rb t                              d| j                    |j                            d| j         dt          j	                                d{V  Y dS w xY w)zManually trigger this job's callback once, immediately. Mirrors
        telegram.ext.Job.run(), used by timer_service.py's should_run_on_startup.jobNError running job :

)
new_contextr   r&   logger	exceptionr   botreport_error	traceback
format_exc)r   r   contexts      r   runzJob.run0   s       ))d)33	j..))))))))))) 	j 	j 	j=$)==>>>+**+h	+h+hPYPdPfPf+h+hiiiiiiiiiiii	js   7 A(B#"B#N)	__name__
__module____qualname____doc__r   propertyr#   r'   r5    r   r   r   r      sj        ##( ( ( X X XX  j j j j jr   r   c                   D    e Zd ZdZd
dZd Zd Zd ZddZddZ	dd	Z
dS )JobQueuezMirrors telegram.ext.JobQueue.Nc                 >    || _         t          |          | _        d S )N)timezone)r   r   
_scheduler)r   r   r?   s      r   r   zJobQueue.__init__>   s     '*H===r   c                 X   K   | j         j        s| j                                          d S d S r   )r@   runningstartr"   s    r   rC   zJobQueue.startB   s7      & 	$O!!#####	$ 	$r   c                 \   K   | j         j        r| j                             d           d S d S )NF)wait)r@   rB   shutdownr"   s    r   stopzJobQueue.stopF   s<      ?" 	1O$$%$00000	1 	1r   c                       fd}|S )Nc                  j  K   j                             d                   } 	  |            d {V  d S # t          $ ro d         rd         j        nd}t                              d|            | j                            d| dt          j	                                d {V  Y d S w xY w)Nr   r)   z	<unknown>r+   r,   )
r   r-   r&   r   r.   r/   r0   r1   r2   r3   )r4   r   r   
job_holderr   s     r   _runnerz&JobQueue._make_runner.<locals>._runnerK   s      '33
13FFGihw''''''''''' i i i-7]Kz!}))  !<d!<!<===k../gD/g/gyOcOeOe/g/ghhhhhhhhhhhhis   9 A5B21B2r;   )r   r   rJ   rK   s   ``` r   _make_runnerzJobQueue._make_runnerJ   s6    	i 	i 	i 	i 	i 	i 	i r   c                    d g}|d }n9t           j                             | j        j                  t	          |          z   }| j                            |                     ||          t          t	          |                                                    ||          }t          ||||| j
                  }	|	|d<   |	S )Nr   )triggerr    r   r   r   r   r   r   )r   nowr@   r?   r   add_jobrL   r   total_secondsr   r   )
r   r   intervalfirstr   r   rJ   r    r   r*   s
             r   run_repeatingzJobQueue.run_repeatingV   s    V
= MM$-11$/2JKKm\aNbNbbM/))h
33#M(,C,C,Q,Q,S,STTT'	 * 
 
 '4(PTPabbb
1
r   c                 r   d g}t          |t          j                  r|}n9t          j                            | j        j                  t          |          z   }| j                            |                     ||          t          |          |          }t          ||||| j
                  }||d<   |S )N)run_daterN   r   rO   r   )r
   r   rP   r@   r?   r   rQ   rL   r   r   r   )	r   r   whenr   r   rJ   rW   r   r*   s	            r   run_oncezJobQueue.run_oncef   s    V
dH-.. 	]HH(,,T_-EFFW[I\I\\H/))h
33222 * 
 

 '4(PTPabbb
1
r   c                     d g}t          |          }|                    d          } | j        j        |                     ||          f||d|}t          ||||| j                  }	|	|d<   |	S )NrN   rX   rO   r   )dictpopr@   rQ   rL   r   r   )
r   r   
job_kwargsr   r   rJ   kwargsrN   r   r*   s
             r   
run_customzJobQueue.run_customu   s    V
j!!**Y'')$/)h
33

 
 	
 
 '4(PTPabbb
1
r   r   )NNN)NN)r6   r7   r8   r9   r   rC   rG   rL   rU   rZ   r`   r;   r   r   r=   r=   ;   s        ((> > > >$ $ $1 1 1
 
 
            r   r=   )r9   r   loggingr2   apscheduler.schedulers.asyncior   apscheduler.triggers.intervalr   apscheduler.triggers.dater   	getLoggerr6   r.   r   r   r   r=   r;   r   r   <module>rf      s          ; ; ; ; ; ; 9 9 9 9 9 9 1 1 1 1 1 1		8	$	$-H. - - - -j j j j j j j j>F F F F F F F F F Fr   