
    i                     
   d Z ddlZddlZddlmZ ddlmZmZm	Z	m
Z
mZmZ ddlmZ ddlmZm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 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% 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/m0Z0m1Z1 er
ddl2m3Z3m4Z4m5Z5 e6e7e1eee/e7f         e7f         Z8 ee9d          Z:e G d de
e/                               Z;e G d d                      Z< G d deee/e7f                   Z=dS )z-This module contains the ConversationHandler.    N)	dataclass)TYPE_CHECKINGAnyFinalGenericNoReturncast)Update)DEFAULT_TRUEDefaultValue)
get_logger)build_repr_with_selected_attrs)DVType)warn)ApplicationHandlerStop)ExtBot)BaseHandler)CallbackQueryHandler)ChosenInlineResultHandler)InlineQueryHandler)StringCommandHandler)StringRegexHandler)TypeHandler)TrackingDict)CCTConversationDictConversationKey)ApplicationJobJobQueueConversationHandler)
class_namec                   @    e Zd ZU dZdZeed<   eed<   ded<   eed<   dS )	_ConversationTimeoutContextzUsed as a datastore for conversation timeouts. Passed in the
    :paramref:`JobQueue.run_once.data` parameter. See :meth:`_trigger_timeout`.
    )applicationcallback_contextconversation_keyupdater'   r(   .Application[Any, CCT, Any, Any, Any, JobQueue]r%   r&   N)	__name__
__module____qualname____doc__	__slots__r   __annotations__r
   r        j/Users/shanyulin/my-agent/.venv/lib/python3.11/site-packages/telegram/ext/_handlers/conversationhandler.pyr$   r$   3   sQ           RI%%%%NNNAAAAr1   r$   c                   N    e Zd ZU dZdZej        ed<   eed<   de	fdZ
defdZdS )	PendingStatea  Thin wrapper around :class:`asyncio.Task` to handle block=False handlers. Note that this is
    a public class of this module, since :meth:`Application.update_persistence` needs to access it.
    It's still hidden from users, since this module itself is private.
    	old_statetaskr7   r6   returnc                 4    | j                                         S N)r7   doneselfs    r2   r;   zPendingState.doneM   s    y~~r1   c                 J   | j                                         st          d          | j                                         }|r't                              d| j                   | j        S | j                                         }|| j        t          j        }n	|| j        S |S )a  Returns the new state of the :class:`ConversationHandler` if available. If there was an
        exception during the task execution, then return the old state. If both the new and old
        state are :obj:`None`, return `CH.END`. If only the new state is :obj:`None`, return the
        old state.

        Raises:
            :exc:`RuntimeError`: If the current task has not yet finished.
        zNew state is not yet availablez<Task function raised exception. Falling back to old state %s)	r7   r;   RuntimeError	exception_LOGGERr6   resultr!   END)r=   excress      r2   resolvezPendingState.resolveP   s     y~~ 	A?@@@i!!## 	"N   >!i  ;4>1%)CC[>!
r1   N)r*   r+   r,   r-   r.   asyncioTaskr/   objectboolr;   rF   r0   r1   r2   r4   r4   A   sw          
 &I
