
    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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/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6 er
ddl7m8Z8m9Z9m:Z: ee;e6e$ee4f         e;f         Z< ee=d          Z>e G d de
e4                               Z?e G d d                      Z@ G d de$ee4f                   ZAdS )z-This module contains the ConversationHandler.    N)	dataclass)TYPE_CHECKINGAnyDictFinalGenericListNoReturnOptionalSetTupleUnion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!        p/var/www/html/crypto-bot/backend/venv/lib/python3.11/site-packages/telegram/ext/_handlers/conversationhandler.pyr*   r*   ?   sQ           RI%%%%NNNAAAAr7   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taskr=   r<   returnc                 4    | j                                         S N)r=   doneselfs    r8   rA   zPendingState.doneY   s    y~~r7   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)	r=   rA   RuntimeError	exception_LOGGERr<   resultr'   END)rC   excress      r8   resolvezPendingState.resolve\   s     y~~ 	A?@@@i!!## 	"N   >!i  ;4>1%)CC[>!
r7   N)r0   r1   r2   r3   r4   asyncioTaskr5   objectboolrA   rL   r6   r7   r8   r:   r:   M   sw          
 &I
, d              r7   r:   c                   T   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eeeef                  deeeeeef                  f         deeeef                  dededededeeeej        f                  dee         dedeeeef                  dee         fdZdefdZed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f                  f         fd            Z e j        dedefd            Z ed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eej        f                  fd*            Z&e&j        dedefd+            Z&ede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eef                  fd0            Z)e)j        dedefd1            Z)d2d3deee*e+ef         f         fd4Z,d5ede+fd6Z-d7e.j/        d2d8d5ed9ed:e+ddfd;Z0d7ed2d8d5ed9ed:e+ddfd<Z1d5edee2e                  fd=Z3d5ed2d>d?e2e         d9edee         f
d@Z4	 dEd7edAe+dBee         ddfdCZ5d9eddfdDZ6dS )Fr'   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_jobsrI   TIMEOUTWAITINGFTNentry_pointsstates	fallbacksallow_reentryper_chatper_userper_messageconversation_timeoutname
persistentmap_to_parentblockc           	      &   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          f          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        rAtG          ||tX          tZ          ||f          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     r8   	<genexpr>z/ConversationHandler.__init__.<locals>.<genexpr>q  sF       )
 )
:gGZ3[3[)
)
 )
 )
 )
 )
 )
r7   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.extrt   ru   rv   rw   rr   rS   rW   r_   rX   rR   r]   r[   r\   rU   rZ   rY   ra   rM   Lockr`   rV   setrT   ro   
ValueErrorr^   anyrl   rk   rm   r   extendvaluesr.   r|   r   r   	__class__r0   r   
issubclasstyper   r   r   r   rn   )rC   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rt   ru   rv   rw   all_handlersstate_handlersper_faq_linkr~   s                        r8   __init__zConversationHandler.__init__*  si    	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 $(
$)=IEK:C$1''"-  	" %)
>K >@"),..02>Aee! 	[di 	[YZZZ!+DM4=$2BCDD 	^\]]] 	DM 	=    8:L)))I&&&$mmoo 	0 	0N////!(( )
 )
#/)
 )
 )
 	
 	
 	
_ 	 $ <	 <	G'$8:L#MNN 3S(1S S S     
 G[11 -*W\SY:Z:Z -R9@9NR R R     
 G[11 '+  !	      ,*1/)	 	 &'*;*D & &#& &  !	     ! *W>R*S*S =.:= =  !	     % *W>R*S*S @1=@ @     ( Z-P-P 8  !	   o<	 <	r7   r>   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`
           Nrb   z, ...})ro   rh   )dictlistrh   itemsstrlenr   ro   )rC   truncation_thresholdrh   states_strings       r8   __repr__zConversationHandler.__repr__  s      !d4;,,..//0E1E0EFGGFt{222)#2#.9M- 
 
 
 	
