
    ՟f                     P   d Z ddlZddlZddlZddlmZmZmZmZm	Z	m
Z
mZmZ 	 ddlZddlmZ ddlmZ dZddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZ ererddlm Z! ddl"m#Z#  e$ e%d            Z& ee'd      Z( G d dee         Z) G d dee         Z y# e$ r dZY nw xY w)z2This module contains the classes JobQueue and Job.    N)TYPE_CHECKINGAnyGenericOptionalTupleUnioncastoverload)AsyncIOExecutor)AsyncIOSchedulerTF)
get_logger)build_repr_with_selected_attrs)JSONDict)ExtBot)CCTJobCallback)Job)Application   JobQueue)
class_namec                      e Zd ZdZdZdZd+dZdefdZe	d,d       Z
e	defd	       Zdej                  fd
Zed-dddeddfd       Ze	 d-deeej(                  ej                  ej*                  f   dedej                  fd       Z	 d-deeej(                  ej                  ej*                  df   dedeej                     fdZ	 	 	 	 d.dZed/d       Z	 	 	 	 	 d0dee   deeej(                  ej                  ej*                  f   dee   dee   dee   dee   dee   ddfdZ	 	 	 	 	 	 	 d1dee   deeej(                  f   deeeej(                  ej                  ej*                  f      deeeej(                  ej                  ej*                  f      dee   dee   dee   dee   dee   ddfdZ	 	 	 	 	 d0dee   dej*                  dedee   dee   dee   dee   dee   ddfd Z e!dddddfdee   dej*                  d!e"ed"f   dee   dee   dee   dee   dee   ddfd#Z#	 	 	 	 d2dee   dedee   dee   dee   dee   ddfd$Z$d+d%Z%d3d&eddfd'Z&de"d(   fd)Z'dede"d(   fd*Z(y)4r   a  This class allows you to periodically perform tasks with the bot. It is a convenience
    wrapper for the APScheduler library.

    This class is a :class:`~typing.Generic` class and accepts one type variable that specifies
    the type of the argument ``context`` of the job callbacks (:paramref:`~run_once.callback`) of
    :meth:`run_once` and the other scheduling methods.

    Important:
        If you want to use this class, you must install PTB with the optional requirement
        ``job-queue``, i.e.

        .. code-block:: bash

           pip install "python-telegram-bot[job-queue]"

    Examples:
        :any:`Timer Bot <examples.timerbot>`

    .. seealso:: :wiki:`Architecture Overview <Architecture>`,
        :wiki:`Job Queue <Extensions---JobQueue>`

    .. versionchanged:: 20.0
        To use this class, PTB must be installed via
        ``pip install "python-telegram-bot[job-queue]"``.

    Attributes:
        scheduler (:class:`apscheduler.schedulers.asyncio.AsyncIOScheduler`): The scheduler.

            Warning:
                This scheduler is configured by :meth:`set_application`. Additional configuration
                settings can be made by users. However, calling
                :meth:`~apscheduler.schedulers.base.BaseScheduler.configure` will delete any
                previous configuration settings. Therefore, please make sure to pass the values
                returned by :attr:`scheduler_configuration` to the method call in addition to your
                custom values.
                Alternatively, you can also use methods like
                :meth:`~apscheduler.schedulers.base.BaseScheduler.add_jobstore` to avoid using
                :meth:`~apscheduler.schedulers.base.BaseScheduler.configure` altogether.

            .. versionchanged:: 20.0
                Uses :class:`~apscheduler.schedulers.asyncio.AsyncIOScheduler` instead of
                :class:`~apscheduler.schedulers.background.BackgroundScheduler`

    )_application	_executor	scheduler)sunmontuewedthufrisatreturnNc                     t         st        d      d | _        t               | _        t        di | j                  | _        y )Nz\To use `JobQueue`, PTB must be installed via `pip install "python-telegram-bot[job-queue]"`. )APS_AVAILABLERuntimeErrorr   r   r   r   scheduler_configurationr   selfs    Q/var/www/cvtools/html/venv/lib/python3.12/site-packages/telegram/ext/_jobqueue.py__init__zJobQueue.__init__d   sG    5 
 KO(*-= .
**.
    c                 0    t        | | j                        S )a$  Give a string representation of the JobQueue in the form ``JobQueue[application=...]``.

        As this class doesn't implement :meth:`object.__str__`, the default implementation
        will be used, which is equivalent to :meth:`__repr__`.

        Returns:
            :obj:`str`
        )application)r   r/   r)   s    r+   __repr__zJobQueue.__repr__q   s     .d@P@PQQr-   c                 n    | j                   t        d      | j                         }||S t        d      )z1The application this JobQueue is associated with.z)No application was set for this JobQueue.z,The application instance is no longer alive.)r   r'   r*   r/   s     r+   r/   zJobQueue.application|   sB     $JKK'')"IJJr-   c                 \   t         j                  }| j                  rt        | j                  j
                  t              r\| j                  j
                  j                  r<| j                  j
                  j                  j                  xs t         j                  }|d| j                  idS )a_  Provides configuration values that are used by :class:`JobQueue` for :attr:`scheduler`.

        Tip:
            Since calling
            :meth:`scheduler.configure() <apscheduler.schedulers.base.BaseScheduler.configure>`
            deletes any previous setting, please make sure to pass these values to the method call
            in addition to your custom values:

            .. code-block:: python

                scheduler.configure(..., **job_queue.scheduler_configuration)

            Alternatively, you can also use methods like
            :meth:`~apscheduler.schedulers.base.BaseScheduler.add_jobstore` to avoid using
            :meth:`~apscheduler.schedulers.base.BaseScheduler.configure` altogether.

        .. versionadded:: 20.7

        Returns:
            Dict[:obj:`str`, :obj:`object`]: The configuration values as dictionary.

        default)timezone	executors)