, d              r1   r4   c                      e Zd ZU dZdZdZee         ed<   	 dZ	ee         ed<   	 dZ
ee         ed<   	 d	d
d
d	ddd	def	dddeeeeef                  deeeeeeef                  f         deeeeef                  dededededeej        z  dz  dedz  dedeeef         dz  dee         fdZdefdZedeeeeef                  fd            Zej        dedefd            Zedeeeeeeef                  f         fd             Zej        dedefd!            Zedeeeeef                  fd"            Zej        dedefd#            Zedefd$            Z e j        dedefd%            Z edefd&            Z!e!j        dedefd'            Z!edefd(            Z"e"j        dedefd)            Z"edefd*            Z#e#j        dedefd+            Z#edeej        z  dz  fd,            Z$e$j        dedefd-            Z$ededz  fd.            Z%e%j        dedefd/            Z%edefd0            Z&e&j        dedefd1            Z&edeeef         dz  fd2            Z'e'j        dedefd3            Z'd4d5deee(e)ef         f         fd6Z*d7ede)fd8Z+d9e,j-        d4d:d7ed;ed<e)ddfd=Z.d9ed4d:d7ed;ed<e)ddfd>Z/d7ede0e         dz  fd?Z1d7ed4d@dAe0e         d;ededz  f
dBZ2	 dGd9edCe)dDedz  ddfdEZ3d;eddfdFZ4dS )Hr!   a#  
    A handler to hold a conversation with a single or multiple users through Telegram updates by
    managing three collections of other handlers.

    Warning:
        :class:`ConversationHandler` heavily relies on incoming updates being processed one by one.
        When using this handler, :attr:`telegram.ext.ApplicationBuilder.concurrent_updates` should
        be set to :obj:`False`.

    Note:
        :class:`ConversationHandler` will only accept updates that are (subclass-)instances of
        :class:`telegram.Update`. This is, because depending on the :attr:`per_user` and
        :attr:`per_chat`, :class:`ConversationHandler` relies on
        :attr:`telegram.Update.effective_user` and/or :attr:`telegram.Update.effective_chat` in
        order to determine which conversation an update should belong to. For
        :attr:`per_message=True <per_message>`, :class:`ConversationHandler` uses
        :attr:`update.callback_query.message.message_id <telegram.Message.message_id>` when
        :attr:`per_chat=True <per_chat>` and
        :attr:`update.callback_query.inline_message_id <.CallbackQuery.inline_message_id>` when
        :attr:`per_chat=False <per_chat>`. For a more detailed explanation, please see our `FAQ`_.

        Finally, :class:`ConversationHandler`, does *not* handle (edited) channel posts.

    .. _`FAQ`: https://github.com/python-telegram-bot/python-telegram-bot/wiki        /Frequently-Asked-Questions#what-do-the-per_-settings-in-conversation handler-do

    The first collection, a :obj:`list` named :attr:`entry_points`, is used to initiate the
    conversation, for example with a :class:`telegram.ext.CommandHandler` or
    :class:`telegram.ext.MessageHandler`.

    The second collection, a :obj:`dict` named :attr:`states`, contains the different conversation
    steps and one or more associated handlers that should be used if the user sends a message when
    the conversation with them is currently in that state. Here you can also define a state for
    :attr:`TIMEOUT` to define the behavior when :attr:`conversation_timeout` is exceeded, and a
    state for :attr:`WAITING` to define behavior when a new update is received while the previous
    :attr:`block=False <block>` handler is not finished.

    The third collection, a :obj:`list` named :attr:`fallbacks`, is used if the user is currently
    in a conversation but the state has either no associated handler or the handler that is
    associated to the state is inappropriate for the update, for example if the update contains a
    command, but a regular text message is expected. You could use this for a ``/cancel`` command
    or to let the user know their message was not recognized.

    To change the state of conversation, the callback function of a handler must return the new
    state after responding to the user. If it does not return anything (returning :obj:`None` by
    default), the state will not change. If an entry point callback function returns :obj:`None`,
    the conversation ends immediately after the execution of this callback function.
    To end the conversation, the callback function must return :attr:`END` or ``-1``. To
    handle the conversation timeout, use handler :attr:`TIMEOUT` or ``-2``.
    Finally, :class:`telegram.ext.ApplicationHandlerStop` can be used in conversations as described
    in its documentation.

    Note:
        In each of the described collections of handlers, a handler may in turn be a
        :class:`ConversationHandler`. In that case, the child :class:`ConversationHandler` should
        have the attribute :attr:`map_to_parent` which allows returning to the parent conversation
        at specified states within the child conversation.

        Note that the keys in :attr:`map_to_parent` must not appear as keys in :attr:`states`
        attribute or else the latter will be ignored. You may map :attr:`END` to one of the parents
        states to continue the parent conversation after the child conversation has ended or even
        map a state to :attr:`END` to end the *parent* conversation from within the child
        conversation. For an example on nested :class:`ConversationHandler` s, see
        :any:`examples.nestedconversationbot`.

    Examples:
        * :any:`Conversation Bot <examples.conversationbot>`
        * :any:`Conversation Bot 2 <examples.conversationbot2>`
        * :any:`Nested Conversation Bot <examples.nestedconversationbot>`
        * :any:`Persistent Conversation Bot <examples.persistentconversationbot>`

    Args:
        entry_points (list[:class:`telegram.ext.BaseHandler`]): A list of :obj:`BaseHandler`
            objects that
            can trigger the start of the conversation. The first handler whose :meth:`check_update`
            method returns :obj:`True` will be used. If all return :obj:`False`, the update is not
            handled.
        states (dict[:obj:`object`, list[:class:`telegram.ext.BaseHandler`]]): A :obj:`dict` that
            defines the different states of conversation a user can be in and one or more
            associated :obj:`BaseHandler` objects that should be used in that state. The first
            handler whose :meth:`check_update` method returns :obj:`True` will be used.
        fallbacks (list[:class:`telegram.ext.BaseHandler`]): A list of handlers that might be used
            if the user is in a conversation, but every handler for their current state returned
            :obj:`False` on :meth:`check_update`. The first handler which :meth:`check_update`
            method returns :obj:`True` will be used. If all return :obj:`False`, the update is not
            handled.
        allow_reentry (:obj:`bool`, optional): If set to :obj:`True`, a user that is currently in a
            conversation can restart the conversation by triggering one of the entry points.
            Default is :obj:`False`.
        per_chat (:obj:`bool`, optional): If the conversation key should contain the Chat's ID.
            Default is :obj:`True`.
        per_user (:obj:`bool`, optional): If the conversation key should contain the User's ID.
            Default is :obj:`True`.
        per_message (:obj:`bool`, optional): If the conversation key should contain the Message's
            ID. Default is :obj:`False`.
        conversation_timeout (:obj:`float` | :obj:`datetime.timedelta`, optional): When this
            handler is inactive more than this timeout (in seconds), it will be automatically
            ended. If this value is ``0`` or :obj:`None` (default), there will be no timeout. The
            last received update and the corresponding :class:`context <.CallbackContext>` will be
            handled by *ALL* the handler's whose :meth:`check_update` method returns :obj:`True`
            that are in the state :attr:`ConversationHandler.TIMEOUT`.

            Caution:
                * This feature relies on the :attr:`telegram.ext.Application.job_queue` being set
                  and hence requires that the dependencies that :class:`telegram.ext.JobQueue`
                  relies on are installed.
                * Using :paramref:`conversation_timeout` with nested conversations is currently
                  not supported. You can still try to use it, but it will likely behave
                  differently from what you expect.

        name (:obj:`str`, optional): The name for this conversation handler. Required for
            persistence.
        persistent (:obj:`bool`, optional): If the conversation's dict for this handler should be
            saved. :paramref:`name` is required and persistence has to be set in
            :attr:`Application <.Application.persistence>`.

            .. versionchanged:: 20.0
                Was previously named as ``persistence``.
        map_to_parent (dict[:obj:`object`, :obj:`object`], optional): A :obj:`dict` that can be
            used to instruct a child conversation handler to transition into a mapped state on
            its parent conversation handler in place of a specified nested state.
        block (:obj:`bool`, optional): Pass :obj:`False` or :obj:`True` to set a default value for
            the :attr:`BaseHandler.block` setting of all handlers (in :attr:`entry_points`,
            :attr:`states` and :attr:`fallbacks`). The resolution order for checking if a handler
            should be run non-blocking is:

            1. :attr:`telegram.ext.BaseHandler.block` (if set)
            2. the value passed to this parameter (if any)
            3. :attr:`telegram.ext.Defaults.block` (if defaults are used)

            .. seealso:: :wiki:`Concurrency`

            .. versionchanged:: 20.0
                No longer overrides the handlers settings. Resolution order was changed.

    Raises:
        :exc:`ValueError`: If :paramref:`persistent` is used but :paramref:`name` was not set, or
            when :attr:`per_message`, :attr:`per_chat`, :attr:`per_user` are all :obj:`False`.

    Attributes:
        block (:obj:`bool`): Determines whether the callback will run in a blocking way. Always
            :obj:`True` since conversation handlers handle any non-blocking callbacks internally.

    )_allow_reentry_block_child_conversations_conversation_timeout_conversations_entry_points