r7   c                     | j         S )zList[:class:`telegram.ext.BaseHandler`]: A list of :obj:`BaseHandler` objects that can
        trigger the start of the conversation.
        )rW   rB   s    r8   rg   z ConversationHandler.entry_points  s    
 !!r7   _c                      t          d          )NzDYou can not assign a new value to entry_points after initialization.AttributeErrorrC   r   s     r8   rg   z ConversationHandler.entry_points  s    R
 
 	
r7   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.
        )r_   rB   s    r8   rh   zConversationHandler.states  s     |r7   c                      t          d          )Nz>You can not assign a new value to states after initialization.r   r   s     r8   rh   zConversationHandler.states  s    ]^^^r7   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`.
        )rX   rB   s    r8   ri   zConversationHandler.fallbacks  s     r7   c                      t          d          )NzAYou can not assign a new value to fallbacks after initialization.r   r   s     r8   ri   zConversationHandler.fallbacks  s    `aaar7   c                     | j         S )zQ:obj:`bool`: Determines if a user can restart a conversation with an entry point.)rR   rB   s    r8   rj   z!ConversationHandler.allow_reentry  s     ""r7   c                      t          d          )NzEYou can not assign a new value to allow_reentry after initialization.r   r   s     r8   rj   z!ConversationHandler.allow_reentry      S
 
 	
r7   c                     | j         S )zB:obj:`bool`: If the conversation key should contain the User's ID.)r]   rB   s    r8   rl   zConversationHandler.per_user       ~r7   c                      t          d          )Nz@You can not assign a new value to per_user after initialization.r   r   s     r8   rl   zConversationHandler.per_user	      _```r7   c                     | j         S )zB:obj:`bool`: If the conversation key should contain the Chat's ID.)r[   rB   s    r8   rk   zConversationHandler.per_chat  r   r7   c                      t          d          )Nz@You can not assign a new value to per_chat after initialization.r   r   s     r8   rk   zConversationHandler.per_chat  r   r7   c                     | j         S )zE:obj:`bool`: If the conversation key should contain the message's ID.)r\   rB   s    r8   rm   zConversationHandler.per_message  s       r7   c                      t          d          )NzCYou can not assign a new value to per_message after initialization.r   r   s     r8   rm   zConversationHandler.per_message  s    bcccr7   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.
        )rU   rB   s    r8   rn   z(ConversationHandler.conversation_timeout  s     ))r7   c                      t          d          )NzLYou can not assign a new value to conversation_timeout after initialization.r   r   s     r8   rn   z(ConversationHandler.conversation_timeout)  s    Z
 
 	