pytzutcr   
isinstancer/   botr   defaultstzinfor   )r*   r5   s     r+   r(   z JobQueue.scheduler_configuration   s    0  884++//8  $$--''++44;;GtxxH !#T^^4
 	
r-   c                 h    t         j                   j                  | j                  j                        S N)datetimenowr   r5   r)   s    r+   _tz_nowzJobQueue._tz_now   s#      $$T^^%<%<==r-   time	shift_dayc                      y r>   r%   r*   rB   rC   s      r+   _parse_time_inputzJobQueue._parse_time_input   s    NQr-   c                      y r>   r%   rE   s      r+   rF   zJobQueue._parse_time_input   s    
  r-   c                    |y t        |t        t        f      r'| j                         t	        j
                  |      z   S t        |t        j
                        r| j                         |z   S t        |t        j                        rt        j                  j                  t        j                  j                  |j                  xs | j                  j                        j                         |      }|j                  %| j                  j                  j                  |      }|rI|t        j                  j                  t        j                        k  r|t	        j
                  d      z  }|S |S )N)seconds)tz   )days)r9   intfloatrA   r?   	timedeltarB   combiner@   r<   r   r5   datelocalizer7   r8   )r*   rB   rC   	date_times       r+   rF   zJobQueue._parse_time_input   s   
 <dS%L)<<>H$6$6t$DDDdH../<<>D((dHMM* ))11!!%%)O8O8O%PUUWY]I ' NN33<<YG	Y(*;*;*?*?*IIX//Q77	r-   c                     t        j                  |      | _         | j                  j                  di | j
                   y)zSet the application to be used by this JobQueue.

        Args:
            application (:class:`telegram.ext.Application`): The application.

        Nr%   )weakrefrefr   r   	configurer(   r2   s     r+   set_applicationzJobQueue.set_application   s2     $KK4   @4#?#?@r-   Job[CCT]c                 V   K   |j                  | j                         d{    y7 w)a  This method is used as a callback for the APScheduler jobs.

        More precisely, the ``func`` argument of :class:`apscheduler.job.Job` is set to this method
        and the ``arg`` argument (representing positional arguments to ``func``) is set to a tuple
        containing the :class:`JobQueue` itself and the :class:`~telegram.ext.Job` instance.

        Tip:
            This method is a static method rather than a bound method. This makes the arguments
            more transparent and allows for easier handling of PTBs integration of APScheduler
            when utilizing advanced features of APScheduler.

        Hint:
            This method is effectively a wrapper for :meth:`telegram.ext.Job.run`.

        .. versionadded:: 20.4

        Args:
            job_queue (:class:`JobQueue`): The job queue that created the job.
            job (:class:`~telegram.ext.Job`): The job to run.
        N)runr/   )	job_queuejobs     r+   job_callbackzJobQueue.job_callback   s      , ggi++,,,s   )')callbackwhendatanamechat_iduser_id
job_kwargsc           	      $   |si }|xs |j                   }t        |||||      }| j                  |d      }	 | j                  j                  | j
                  f|d|	| |f|	j                  xs | j                  j                  d|}