_fallbacks_map_to_parent_name	_per_chat_per_message	_per_user_persistent_states_timeout_jobs_locktimeout_jobsrC   TIMEOUTWAITINGFTNr=   zConversationHandler[CCT]entry_pointsstates	fallbacksallow_reentryper_chatper_userper_messageconversation_timeoutname
persistentmap_to_parentblockc                 6   ddl m}m}m}m} d| _        || _        || _        || _        || _	        || _
        || _        || _        || _        || _        |	| _        || _        i | _        t%          j                    | _        i | _        t-                      | _        |
r| j        st3          d          |
| _        t7          | j        | j        | j        f          st3          d          | j        r| j        st?          dd           g }|                     |           |                     |           |!                                D ]}|                     |           | j        "                    d	 |D                        d
}|D ]}tG          |tH          tJ          z            r!t?          d|j&        j'         dd           n!tG          |tP                    r:tS          |j*        tV                    s t?          d|j*        j'         dd           ntG          ||          rt?          dd           n| j        rHtG          ||tX          z  tZ          z  |z  |z            r"t?          d|j&        j'         d| d           na| j        r*tG          |t\                    st?          d| d           n0| j        s)tG          |t\                    rt?          d| d           | j/        r&tG          || j&                  rt?          dd           d S )Nr   )PollAnswerHandlerPollHandlerPreCheckoutQueryHandlerShippingQueryHandlerTz:Conversations can't be persistent when handler is unnamed.z='per_user', 'per_chat' and 'per_message' can't all be 'False'znIf 'per_message=True' is used, 'per_chat=True' should also be used, since message IDs are not globally unique.   
stacklevelc              3   D   K   | ]}t          |t                    |V  d S r:   )
isinstancer!   ).0handlers     r2   	<genexpr>z/ConversationHandler.__init__.<locals>.<genexpr>c  sF       )
 )