r7   c                     | j         S )zE:obj:`str`: Optional. The name for this :class:`ConversationHandler`.)rZ   rB   s    r8   ro   zConversationHandler.name/  s     zr7   c                      t          d          )Nz<You can not assign a new value to name after initialization.r   r   s     r8   ro   zConversationHandler.name4  s    [\\\r7   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>`.
        )r^   rB   s    r8   rp   zConversationHandler.persistent8  s     r7   c                      t          d          )NzBYou can not assign a new value to persistent after initialization.r   r   s     r8   rp   zConversationHandler.persistent@  s    abbbr7   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.
        )rY   rB   s    r8   rq   z!ConversationHandler.map_to_parentD  s     ""r7   c                      t          d          )NzEYou can not assign a new value to map_to_parent after initialization.r   r   s     r8   rq   z!ConversationHandler.map_to_parentL  r   r7   r+   r$   c                   K   | j         r| j        r|j        st          d          | j        }t          t          t          t          f         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!N)	new_statekey)r+   )rp   ro   persistencerE   rV   r   r    r#   rO   r.   get_conversationsupdate_no_trackr   rI   _update_staterT   _initialize_persistence)rC   r+   current_conversationsstored_datar   stateoutr~   s           r8   r   z+ConversationHandler._initialize_persistenceR  s       	DI 	+2I 	  
 !% 3"&01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            
r7   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_userrk   rE   appendidrl   rm   callback_queryinline_message_idmessage
message_idtuple)rC   r.   chatuserr   s        r8   _get_keyzConversationHandler._get_key  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r7   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-   )	ExceptionrG   debug_schedule_job)rC   r   r+   r.   r   r-   effective_new_staterJ   s           r8   _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   )
rI   	job_queuerun_once_trigger_timeoutrn   r*   ra   r   rG   rF   )rC   r   r+   r.   r   r-   j_queuerJ   s           r8   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)r|   r   channel_postedited_channel_postrk   r   rl   r   rm   r   r   r   rV   getr:   rG   r   rA   rL   r<   r=   rF   popr   rh   rf   check_updater   rj   rg   ri   )rC   r.   r   r   checkrK   handlershandler_r~   entry_point	candidatefallbacks               r8   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))r7   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.   ro   TzHIgnoring `conversation_timeout` because the Application has no JobQueue.   ry   zQIgnoring `conversation_timeout` because the Applications JobQueue is not running.z:handle_update:timeout_job)r.   ro   )!r`   ra   r   schedule_removalrr   r   rS   r|   botr   defaultsr   	get_valuehandle_updatecreate_task	update_idr   r   rn   r   r   	schedulerrunningrM   rN   r   r   rq   r   r   rI   r   rf   )rC   r.   r+   r   r   current_stater-   r~   handler_check_resultraise_dp_handler_stoptimeout_jobrr   r   rF   s                 r8   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   r~   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 )
Nr;   r   z returned state z, which is unknown to the ConversationHandler  r   rx   ry   )rI   rV   r|   rM   rN   r:   r   rh   r   reprcallbackr0   ro   )rC   r   r   r~   s       r8   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$$$ #"r7   c                    K   t          d|j                  }t          t          |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%   z7Conversation timeout was triggered for conversation %s!NFzWApplicationHandlerStop in TIMEOUT state of ConversationHandler has no effect. Ignoring.rx   ry   )r   jobr*   r   rG   r   r-   r,   r`   ra   r   rh   rd   r   r.   r   r+   r   r   r   rI   )	rC   r   r  ctxtr,   	found_jobr   r~   r   s	            r8   r   z$ConversationHandler._trigger_timeout  s     
 5'+&&/::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*   &%B=B==
C
C(D<<EEr@   )7r0   r1   r2   r3   r4   rI   r   intr5   rd   rf   r   r	   r   r   r!   r   rO   rP   r   r   floatdatetime	timedeltar   r   r   r   propertyrg   setterr
   rh   ri   rj   rl   rk   rm   rn   ro   rp   rq   r    r#   r   r   rM   rN   r   r   _CheckUpdateTyper   r   r   r   r6   r7   r8   r'   r'   z   s        O ObI& CsPGU3Z GU3Z? $!KO" 8<*P P;vs{34P VT+fck":;;<P FCK01	P
 P P P P 'uUH4F-F'GHP smP P  VV^ 45P d|P P P Pd
# 
 
 
 
0 "d;vs{#;< " " " X" 
f 
 
 
 
 

 VT+fck*B%CCD    X ]_ _8 _ _ _ ]_ 4FCK 89    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112	3* * * X*  
f 
 
 
 
 ! 

 hsm    X 
[]f ] ] ] ] []  D       X  cF cx c c c c #xVV^(<= # # # 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*h7G7L.M Y* Y* Y* Y*vbb Ab 's+	b
 b 
&	b b b bJ Y]1 11&51@H@U1	1 1 1 1.%<c %<d %< %< %< %< %< %<r7   )Br3   rM   r  dataclassesr   typingr   r   r   r   r   r	   r
   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&   rO   r
  r0   rG   r*   r:   r'   r6   r7   r8   <module>r     s  & 4 3   ! ! ! ! ! !                                  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+fck2JFRS 
*X*?
@
@
@ 
 
 
 
 
'#, 
 
 
 ) ) ) ) ) ) ) )XS< S< S< S< S<+fck2 S< S< S< S< S<r7   