|
|_        |S )a  Creates a new :class:`Job` instance that runs once and adds it to the queue.

        Args:
            callback (:term:`coroutine function`): The callback function that should be executed by
                the new job. Callback signature::

                    async def callback(context: CallbackContext)

            when (:obj:`int` | :obj:`float` | :obj:`datetime.timedelta` |                                           :obj:`datetime.datetime` | :obj:`datetime.time`):
                Time in or at which the job should run. This parameter will be interpreted
                depending on its type.

                * :obj:`int` or :obj:`float` will be interpreted as "seconds from now" in which the
                  job should run.
                * :obj:`datetime.timedelta` will be interpreted as "time from now" in which the
                  job should run.
                * :obj:`datetime.datetime` will be interpreted as a specific date and time at
                  which the job should run. If the timezone (:attr:`datetime.datetime.tzinfo`) is
                  :obj:`None`, the default timezone of the bot will be used, which is UTC unless
                  :attr:`telegram.ext.Defaults.tzinfo` is used.
                * :obj:`datetime.time` will be interpreted as a specific time of day at which the
                  job should run. This could be either today or, if the time has already passed,
                  tomorrow. If the timezone (:attr:`datetime.time.tzinfo`) is :obj:`None`, the
                  default timezone of the bot will be used, which is UTC unless
                  :attr:`telegram.ext.Defaults.tzinfo` is used.

            chat_id (:obj:`int`, optional): Chat id of the chat associated with this job. If
                passed, the corresponding :attr:`~telegram.ext.CallbackContext.chat_data` will
                be available in the callback.

                .. versionadded:: 20.0

            user_id (:obj:`int`, optional): User id of the user associated with this job. If
                passed, the corresponding :attr:`~telegram.ext.CallbackContext.user_data` will
                be available in the callback.

                .. versionadded:: 20.0
            data (:obj:`object`, optional): Additional data needed for the callback function.
                Can be accessed through :attr:`Job.data` in the callback. Defaults to
                :obj:`None`.

                .. versionchanged:: 20.0
                    Renamed the parameter ``context`` to :paramref:`data`.
            name (:obj:`str`, optional): The name of the new job. Defaults to
                :external:attr:`callback.__name__ <definition.__name__>`.
            job_kwargs (:obj:`dict`, optional): Arbitrary keyword arguments to pass to the
                :meth:`apscheduler.schedulers.base.BaseScheduler.add_job()`.

        Returns:
            :class:`telegram.ext.Job`: The new :class:`Job` instance that has been added to the job
            queue.

        r_   ra   rb   rc   rd   T)rC   rQ   )rb   triggerrun_dateargsr5   )	__name__r   rF   r   add_jobr^   r<   r5   _job)r*   r_   r`   ra   rb   rc   rd   re   r]   rS   js              r+   run_oncezJobQueue.run_once   s    @ J(x((8$T7T[\**44*@	"DNN""
%%@)@)@
 
 
r-   intervalfirstlastc
           
      |   |	si }	|xs |j                   }t        |||||      }
| j                  |      }| j                  |      }|r|r||k  rt        d      t	        |t
        j                        r|j                         } | j                  j                  | j                  fd| |
f||||d|	}||
_        |
S )a~  Creates a new :class:`Job` instance that runs at specified intervals and adds it to the
        queue.

        Note:
            For a note about DST, please see the documentation of `APScheduler`_.

        .. _`APScheduler`: https://apscheduler.readthedocs.io/en/stable/modules/triggers/cron.html
                           #daylight-saving-time-behavior

        Args:
            callback (:term:`coroutine function`): The callback function that should be executed by
                the new job. Callback signature::

                    async def callback(context: CallbackContext)

            interval (:obj:`int` | :obj:`float` | :obj:`datetime.timedelta`): The interval in which
                the job will run. If it is an :obj:`int` or a :obj:`float`, it will be interpreted
                as seconds.
            first (:obj:`int` | :obj:`float` | :obj:`datetime.timedelta` |                                           :obj:`datetime.datetime` | :obj:`datetime.time`, optional):
                Time in or at which the job should run. This parameter will be interpreted
                depending on its type.

                * :obj:`int` or :obj:`float` will be interpreted as "seconds from now" in which the
                  job should run.
                * :obj:`datetime.timedelta` will be interpreted as "time from now" in which the
                  job should run.
                * :obj:`datetime.datetime` will be interpreted as a specific date and time at
                  which the job should run. If the timezone (:attr:`datetime.datetime.tzinfo`) is
                  :obj:`None`, the default timezone of the bot will be used.
                * :obj:`datetime.time` will be interpreted as a specific time of day at which the
                  job should run. This could be either today or, if the time has already passed,
                  tomorrow. If the timezone (:attr:`datetime.time.tzinfo`) is :obj:`None`, the
                  default timezone of the bot will be used, which is UTC unless
                  :attr:`telegram.ext.Defaults.tzinfo` is used.

                Defaults to :paramref:`interval`

                Note:
                    Setting :paramref:`first` to ``0``, ``datetime.datetime.now()`` or another
                    value that indicates that the job should run immediately will not work due
                    to how the APScheduler library works. If you want to run a job immediately,
                    we recommend to use an approach along the lines of::

                        job = context.job_queue.run_repeating(callback, interval=5)
                        await job.run(context.application)

                    .. seealso:: :meth:`telegram.ext.Job.run`

            last (:obj:`int` | :obj:`float` | :obj:`datetime.timedelta` |                                           :obj:`datetime.datetime` | :obj:`datetime.time`, optional):
                Latest possible time for the job to run. This parameter will be interpreted
                depending on its type. See :paramref:`first` for details.

                If :paramref:`last` is :obj:`datetime.datetime` or :obj:`datetime.time` type
                and ``last.tzinfo`` is :obj:`None`, the default timezone of the bot will be
                assumed, which is UTC unless :attr:`telegram.ext.Defaults.tzinfo` is used.

                Defaults to :obj:`None`.
            data (:obj:`object`, optional): Additional data needed for the callback function.
                Can be accessed through :attr:`Job.data` in the callback. Defaults to
                :obj:`None`.

                .. versionchanged:: 20.0
                    Renamed the parameter ``context`` to :paramref:`data`.
            name (:obj:`str`, optional): The name of the new job. Defaults to
                :external:attr:`callback.__name__ <definition.__name__>`.
            chat_id (:obj:`int`, optional): Chat id of the chat associated with this job. If
                passed, the corresponding :attr:`~telegram.ext.CallbackContext.chat_data` will
                be available in the callback.

                .. versionadded:: 20.0

            user_id (:obj:`int`, optional): User id of the user associated with this job. If
                passed, the corresponding :attr:`~telegram.ext.CallbackContext.user_data` will
                be available in the callback.

                .. versionadded:: 20.0
            job_kwargs (:obj:`dict`, optional): Arbitrary keyword arguments to pass to the
                :meth:`apscheduler.schedulers.base.BaseScheduler.add_job()`.

        Returns:
            :class:`telegram.ext.Job`: The new :class:`Job` instance that has been added to the job
            queue.

        rg   z"'last' must not be before 'first'!rp   )rh   rj   
start_dateend_daterI   rb   )rk   r   rF   
ValueErrorr9   r?   rO   total_secondsr   rl   r^   rm   )r*   r_   rp   rq   rr   ra   rb   rc   rd   re   r]   dt_firstdt_lastrn   s                 r+   run_repeatingzJobQueue.run_repeatingF  s    D J(x((8$T7T[\))%0((.xGh$6ABBh 2 23--/H"DNN""	
	
 	
 
r-   dayc	                 N   |si }|xs |j                   }t        |||||      }	 | j                  j                  | j                  fd| |	f||dk(  rdn||j
                  |j                  |j                  |j                  xs | j                  j                  d|}
|
|	_
        |	S )a	  Creates a new :class:`Job` that runs on a monthly basis and adds it to the queue.

        .. versionchanged:: 20.0
            The ``day_is_strict`` argument was removed. Instead one can now pass ``-1`` to the
            :paramref:`day` parameter to have the job run on the last day of the month.

        Args:
            callback (:term:`coroutine function`): The callback function that should be executed by
                the new job. Callback signature::

                    async def callback(context: CallbackContext)

            when (:obj:`datetime.time`): Time of day at which the job should run. If the timezone
                (``when.tzinfo``) is :obj:`None`, the default timezone of the bot will be used,
                which is UTC unless :attr:`telegram.ext.Defaults.tzinfo` is used.
            day (:obj:`int`): Defines the day of the month whereby the job would run. It should
                be within the range of ``1`` and ``31``, inclusive. If a month has fewer days than
                this number, the job will not run in this month. Passing ``-1`` leads to the job
                running on the last day of the month.
            data (:obj:`object`, optional): Additional data needed for the callback function.
                Can be accessed through :attr:`Job.data` in the callback. Defaults to
                :obj:`None`.

                .. versionchanged:: 20.0
                    Renamed the parameter ``context`` to :paramref:`data`.
            name (:obj:`str`, optional): The name of the new job. Defaults to
                :external:attr:`callback.__name__ <definition.__name__>`.
            chat_id (:obj:`int`, optional): Chat id of the chat associated with this job. If
                passed, the corresponding :attr:`~telegram.ext.CallbackContext.chat_data` will
                be available in the callback.

                .. versionadded:: 20.0

            user_id (:obj:`int`, optional): User id of the user associated with this job. If
                passed, the corresponding :attr:`~telegram.ext.CallbackContext.user_data` will
                be available in the callback.

                .. versionadded:: 20.0
            job_kwargs (:obj:`dict`, optional): Arbitrary keyword arguments to pass to the
                :meth:`apscheduler.schedulers.base.BaseScheduler.add_job()`.

        Returns:
            :class:`telegram.ext.Job`: The new :class:`Job` instance that has been added to the job
            queue.

        rg   cronrr   )rh   rj   rb   r{   hourminutesecondr5   )rk   r   r   rl   r^   r   r   r   r<   r5   rm   )r*   r_   r`   r{   ra   rb   rc   rd   re   r]   rn   s              r+   run_monthlyzJobQueue.run_monthly  s    r J(x((8$T7T[\"DNN""
);;;;[[;DNN$;$;
 
 
r-   rL   .c	                    |si }|xs |j                   }t        |||||      }	 | j                  j                  | j                  f|| |	fddj                  |D 
cg c]  }
| j                  |
    c}
      |j                  |j                  |j                  |j                  xs | j                  j                  d|}||	_        |	S c c}