:gGZ3[3[)
)
 )
 )
 )
 )
 )
r1   z Read this FAQ entry to learn more about the per_* settings: https://github.com/python-telegram-bot/python-telegram-bot/wiki/Frequently-Asked-Questions#what-do-the-per_-settings-in-conversationhandler-do.zJThe `ConversationHandler` only handles updates of type `telegram.Update`. z handles updates of type `str`.zkThe `ConversationHandler` only handles updates of type `telegram.Update`. The TypeHandler is set to handle .zPollHandler will never trigger in a conversation since it has no information about the chat or the user who voted in it. Do you mean the `PollAnswerHandler`?zUpdates handled by zb only have information about the user, so this handler won't ever be triggered if `per_chat=True`.zIf 'per_message=True', all entry points, state handlers, and fallbacks must be 'CallbackQueryHandler', since no other handlers have a message context.zUIf 'per_message=False', 'CallbackQueryHandler' will not be tracked for every message.zUsing `conversation_timeout` with nested conversations is currently not supported. You can still try to use it, but it will likely behave differently from what you expect.)0telegram.extrn   ro   rp   rq   rl   rM   rQ   rY   rR   rL   rW   rU   rV   rO   rT   rS   r[   rG   LockrZ   rP   setrN   ri   
ValueErrorrX   anyrf   re   rg   r   extendvaluesr(   rv   r   r   	__class__r*   r   
issubclasstyper
   r   r   r   rh   )r=   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rn   ro   rp   rq   all_handlersstate_handlersper_faq_linkrx   s                        r2   __init__zConversationHandler.__init__  sy    	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 $(
$)EQMSBK$1''"-CW"!%
;H >@"),..02>Aee! 	[di 	[YZZZ!+DM4=$2BCDD 	^\]]] 	DM 	=    @BL)))I&&&$mmoo 	0 	0N////!(( )
 )
#/)
 )
 )
 	
 	
 	
_ 	 $ :	 :	G'#7:L#LMM 1S(1S S S     
 G[11 +*W\SY:Z:Z +R9@9NR R R     
 G[11 %+  !	      (()/0 .. (	(  &'*;*D & &#& &  !	     ! *W>R*S*S =.:= =  !	     % *W>R*S*S @1=@ @     ( Z-P-P 8  !	   k:	 :	r1   r8   c                    d}t          t          | j                                                  d|                   }t	          |          }t          | j                  |k    r|dd         dz   }t          | | j        |          S )a  Give a string representation of the ConversationHandler in the form
        ``ConversationHandler[name=..., states={...}]``.

        If there are more than 3 states, only the first 3 states are listed.

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

        Returns:
            :obj:`str`
           Nr\   z, ...})ri   rb   )dictlistrb   itemsstrlenr   ri   )r=   truncation_thresholdrb   states_strings       r2   __repr__zConversationHandler.__repr__  s      !d4;,,..//0E1E0EFGGFt{222)#2#.9M- 
 
 
 	
r1   c                     | j         S )zlist[:class:`telegram.ext.BaseHandler`]: A list of :obj:`BaseHandler` objects that can
        trigger the start of the conversation.
        )rQ   r<   s    r2   ra   z ConversationHandler.entry_points  s    
 !!r1   _c                      t          d          )NzDYou can not assign a new value to entry_points after initialization.AttributeErrorr=   r   s     r2   ra   z ConversationHandler.entry_points  s    R
 
 	
