o
    Zzj¾  ã                   @   s¦   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„ 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                       sÈ   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B d
ee f‡ fdd„Zdedeeee eeeef B dB f B dB fdd„Zde
de	dddeeee ef B dB ddf
dd„Z‡  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                    s�   t ƒ j||d� t|tƒr| ¡ hndd„ |D ƒ}t|tƒr#| ¡ hndd„ |D ƒ}tdd„ t ||¡D ƒƒ| _|d urA|| _d S t	j
j| _d S )N)r   r   c                 S   ó   h | ]}|  ¡ ’qS © ©Úlower©Ú.0Úxr   r   ú_/var/www/kodo/tsheker/venv/lib/python3.10/site-packages/telegram/ext/_handlers/prefixhandler.pyÚ	<setcomp>ˆ   ó    z)PrefixHandler.__init__.<locals>.<setcomp>c                 S   r   r   r   r   r   r   r   r   Š   r   c                 s   s   � | ]	\}}|| V  qd S )Nr   )r   ÚpÚcr   r   r   Ú	<genexpr>Œ   s   € 
ÿz)PrefixHandler.__init__.<locals>.<genexpr>)ÚsuperÚ__init__Ú
isinstanceÚstrr   Ú	frozensetÚ	itertoolsÚproductr   Úfilters_moduleÚ
UpdateTypeÚMESSAGESr	   )r   r   r   r   r	   r   Úprefixesr   ©Ú	__class__r   r   r$   ~   s   ""

ÿ
ÿÿzPrefixHandler.__init__ÚupdateÚreturnc                 C   sd   t |tƒr0|jr0|j}|jr0|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   r0   ÚmessageÚ	text_listÚfilter_resultr   r   r   r6   “   s   
zPrefixHandler.check_updateÚcontextÚapplicationz)Application[Any, CCT, Any, Any, Any, Any]Úcheck_resultc                 C   s<   t |tƒr|d |_t |d tƒr| |d ¡ dS dS dS )z³Add 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   r2   N)r%   ÚtupleÚargsÚdictr0   )r   r:   r0   r;   r<   r   r   r   Úcollect_additional_context¬   s   


ýz(PrefixHandler.collect_additional_context)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r   r&   r   r   r   r   r*   Ú
BaseFilterr   Úboolr$   Úobjectr=   Úlistr?   r   r6   r@   Ú__classcell__r   r   r.   r   r   %   sD    Vúÿþýüûúÿ&
þþýüûúr   )rD   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   r   Ú<module>   s   