w )a	  Creates a new :class:`Job` that runs on a daily basis and adds it to the queue.

        Note:
            For a note about DST, please see the documentation of `APScheduler`_.

        .. _`APScheduler`: https://apscheduler.readthedocs.io/en/stable/modules/triggers/cron.html
                           #daylight-saving-time-behavior

        Args:
            callback (:term:`coroutine function`): The callback function that should be executed by
                the new job. Callback signature::

                    async def callback(context: CallbackContext)

            time (:obj:`datetime.time`): Time of day at which the job should run. If the timezone
                (:obj:`datetime.time.tzinfo`) is :obj:`None`, the default timezone of the bot will
                be used, which is UTC unless :attr:`telegram.ext.Defaults.tzinfo` is used.
            days (Tuple[:obj:`int`], optional): Defines on which days of the week the job should
                run (where ``0-6`` correspond to sunday - saturday). By default, the job will run
                every day.

                .. versionchanged:: 20.0
                    Changed day of the week mapping of 0-6 from monday-sunday to sunday-saturday.

            data (:obj:`object`, optional): Additional data needed for the callback function.
                Can be accessed through :attr:`Job.data` in the callback. Defaults to
                :obj:`None`.

                .. versionchanged:: 20.0
                    Renamed the parameter ``context`` to :paramref:`data`.
            name (:obj:`str`, optional): The name of the new job. Defaults to
                :external:attr:`callback.__name__ <definition.__name__>`.
            chat_id (:obj:`int`, optional): Chat id of the chat associated with this job. If
                passed, the corresponding :attr:`~telegram.ext.CallbackContext.chat_data` will
                be available in the callback.

                .. versionadded:: 20.0

            user_id (:obj:`int`, optional): User id of the user associated with this job. If
                passed, the corresponding :attr:`~telegram.ext.CallbackContext.user_data` will
                be available in the callback.

                .. versionadded:: 20.0
            job_kwargs (:obj:`dict`, optional): Arbitrary keyword arguments to pass to the
                :meth:`apscheduler.schedulers.base.BaseScheduler.add_job()`.

        Returns:
            :class:`telegram.ext.Job`: The new :class:`Job` instance that has been added to the job
            queue.

        rg   r}   ,)rb   rj   rh   day_of_weekr   r   r   r5   )rk   r   r   rl   r^   join_CRON_MAPPINGr   r   r   r<   r5   rm   )r*   r_   rB   rL   ra   rb   rc   rd   re   r]   drn   s               r+   	run_dailyzJobQueue.run_daily  s    | J(x((8$T7T[\"DNN""
!FA$"4"4Q"7!FG;;;;[[;DNN$;$;
 
 
 "Gs   C
c                     |xs |j                   }t        |||||      } | j                  j                  | j                  f| |f|d|}||_        |S )aL  Creates a new custom defined :class:`Job`.

        Args:
            callback (:term:`coroutine function`): The callback function that should be executed by
                the new job. Callback signature::

                    async def callback(context: CallbackContext)

            job_kwargs (:obj:`dict`): Arbitrary keyword arguments. Used as arguments for
                :meth:`apscheduler.schedulers.base.BaseScheduler.add_job`.
            data (:obj:`object`, optional): Additional data needed for the callback function.
                Can be accessed through :attr:`Job.data` in the callback. Defaults to
                :obj:`None`.

                .. versionchanged:: 20.0
                    Renamed the parameter ``context`` to :paramref:`data`.
            name (:obj:`str`, optional): The name of the new job. Defaults to
                :external:attr:`callback.__name__ <definition.__name__>`.
            chat_id (:obj:`int`, optional): Chat id of the chat associated with this job. If
                passed, the corresponding :attr:`~telegram.ext.CallbackContext.chat_data` will
                be available in the callback.

                .. versionadded:: 20.0

            user_id (:obj:`int`, optional): User id of the user associated with this job. If
                passed, the corresponding :attr:`~telegram.ext.CallbackContext.user_data` will
                be available in the callback.

                .. versionadded:: 20.0

        Returns:
            :class:`telegram.ext.Job`: The new :class:`Job` instance that has been added to the job
            queue.

        rg   )rj   rb   )rk   r   r   rl   r^   rm   )	r*   r_   re   ra   rb   rc   rd   r]   rn   s	            r+   