r1   c                     | j         S )a   dict[:obj:`object`, list[:class:`telegram.ext.BaseHandler`]]: A :obj:`dict` that
        defines the different states of conversation a user can be in and one or more
        associated :obj:`BaseHandler` objects that should be used in that state.
        )rY   r<   s    r2   rb   zConversationHandler.states  s     |r1   c                      t          d          )Nz>You can not assign a new value to states after initialization.r   r   s     r2   rb   zConversationHandler.states  s    ]^^^r1   c                     | j         S )zlist[:class:`telegram.ext.BaseHandler`]: A list of handlers that might be used if
        the user is in a conversation, but every handler for their current state returned
        :obj:`False` on :meth:`check_update`.
        )rR   r<   s    r2   rc   zConversationHandler.fallbacks  s     r1   c                      t          d          )NzAYou can not assign a new value to fallbacks after initialization.r   r   s     r2   rc   zConversationHandler.fallbacks  s    `aaar1   c                     | j         S )zQ:obj:`bool`: Determines if a user can restart a conversation with an entry point.)rL   r<   s    r2   rd   z!ConversationHandler.allow_reentry  s     ""r1   c                      t          d          )NzEYou can not assign a new value to allow_reentry after initialization.r   r   s     r2   rd   z!ConversationHandler.allow_reentry      S
 
 	
r1   c                     | j         S )zB:obj:`bool`: If the conversation key should contain the User's ID.)rW   r<   s    r2   rf   zConversationHandler.per_user       ~r1   c                      t          d          )Nz@You can not assign a new value to per_user after initialization.r   r   s     r2   rf   zConversationHandler.per_user      _```r1   c                     | j         S )zB:obj:`bool`: If the conversation key should contain the Chat's ID.)rU   r<   s    r2   re   zConversationHandler.per_chat  r   r1   c                      t          d          )Nz@You can not assign a new value to per_chat after initialization.r   r   s     r2   re   zConversationHandler.per_chat  r   r1   c                     | j         S )zE:obj:`bool`: If the conversation key should contain the message's ID.)rV   r<   s    r2   rg   zConversationHandler.per_message  s       r1   c                      t          d          )NzCYou can not assign a new value to per_message after initialization.r   r   s     r2   rg   zConversationHandler.per_message  s    bcccr1   c                     | j         S )z:obj:`float` | :obj:`datetime.timedelta`: Optional. When this
        handler is inactive more than this timeout (in seconds), it will be automatically
        ended.
        )rO   r<   s    r2   rh   z(ConversationHandler.conversation_timeout  s     ))r1   c                      t          d          )NzLYou can not assign a new value to conversation_timeout after initialization.r   r   s     r2   rh   z(ConversationHandler.conversation_timeout  s    Z
 
 	
r1   c                     | j         S )zE:obj:`str`: Optional. The name for this :class:`ConversationHandler`.)rT   r<   s    r2   ri   zConversationHandler.name  s     zr1   c                      t          d          )Nz<You can not assign a new value to name after initialization.r   r   s     r2   ri   zConversationHandler.name$  s    [\\\r1   c                     | j         S )z:obj:`bool`: Optional. If the conversations dict for this handler should be
        saved. :attr:`name` is required and persistence has to be set in
        :attr:`Application <.Application.persistence>`.
        )rX   r<   s    r2   rj   zConversationHandler.persistent(  s     r1   c                      t          d          )NzBYou can not assign a new value to persistent after initialization.r   r   s     r2   rj   zConversationHandler.persistent0  s    abbbr1   c                     | j         S )a
  dict[:obj:`object`, :obj:`object`]: Optional. A :obj:`dict` that can be
        used to instruct a nested :class:`ConversationHandler` to transition into a mapped state on
        its parent :class:`ConversationHandler` in place of a specified nested state.
        )rS   r<   s    r2   rk   z!ConversationHandler.map_to_parent4  s     ""r1   c                      t          d          )NzEYou can not assign a new value to map_to_parent after initialization.r   r   s     r2   rk   z!ConversationHandler.map_to_parent<  r   r1   r%   r   c                 d  K   | j         r| j        r|j        st          d          | j        }t          dt                                | _        | j                            |           |j                            | j                   d{V }| j        	                    |           |
                                D ],\  }}|| j        k    r|                     | j        |           -| j        | j        i}| j        D ]1}|                    |                    |           d{V            2|S )a  Initializes the persistence for this handler and its child conversations.
        While this method is marked as protected, we expect it to be called by the
        Application/parent conversations. It's just protected to hide it from users.

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

        Returns:
            A dict {conversation.name -> TrackingDict}, which contains all dict of this
            conversation and possible child conversations.

        zRThis handler is not persistent, has no name or the application has no persistence!z%TrackingDict[ConversationKey, object]N)	new_statekey)r%   )rj   ri   persistencer?   rP   r	   r   r(   get_conversationsupdate_no_trackr   rC   _update_staterN   _initialize_persistence)r=   r%   current_conversationsstored_datar   stateoutrx   s           r2   r   z+ConversationHandler._initialize_persistenceB  s       	DI 	+2I 	  
 !% 3"3NN
 

 	""#8999 (3EEdiPPPPPPPP++K888 &++-- 	@ 	@JC  ""TX3"???y$-.0 	 	GJJ55 + 6            
