o
    "h#                     @   s   d Z ddlZddl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 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 e
edddddG dd dZdS )z[This module contains a class that describes a single parameter of a request to the Bot API.    N)Sequence)	dataclass)Optionalfinal)InputStoryContent)	InputFile)
InputMediaInputPaidMedia)InputProfilePhotoInputProfilePhotoStatic)InputSticker)TelegramObject)to_timestamp)
StringEnum)UploadFileDictTF)repreqorderfrozenc                   @   s   e Zd ZU dZdZeed< eed< ee	e
  ed< edee fddZedee fd	d
Zededeee	e
 f fddZedededd fddZdS )RequestParametera  Instances of this class represent a single parameter to be sent along with a request to
    the Bot API.

    .. versionadded:: 20.0

    Warning:
        This class intended is to be used internally by the library and *not* by the user. Changes
        to this class are not considered breaking changes and may not be documented in the
        changelog.

    Args:
        name (:obj:`str`): The name of the parameter.
        value (:obj:`object` | :obj:`None`): The value of the parameter. Must be JSON-dumpable.
        input_files (list[:class:`telegram.InputFile`], optional): A list of files that should be
            uploaded along with this parameter.

    Attributes:
        name (:obj:`str`): The name of the parameter.
        value (:obj:`object` | :obj:`None`): The value of the parameter.
        input_files (list[:class:`telegram.InputFile` | :obj:`None`): A list of files that should
            be uploaded along with this parameter.
    )input_filesnamevaluer   r   r   returnc                 C   s,   t | jtr	| jS | jdu rdS t| jS )zThe JSON dumped :attr:`value` or :obj:`None` if :attr:`value` is :obj:`None`.
        The latter can currently only happen if :attr:`input_files` has exactly one element that
        must not be uploaded via an attach:// URI.
        N)
isinstancer   strjsondumpsself r    U/var/www/html/venv/lib/python3.10/site-packages/telegram/request/_requestparameter.py
json_valueE   s
   
zRequestParameter.json_valuec                    s    j sdS  fdd j D S )zA dict with the file data to upload, if any.

        .. versionchanged:: 21.5
            Content may now be a file handle.
        Nc                    s   i | ]
}|j p	 j|jqS r    )attach_namer   field_tuple).0
input_filer   r    r!   
<dictcomp>Z   s    z3RequestParameter.multipart_data.<locals>.<dictcomp>)r   r   r    r   r!   multipart_dataQ   s
   
zRequestParameter.multipart_datac                 C   s  t | tjrt| g fS t | tjr$|  }| r t|g fS |g fS t | tr.| j	g fS t | t
rA| jr<| j| gfS d| gfS t | ttfrt | jt
r|  }| jjr]| jj|d< n|dd |dd}t |t
r|jrw|j|d< n|dd || j|gfS || jgfS t | trt | trdnd}t t| | }t
s|  g fS |  }|j||< ||gfS t | tr| j}t t| | }t
s|  g fS |  }|j||< ||gfS t | trt | jt
r|  }| jj|d< || jgfS t | tr|  g fS | g fS )aX  Converts `value` into something that we can json-dump. Returns two values:
        1. the JSON-dumpable value. May be `None` in case the value is an InputFile which must
           not be uploaded via an attach:// URI
        2. A list of InputFiles that should be uploaded for this value

        Note that we handle files differently depending on whether attaching them via an URI of the
        form attach://<name> is documented to be allowed or not.
        There was some confusion whether this worked for all files, so that we stick to the
        documented ways for now.
        See https://github.com/tdlib/telegram-bot-api/issues/167 and
        https://github.com/tdlib/telegram-bot-api/issues/259

        This method only does some special casing for our own helper class StringEnum, but not
        for general enums. This is because:
        * tg.constants currently only uses IntEnum as second enum type and json dumping that
          is no problem
        * if a user passes a custom enum, it's unlikely that we can actually properly handle it
          even with some special casing.
        Nmedia	thumbnailphoto	animationsticker)r   dtmdatetimer   	timedeltatotal_seconds
is_integerintr   r   r   
attach_urir   r	   r)   to_dictpopgetr
   r   getattrr   typer   r-   r   )r   secondsdatar*   attrr)   r    r    r!   !_value_and_input_files_from_input_   s\   










z2RequestParameter._value_and_input_files_from_inputkeyc                 C   s   t |ttfs7t |tr7g }g }|D ]}| |\}}|dur$|| || qt|||r3|dS ddS | |\}}t|||rG|dS ddS )zBuilds an instance of this class for a given key-value pair that represents the raw
        input as passed along from a method of :class:`telegram.Bot`.
        N)r   r   r   )r   r   bytesr   r=   appendextendr   )clsr>   r   param_valuesr   objparam_valuer&   r    r    r!   
from_input   s&   


zRequestParameter.from_inputN)__name__
__module____qualname____doc__	__slots__r   __annotations__objectr   listr   propertyr"   r   r(   staticmethodtupler=   classmethodrF   r    r    r    r!   r   %   s$   
 ^r   ) rJ   r/   r.   r   collections.abcr   dataclassesr   typingr   r   "telegram._files._inputstorycontentr   telegram._files.inputfiler   telegram._files.inputmediar   r	   !telegram._files.inputprofilephotor
   r   telegram._files.inputstickerr   telegram._telegramobjectr   telegram._utils.datetimer   telegram._utils.enumr   telegram._utils.typesr   r   r    r    r    r!   <module>   s$   