run_customzJobQueue.run_customg  sa    X (x((8$T7T[\"DNN""4#4#4`D#;T`U_`
r-   c                 n   K   | j                   j                  s| j                   j                          yyw)z+Starts the :class:`~telegram.ext.JobQueue`.N)r   runningstartr)   s    r+   r   zJobQueue.start  s*      ~~%%NN  " &s   35waitc                   K   |r1t        j                  | j                  j                  ddi d{    | j                  j
                  r:| j                  j                  |       t        j                  d       d{    yy7 U7 w)zShuts down the :class:`~telegram.ext.JobQueue`.

        Args:
            wait (:obj:`bool`, optional): Whether to wait until all currently running jobs
                have finished. Defaults to :obj:`True`.

        return_exceptionsTN)r   g{Gz?)asynciogatherr   _pending_futuresr   r   shutdownsleep)r*   r   s     r+   stopzJobQueue.stop  s~      ..00"&   >>!!NN###. --%%%	 "	 &s"   /BBAB B	B	B)rY   .c                 V    t        d | j                  j                         D              S )zReturns a tuple of all *scheduled* jobs that are currently in the :class:`JobQueue`.

        Returns:
            Tuple[:class:`Job`]: Tuple of all *scheduled* jobs.
        c              3   F   K   | ]  }t         j                  |        y wr>   )r   from_aps_job).0r]   s     r+   	<genexpr>z JobQueue.jobs.<locals>.<genexpr>  s     PsS%%c*Ps   !)tupler   get_jobsr)   s    r+   jobszJobQueue.jobs  s"     Pdnn6M6M6OPPPr-   c                 H    t        fd| j                         D              S )zReturns a tuple of all *pending/scheduled* jobs with the given name that are currently
        in the :class:`JobQueue`.

        Returns:
            Tuple[:class:`Job`]: Tuple of all *pending* or *scheduled* jobs matching the name.
        c              3   B   K   | ]  }|j                   k(  s|  y wr>   rb   )r   r]   rb   s     r+   r   z,JobQueue.get_jobs_by_name.<locals>.<genexpr>  s     DS388t3CSDs   )r   r   )r*   rb   s    `r+   get_jobs_by_namezJobQueue.get_jobs_by_name  s     DDIIKDDDr-   r#   N)r#   3Application[Any, CCT, Any, Any, Any, JobQueue[CCT]])Fr/   r   r#   N)r\   zJobQueue[CCT]r]   rY   r#   N)NNNNN)NNNNNNNNNNN)T))rk   
__module____qualname____doc__	__slots__r   r,   strr0   propertyr/   r   r(   r?   rA   r
   boolrF   r   rN   rO   rB   r   rX   staticmethodr^   r   r   objectrM   ro   rz   r   	_ALL_DAYSr   r   r   r   r   r   r   r%   r-   r+   r   r   3   s   +Z ;IEM
	R# 	R K K "
 "
 "
H>** > QdQtQQ Q   E8--x/@/@(--OP    
			     E8--x/@/@(--QUUV  
(##	$	,
AP
A	
A - -6 "&"!%!%)-Rc"R E8--x/@/@(--OPR v	R
 smR #R #R X&R 
Rp _c]a!%"!%!%)-}c"} x1112} eX%7%79J9JHMMYZ[	}
 uUH$6$68I8I8==XYZ} v} sm} #} #} X&} 
}H "&"!%!%)-Lc"L mmL 	L
 vL smL #L #L X&L 
Ld !*!%"!%!%)-Rc"R mmR CHo	R
 vR smR #R #R X&R 
Rp "&"!%!%2c"2 2 v	2
 sm2 #2 #2 
2h#&t &t &.QeO, QES EU?-C Er-   c                   f   e Zd ZdZdZ	 	 	 	 ddee   dee   dee	   dee
   dee
   f
d	Zd
e	defdZdedefdZde
fdZde	fdZedd       Zedefd       Zedefd       Zej*                  deddfd       Zedeej,                     fd       Zedd       Z	 	 	 	 ddZ	 	 	 	 ddZddZy) r   a
  This class is a convenience wrapper for the jobs held in a :class:`telegram.ext.JobQueue`.
    With the current backend APScheduler, :attr:`job` holds a :class:`apscheduler.job.Job`
    instance.

    Objects of this class are comparable in terms of equality. Two objects of this class are
    considered equal, if their :class:`id <apscheduler.job.Job>` is equal.

    This class is a :class:`~typing.Generic` class and accepts one type variable that specifies
    the type of the argument ``context`` of :paramref:`callback`.

    Important:
        If you want to use this class, you must install PTB with the optional requirement
        ``job-queue``, i.e.

        .. code-block:: bash

           pip install "python-telegram-bot[job-queue]"

    Note:
        All attributes and instance methods of :attr:`job` are also directly available as
        attributes/methods of the corresponding :class:`telegram.ext.Job` object.

    Warning:
        This class should not be instantiated manually.
        Use the methods of :class:`telegram.ext.JobQueue` to schedule jobs.

    .. seealso:: :wiki:`Job Queue <Extensions---JobQueue>`

    .. versionchanged:: 20.0

       * Removed argument and attribute ``job_queue``.
       * Renamed ``Job.context`` to :attr:`Job.data`.
       * Removed argument ``job``
       * To use this class, PTB must be installed via
         ``pip install "python-telegram-bot[job-queue]"``.

    Args:
        callback (:term:`coroutine function`): The callback function that should be executed by the
            new job. Callback signature::

                async def callback(context: CallbackContext)

        data (:obj:`object`, optional): Additional data needed for the :paramref:`callback`
            function. Can be accessed through :attr:`Job.data` in the callback. Defaults to
            :obj:`None`.
        name (:obj:`str`, optional): The name of the new job. Defaults to
            :external:obj:`callback.__name__ <definition.__name__>`.
        chat_id (:obj:`int`, optional): Chat id of the chat that this job is associated with.

            .. versionadded:: 20.0
        user_id (:obj:`int`, optional): User id of the user that this job is associated with.

            .. versionadded:: 20.0
    Attributes:
        callback (:term:`coroutine function`): The callback function that should be executed by the
            new job.
        data (:obj:`object`): Optional. Additional data needed for the :attr:`callback` function.
        name (:obj:`str`): Optional. The name of the new job.
        chat_id (:obj:`int`): Optional. Chat id of the chat that this job is associated with.

            .. versionadded:: 20.0
        user_id (:obj:`int`): Optional. User id of the user that this job is associated with.

            .. versionadded:: 20.0
    )_enabledrm   _removedr_   rc   ra   rb   rd   Nr_   ra   rb   rc   rd   c                     t         st        d      || _        || _        |xs |j                  | _        || _        || _        d| _        d| _	        t        dd       | _        y )NzWTo use `Job`, PTB must be installed via `pip install "python-telegram-bot[job-queue]"`.FAPSJob)r&   r'   r_   ra   rk   rb   rc   rd   r   r   r	   rm   )r*   r_   ra   rb   rc   rd   s         r+   r,   zJob.__init__  se     5 
 +3&*	#'#<8+<+<	&-&-4(	r-   itemr#   c                 r    	 t        | j                  |      S # t        $ r}t        d| d      |d}~ww xY w)a  Overrides :py:meth:`object.__getattr__` to get specific attribute of the
        :class:`telegram.ext.Job` object or of its attribute :class:`apscheduler.job.Job`,
        if exists.

        Args:
           item (:obj:`str`): The name of the attribute.

        Returns:
            :object: The value of the attribute.

        Raises:
            :exc:`AttributeError`: If the attribute does not exist in both
                :class:`telegram.ext.Job` and :class:`apscheduler.job.Job` objects.
        zDNeither 'telegram.ext.Job' nor 'apscheduler.job.Job' has attribute ''N)getattrr]   AttributeError)r*   r   excs      r+   __getattr__zJob.__getattr__1  sG    	488T** 	 VW[V\\]^	s    	616otherc                 b    t        || j                        r| j                  |j                  k(  S y)aP  Defines equality condition for the :class:`telegram.ext.Job` object.
        Two objects of this class are considered to be equal if their
        :class:`id <apscheduler.job.Job>` are equal.

        Returns:
            :obj:`True` if both objects have :paramref:`id` parameters identical.
            :obj:`False` otherwise.
        F)r9   	__class__id)r*   r   s     r+   __eq__z
Job.__eq__G  s(     eT^^,77ehh&&r-   c                 ,    t        | j                        S )zBuilds a hash value for this object such that the hash of two objects is
        equal if and only if the objects are equal in terms of :meth:`__eq__`.

        Returns:
            :obj:`int`: The hash value of the object.
        )hashr   r)   s    r+   __hash__zJob.__hash__T  s     DGG}r-   c                     t        | | j                  j                  | j                  | j                  j
                  | j                  j                        S )a>  Give a string representation of the job in the form
        ``Job[id=..., name=..., callback=..., trigger=...]``.

        As this class doesn't implement :meth:`object.__str__`, the default implementation
        will be used, which is equivalent to :meth:`__repr__`.

        Returns:
            :obj:`str`
        )r   rb   r_   rh   )r   r]   r   rb   r_   rk   rh   r)   s    r+   r0   zJob.__repr__]  s@     .xx{{]]++HH$$
 	
r-   c                     | j                   S )z:class:`apscheduler.job.Job`: The APS Job this job is a wrapper for.

        .. versionchanged:: 20.0
            This property is now read-only.
        )rm   r)   s    r+   r]   zJob.jobo  s     yyr-   c                     | j                   S )z3:obj:`bool`: Whether this job is due to be removed.)r   r)   s    r+   removedzJob.removedx       }}r-   c                     | j                   S )z):obj:`bool`: Whether this job is enabled.)r   r)   s    r+   enabledzJob.enabled}  r   r-   statusc                     |r"| j                   j                          || _        y | j                   j                          || _        y r>   )r]   resumepauser   )r*   r   s     r+   r   zJob.enabled  s3    HHOO  HHNNr-   c                 .    | j                   j                  S )a  
        :class:`datetime.datetime`: Datetime for the next job execution.
        Datetime is localized according to :attr:`datetime.datetime.tzinfo`.
        If job is removed or already ran it equals to :obj:`None`.

        Warning:
            This attribute is only available, if the :class:`telegram.ext.JobQueue` this job
            belongs to is already started. Otherwise APScheduler raises an :exc:`AttributeError`.
        )r]   next_run_timer)   s    r+   next_tz
Job.next_t  s     xx%%%r-   c                 2    |j                   d   }||_        |S )a  Provides the :class:`telegram.ext.Job` that is associated with the given APScheduler
        job.

        Tip:
            This method can be useful when using advanced APScheduler features along with
            :class:`telegram.ext.JobQueue`.

        .. versionadded:: 20.4

        Args:
            aps_job (:class:`apscheduler.job.Job`): The APScheduler job

        Returns:
            :class:`telegram.ext.Job`
        rK   )rj   rm   )clsaps_jobext_jobs      r+   r   zJob.from_aps_job  s    " ,,q/r-   c                 h   K   t        j                  | j                  |             d{    y7 w)a  Executes the callback function independently of the jobs schedule. Also calls
        :meth:`telegram.ext.Application.update_persistence`.

        .. versionchanged:: 20.0
            Calls :meth:`telegram.ext.Application.update_persistence`.

        Args:
            application (:class:`telegram.ext.Application`): The application this job is associated
                with.
        N)r   shield_runr2   s     r+   r[   zJob.run  s#      nnTYY{3444s   (202c                 P  K   	 	 |j                   j                  j                  | |      }|j                          d {    | j                  |       d {    |j                  |        y # t        $ r>}t        j                  d| j                  |       Y d }~|j                  |        y d }~ww xY w7 z7 c# t        $ rF}|j                  |j                  d ||       d| j                   d       d {  7   Y d }~d }~ww xY w# |j                  |        w xY ww)NzEError while building CallbackContext for job %s. Job will not be run.)exc_info)r]   zJob:z:run:process_errorr   )context_typescontextfrom_job	Exception_LOGGERcriticalrm   _mark_for_persistence_updaterefresh_datar_   create_taskprocess_errorr   )r*   r/   r   r   s       r+   r   zJob._run  s     	?%33;;DDT;W &&(((--((( 444>#    [II  ! 
  444># )( 	))))$)>DGG9$67 *   	 444>s   D&&A/ B= B9B= B;B= D&/	B68"B1B= D&1B66B= ;B= =	D6D<C?=DD DD D##D&c                 F    | j                   j                          d| _        y)z
        Schedules this job for removal from the :class:`JobQueue`. It will be removed without
        executing its callback function again.
        TN)r]   remover   r)   s    r+   schedule_removalzJob.schedule_removal  s    
 	r-   r   )r#   r   )r   r   r#   rY   r   r   )rk   r   r   r   r   r   r   r   r   r   rM   r,   r   r   r   r   r0   r   r]   r   r   setterr?   r   classmethodr   r[   r   r   r%   r-   r+   r   r     s   @D	I "&"!%!%)c") v) sm	)
 #) #)2  ,F t # 
# 
$         ^^d t   
&!2!23 
& 
&  (5P5	5 ?P?	?2r-   r   )*r   r   r?   rU   typingr   r   r   r   r   r   r	   r
   r7   apscheduler.executors.asyncior   apscheduler.schedulers.asyncior   r&   ImportErrortelegram._utils.loggingr   telegram._utils.reprr   telegram._utils.typesr   telegram.ext._extbotr   telegram.ext._utils.typesr   r   apscheduler.jobr   r   telegram.extr   r   ranger   rk   r   r   r%   r-   r+   <module>r      s   & 9    V V V=?M / ? * ' 61( %(O	
X*
5T
Ews| T
EnQ'#, QW  Ms   B B%$B%