r1   r(   c                    |j         }|j        }g }| j        r+|t          d          |                    |j                   | j        r+|t          d          |                    |j                   | j        rf|j        t          d          |j        j	        r |                    |j        j	                   n$|                    |j        j
        j                   t          |          S )z7Builds the conversation key associated with the update.Nz2Can't build key for update without effective chat!z2Can't build key for update without effective user!z1Can't build key for update without CallbackQuery!)effective_chateffective_userre   r?   appendidrf   rg   callback_queryinline_message_idmessage
message_idtuple)r=   r(   chatuserr   s        r2   _get_keyzConversationHandler._get_keyv  s    $$!= 	 |"#WXXXJJtw= 	 |"#WXXXJJtw 	E$,"#VWWW$6 E

60BCCCC

608CDDDSzzr1   r   r)   contextr'   c                    K   	 | d {V }n4# t           $ r'}t                              d|           Y d }~d S d }~ww xY w|                     |||||          S )NzTNon-blocking handler callback raised exception. Not scheduling conversation timeout.exc_info)r   r%   r(   r   r'   )	ExceptionrA   debug_schedule_job)r=   r   r%   r(   r   r'   effective_new_staterD   s           r2   _schedule_job_delayedz)ConversationHandler._schedule_job_delayed  s      	(1////// 	 	 	MM    
 44444	 !!)#- " 
 
 	
s    
>9>c           
         || j         k    rdS 	 |j        }|                    | j        | j        t          ||||                    | j        |<   dS # t          $ r'}t          	                    d|           Y d}~dS d}~ww xY w)zRSchedules a job which executes :meth:`_trigger_timeout` upon conversation timeout.N)datazFailed to schedule timeout.r   )
rC   	job_queuerun_once_trigger_timeoutrh   r$   r[   r   rA   r@   )r=   r   r%   r(   r   r'   j_queuerD   s           r2   r   z!ConversationHandler._schedule_job  s       F		K!+G292B2B%)01A6;X_`` 3C 3 3D.///
  	K 	K 	K;cJJJJJJJJJ	Ks   AA 
BA>>Bc                 6   t          |t                    sdS |j        s|j        rdS | j        r	|j        sdS | j        r	|j        sdS | j        r	|j	        sdS |j	        r| j        r|j	        j
        sdS |                     |          }| j                            |          }d}t          |t                    r t                              d           |                                r|                                }|j        7|j                                        r| j                            |d           d}n|                     ||           | j                            |          }nO| j                            | j        g           }|D ]*}|                    |          }||dur| j        |||fc S +dS t                              dt7          |          t7          |                     d}|| j        r-| j        D ]!}	|	                    |          }||dur|	} n"|dS |j|h| j                            |g           D ]!}
