
    i                         d Z ddlZddlmZmZmZ ddl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mZ erdd
lmZ  ed          Z G d deeeef                   ZdS )z-This module contains the PrefixHandler class.    N)TYPE_CHECKINGAnyTypeVar)Update)DEFAULT_TRUE)SCTDVType)filters)BaseHandler)CCTHandlerCallback)ApplicationRTc                   $    e Zd ZdZdZdefdddee         dee         dee	e
ef         d	ej        dz  d
ee         f fdZdedeeee         eeeef         z  dz  f         z  dz  fdZde
de	dddeeee         ef         z  dz  ddf
dZ xZS )PrefixHandlera  Handler class to handle custom prefix commands.

    This is an intermediate handler between :class:`MessageHandler` and :class:`CommandHandler`.
    It supports configurable commands with the same options as :class:`CommandHandler`. It will
    respond to every combination of :paramref:`prefix` and :paramref:`command`.
    It will add a :obj:`list` to the :class:`CallbackContext` named :attr:`CallbackContext.args`,
    containing a list of strings, which is the text following the command split on single or
    consecutive whitespace characters.

    Examples:

        Single prefix and command:

        .. code:: python

            PrefixHandler("!", "test", callback)  # will respond to '!test'.

        Multiple prefixes, single command:

        .. code:: python

            PrefixHandler(["!", "#"], "test", callback)  # will respond to '!test' and '#test'.

        Multiple prefixes and commands:

        .. code:: python

            PrefixHandler(
                ["!", "#"], ["test", "help"], callback
            )  # will respond to '!test', '#test', '!help' and '#help'.


    By default, the handler listens to messages as well as edited messages. To change this behavior
    use :attr:`~filters.UpdateType.EDITED_MESSAGE <telegram.ext.filters.UpdateType.EDITED_MESSAGE>`

    Note:
        * :class:`PrefixHandler` does *not* handle (edited) channel posts.

    Warning:
        When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom
        attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info.

    .. versionchanged:: 20.0

        * :class:`PrefixHandler` is no longer a subclass of :class:`CommandHandler`.
        * Removed the attributes ``command`` and ``prefix``. Instead, the new :attr:`commands`
          contains all commands that this handler listens to as a :class:`frozenset`, which
          includes the prefixes.
        * Updating the prefixes and commands this handler listens to is no longer possible.

    Args:
        prefix (:obj:`str` | Collection[:obj:`str`]):
            The prefix(es) that will precede :paramref:`command`.
        command (:obj:`str` | Collection[:obj:`str`]):
            The command or list of commands this handler should listen for. Case-insensitive.
        callback (:term:`coroutine function`): The callback function for this handler. Will be
            called when :meth:`check_update` has determined that an update should be processed by
            this handler. Callback signature::

                async def callback(update: Update, context: CallbackContext)

            The return value of the callback is usually ignored except for the special case of
            :class:`telegram.ext.ConversationHandler`.
        filters (:class:`telegram.ext.filters.BaseFilter`, optional): A filter inheriting from
            :class:`telegram.ext.filters.BaseFilter`. Standard filters can be found in
            :mod:`telegram.ext.filters`. Filters can be combined using bitwise
            operators (``&`` for :keyword:`and`, ``|`` for :keyword:`or`, ``~`` for :keyword:`not`)
        block (:obj:`bool`, optional): Determines whether the return value of the callback should
            be awaited before processing the next handler in
            :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`.

            .. seealso:: :wiki:`Concurrency`

    Attributes:
        commands (frozenset[:obj:`str`]): The commands that this handler will listen for, i.e. the
            combinations of :paramref:`prefix` and :paramref:`command`.
        callback (:term:`coroutine function`): The callback function for this handler.
        filters (:class:`telegram.ext.filters.BaseFilter`): Optional. Only allow updates with these
            Filters.
        block (:obj:`bool`): Determines whether the return value of the callback should be
            awaited before processing the next handler in
            :meth:`telegram.ext.Application.process_update`.

    )commandsr
   NselfzPrefixHandler[CCT, RT]prefixcommandcallbackr
   blockc                    t                                          ||           t          |t                    r|                                hnd |D             }t          |t                    r|                                hnd |D             }t          d t          j        ||          D                       | _        ||nt          j
        j        | _        d S )N)r   r   c                 6    h | ]}|                                 S  lower.0xs     d/Users/shanyulin/my-agent/.venv/lib/python3.11/site-packages/telegram/ext/_handlers/prefixhandler.py	<setcomp>z)PrefixHandler.__init__.<locals>.<setcomp>   s!    D_D_D_STQWWYYD_D_D_    c                 6    h | ]}|                                 S r   r   r   s     r    r!   z)PrefixHandler.__init__.<locals>.<setcomp>   s!    FbFbFbUVqwwyyFbFbFbr"   c              3   &   K   | ]\  }}||z   V  d S )Nr   )r   pcs      r    	<genexpr>z)PrefixHandler.__init__.<locals>.<genexpr>   s;       2
 2
aAE2
 2
 2
 2
 2
 2
r"   )super__init__
isinstancestrr   	frozenset	itertoolsproductr   filters_module
UpdateTypeMESSAGESr
   )	r   r   r   r   r
   r   prefixesr   	__class__s	           r    r)   zPrefixHandler.__init__~   s     	(%888'1&#'>'>_FLLNN##D_D_X^D_D_D_(27C(@(@bGMMOO$$FbFbZaFbFbFb(1 2
 2
'/(CC2
 2
 2
 )
 )
 *GG0I0R 	r"   updatereturnc                 &   t          |t                    r{|j        rt|j        }|j        rf|j                                        }|d                                         | j        vrdS | j                            |          }|r|dd         |fS dS dS )a  Determines whether an update should be passed to this handler's :attr:`callback`.

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

        Returns:
            :obj:`list`: The list of args for the handler.

        r   N   F)	r*   r   effective_messagetextsplitr   r   r
   check_update)r   r4   message	text_listfilter_results        r    r;   zPrefixHandler.check_update   s     ff%% 
	&*B 
	.G| #L..00	Q<%%''t}<<4 $ 9 9& A A  8$QRR=-77utr"   contextapplicationz)Application[Any, CCT, Any, Any, Any, Any]check_resultc                     t          |t                    rE|d         |_        t          |d         t                    r|                    |d                    dS dS dS )zAdd text after the command to :attr:`CallbackContext.args` as list, split on single
        whitespaces and add output of data filters to :attr:`CallbackContext` as well.
        r   r7   N)r*   tupleargsdictr4   )r   r?   r4   r@   rA   s        r    collect_additional_contextz(PrefixHandler.collect_additional_context   sg     lE** 	0'?GL,q/400 0|A/////	0 	00 0r"   )__name__
__module____qualname____doc__	__slots__r   r   r+   r   r   r   r   r/   
BaseFilterr	   boolr)   objectrC   listrE   r   r;   rF   __classcell__)r3   s   @r    r   r   %   s_       S Sl (I 59*
 
&
C
 S
 "&#r/2	

  *T1
 d|
 
 
 
 
 
*	d3iS#X!6!==>	>	E   200 0 A	0
 U49d?33d:0 
0 0 0 0 0 0 0 0r"   r   )rJ   r-   typingr   r   r   telegramr   telegram._utils.defaultvaluer   telegram._utils.typesr   r	   telegram.extr
   r/   "telegram.ext._handlers.basehandlerr   telegram.ext._utils.typesr   r   r   r   r   r   r"   r    <module>rX      s  & 4 3     . . . . . . . . . .       5 5 5 5 5 5 - - - - - - - - 2 2 2 2 2 2 : : : : : : : : : : : : : : )((((((WT]]T0 T0 T0 T0 T0KR0 T0 T0 T0 T0 T0r"   