o
    @MhT                     @   sR   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	 G dd dZ
dS )	    )State)CallbackQueryMessage)AsyncTeleBot)resolve_context)Unionc                   @   s   e Zd ZdZdeeef deddfddZdee	e
f defd	d
Zde
fddZdefddZdefddZdefddZdddZdS )StateContexta  
    Class representing a state context.

    Passed through a middleware to provide easy way to set states.

    .. code-block:: python3

        @bot.message_handler(commands=['start'])
        async def start_ex(message: types.Message, state_context: StateContext):
            await state_context.set(MyStates.name)
            await bot.send_message(message.chat.id, 'Hi, write me a name', reply_to_message_id=message.message_id)
            # also, state_context.data(), .add_data(), .reset_data(), .delete() methods available.
    messagebotreturnNc                 C   s   || _ || _| jj| _d S )N)r	   r
   bot_id)selfr	   r
    r   Q/var/www/html/venv/lib/python3.10/site-packages/telebot/states/asyncio/context.py__init__   s   zStateContext.__init__statec                    sJ   t | j| jj\}}}}}t|tr|j}| jj||||||dI dH S )a  
        Set state for current user.

        :param state: State object or state name.
        :type state: Union[State, str]

        .. code-block:: python3

            @bot.message_handler(commands=['start'])
            async def start_ex(message: types.Message, state_context: StateContext):
                await state_context.set(MyStates.name)
                await bot.send_message(message.chat.id, 'Hi, write me a name', reply_to_message_id=message.message_id)
        )chat_iduser_idr   business_connection_idr   message_thread_idN)r   r	   r
   r   
isinstancer   name	set_state)r   r   r   r   r   r   r   r   r   r   set   s   
zStateContext.setc                    8   t | j| jj\}}}}}| jj|||||dI dH S )zo
        Get current state for current user.

        :return: Current state name.
        :rtype: str
        r   r   r   r   r   N)r   r	   r
   r   	get_stater   r   r   r   r   r   r   r   r   get:      	zStateContext.getc                    r   )z
        Deletes state and data for current user.

        .. warning::

                This method deletes state and associated data for current user.
        r   N)r   r	   r
   r   delete_stater   r   r   r   deleteM   r   zStateContext.deletec                    r   )zQ
        Reset data for current user.
        State will not be changed.
        r   N)r   r	   r
   r   
reset_datar   r   r   r   r"   `   s   zStateContext.reset_datac                 C   s0   t | j| jj\}}}}}| jj|||||dS )z
        Get data for current user.

        .. code-block:: python3

            with state_context.data() as data:
                print(data)
                data['name'] = 'John'
        r   )r   r	   r
   r   retrieve_datar   r   r   r   dataq   s   zStateContext.datac                    s@   t | j| jj\}}}}}| jjd|||||d|I dH S )zl
        Add data for current user.

        :param kwargs: Data to add.
        :type kwargs: dict
        r   Nr   )r   r	   r
   r   add_data)r   kwargsr   r   r   r   r   r   r   r   r%      s   	zStateContext.add_data)r   N)__name__
__module____qualname____doc__r   r   r   r   r   r   strboolr   r   r!   r"   dictr$   r%   r   r   r   r   r   	   s    r   N)telebot.statesr   telebot.typesr   r   telebot.async_telebotr   r   typingr   r   r   r   r   r   <module>   s    