|
                    |          }||dur|
} n,"| j        D ]!}|                    |          }||dur|} n"dS ||||fS )a(  
        Determines whether an update should be handled by this conversation handler, and if so in
        which state the conversation currently is.

        Args:
            update (:class:`telegram.Update` | :obj:`object`): Incoming update.

        Returns:
            :obj:`bool`

        Nz&Waiting for asyncio Task to finish ...Fz'Selecting conversation %s with state %s)rv   r
   channel_postedited_channel_postre   r   rf   r   rg   r   r   r   rP   getr4   rA   r   r;   rF   r6   r7   r@   popr   rb   r`   check_updater   rd   ra   rc   )r=   r(   r   r   checkrE   handlershandler_rx   entry_point	candidatefallbacks               r2   r   z ConversationHandler.check_update  s    &&)) 	4 	&"< 	4= 	!6 	4= 	!6 	4 	F$9 	4  	T] 	6;P;X 	4mmF###'',,# e\** 	MMBCCC zz|| mmoo?*uz/C/C/E/E*'++C666 EE&&sC000 /33C88EE  ;??4<<< ( B BH$11&99E(U%-?-?#|S(EAAAAt?S3u::VVV&* =D.=#0    #0088$e););)GE =4 ![__UB77    	!..v66$e););'GE !%    H$11&99E(U%-?-?"*  4c7E))r1   z)Application[Any, CCT, Any, Any, Any, Any]check_resultc           
        K   |\  }}}}d}	| j         4 d{V  | j                            |d          }
|
|
                                 ddd          d{V  n# 1 d{V swxY w Y   |j        t
          ur|j        }ng| j        t
          ur| j        }nQt          |j        t                    r|j        j
        |j        j
        j        }nt          j        |j                  }	 |r|                    ||||           d{V }n7|                    |                    ||||          |d|j         d          }n # t           $ r}|j        }d}	Y d}~nd}~ww xY w| j         4 d{V  | j        r|j        t)          dd	           n|j        j        j        st)          d
d	           nlt          |t.          j                  r9|                    |                     |||||          |d|j         d           n|                     |||||           ddd          d{V  n# 1 d{V swxY w Y   t          | j        t8                    rh|| j        v r_|                     | j        ||           |	r't!          | j                            |                    | j                            |          S || j         k    r|                     |||           |	rt           dS )aL  Send the update to the callback for the current state and BaseHandler

        Args:
            check_result: The result from :meth:`check_update`. For this handler it's a tuple of
                the conversation state, key, handler, and the handler's check result.
            update (:class:`telegram.Update`): Incoming telegram update.
            application (:class:`telegram.ext.Application`): Application that originated the
                update.
            context (:class:`telegram.ext.CallbackContext`): The context as provided by
                the application.

        FNzConversationHandler:z:handle_update:non_blocking_cb)	coroutiner(   ri   TzHIgnoring `conversation_timeout` because the Application has no JobQueue.   rs   zQIgnoring `conversation_timeout` because the Applications JobQueue is not running.z:handle_update:timeout_job)r(   ri   )!rZ   r[   r   schedule_removalrl   r   rM   rv   botr   defaultsr   	get_valuehandle_updatecreate_task	update_idr   r   rh   r   r   	schedulerrunningrG   rH   r   r   rk   r   r   rC   r   r`   )r=   r(   r%   r   r   current_stater'   rx   handler_check_resultraise_dp_handler_stoptimeout_jobrl   r   r@   s                 r2   r   z!ConversationHandler.handle_update  s     & JVF'2F %* 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/+//0@$GGK&,,...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ =,,MEE[,,KEE00 	:[_5M5YO,2EE *7=99E	) *1*?*?K)=w+ + % % % % % %		 (33%33-A7  "`0@``` 4  	 & 	) 	) 	)!I$(!!!!!!	) * 	b 	b 	b 	b 	b 	b 	b 	b( b(0b#$     %.8@ b'#$    
  	7<88 b  ++22%{FGEU   &`F4D``` ,     &&y+vwP`aaa1	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b4 d($// 	5IAS4S4Stx)97CCC$ P,T-?-C-CI-N-NOOO%)))444DL((y*:GDDD  	) )(ts=   2A
A'*A',AE 
E"	EE"2B0H44
H>H>r   rx   c                    || j         k    r|| j        v r
| j        |= d S d S t          |t          j                  r3t          | j                            |          |          | j        |<   d S |[|| j        vrFt          |t          |j
        j                  nd d| d| j        
d| j        z   nd dd	           || j        |<   d S d S )
Nr5   r   z returned state z, which is unknown to the ConversationHandler  rz   rr   rs   )rC   rP   rv   rG   rH   r4   r   rb   r   reprcallbackr*   ri   )r=   r   r   rx   s       r2   r   z!ConversationHandler._update_state  s2      d)))',,, *) 	7<00 	1'3-11#66Y( ( (D$$$ "++:A:MtG,5666S` ^ ^&/^ ^=AY=R#	//XZ^ ^ ^  !	    (1D$$$ #"r1   c                   K   t          d|j                  }t          d|j                  }t                              d|j                   |j        }| j        4 d{V  | j        	                    |j                  }||ur	 ddd          d{V  dS | j        |j        = ddd          d{V  n# 1 d{V swxY w Y   | j
        	                    | j        g           }|D ]m}|                    |j                  }|O|durK	 |                    |j        |j        ||           d{V  L# t           $ r t#          dd           Y iw xY wn|                     | j        |j                   dS )	zThis is run whenever a conversation has timed out. Also makes sure that all handlers
        which are in the :attr:`TIMEOUT` state and whose :meth:`BaseHandler.check_update` returns
        :obj:`True` is handled.
        r   r$   z7Conversation timeout was triggered for conversation %s!NFzWApplicationHandlerStop in TIMEOUT state of ConversationHandler has no effect. Ignoring.rr   rs   )r	   jobr   rA   r   r'   r&   rZ   r[   r   rb   r^   r   r(   r   r%   r   r   r   rC   )	r=   r   r   ctxtr&   	found_jobr   rx   r   s	            r2   r   z$ConversationHandler._trigger_timeout  s     
 5'+&&138<<EtG\	
 	
 	
  0* 	9 	9 	9 	9 	9 	9 	9 	9)--d.CDDI##		9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9
 !$"78	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 ;??4<44 	 	G((55E U%%7%7	!//T%5u>N          .   G#$      	48T%:;;;;;s*   !%B8B88
CC(D77EEr:   )5r*   r+   r,   r-   r.   rC   r   intr/   r^   r`   r   r   r   r
   r   rI   r   rJ   floatdtm	timedeltar   r   r   r   propertyra   setterr   rb   rc   rd   rf   re   rg   rh   ri   rj   rk   r   r   r   r   rG   rH   r   r   _CheckUpdateTyper   r   r   r   r0   r1   r2   r!   r!   n   s        O ObI& CsPGU3Z GU3Z? $!=A 59*L L(L;vsF':;<L VT+fc6.A"BCCDL FC$789	L
 L L L L $cm3d:L DjL L FFN+d2L d|L L L L\
# 
 
 
 
0 "d;vsF/B#CD " " " X" 
f 
 
 
 
 

 VT+fc66I*J%KKL    X ]_ _8 _ _ _ ]_ 4FC,? @A    X b6 bh b b b b #t # # # X# 
v 
( 
 
 
 

 $    X _a& aX a a a _a $    X _a& aX a a a _a !T ! ! ! X! dV d d d d d *			%* * * X*  
f 
 
 
 
 ! 

 cDj    X 
[]f ] ] ] ] []  D       X  cF cx c c c c #tFFN3d: # # # X# 
v 
( 
 
 
 

2(2	c< 788	92 2 2 2hv /    6
<
 F
 	

 
 *
 

 
 
 
2KK FK 	K
 K *K 
K K K K0Y*6 Y*.>s.Cd.J Y* Y* Y* Y*vbb Ab 's+	b
 b 
$b b b bJ VZ1 11&51@Kd@R1	1 1 1 1.%<c %<d %< %< %< %< %< %<r1   )>r-   rG   datetimer   dataclassesr   typingr   r   r   r   r   r	   telegramr
   telegram._utils.defaultvaluer   r   telegram._utils.loggingr   telegram._utils.reprr   telegram._utils.typesr   telegram._utils.warningsr   telegram.ext._applicationr   telegram.ext._extbotr   "telegram.ext._handlers.basehandlerr   +telegram.ext._handlers.callbackqueryhandlerr   0telegram.ext._handlers.choseninlineresulthandlerr   )telegram.ext._handlers.inlinequeryhandlerr   +telegram.ext._handlers.stringcommandhandlerr   )telegram.ext._handlers.stringregexhandlerr   "telegram.ext._handlers.typehandlerr    telegram.ext._utils.trackingdictr   telegram.ext._utils.typesr   r   r   r{   r   r   r    r   rI   r  r*   rA   r$   r4   r!   r0   r1   r2   <module>r     s  & 4 3      ! ! ! ! ! ! E E E E E E E E E E E E E E E E       C C C C C C C C . . . . . . ? ? ? ? ? ? ( ( ( ( ( ( ) ) ) ) ) ) < < < < < < ' ' ' ' ' ' : : : : : : L L L L L L V V V V V V H H H H H H L L L L L L H H H H H H : : : : : : 9 9 9 9 9 9 L L L L L L L L L L 87777777777+fc6>Q2RTZZ[ 
*X*?
@
@
@ 
 
 
 
 
'#, 
 
 
 ) ) ) ) ) ) ) )XO< O< O< O< O<+fc6&9: O< O< O< O< O<r1   