
    i@                        d dl Z d dlZd dlZd dlZd dlZd dlZd dl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mZmZmZmZ d dlmZ d dlmZmZmZ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(m)Z)m*Z* deee+ef                  deee+ef                  fdZ,d@dee+         dee+         fdZ-de+de+de+fdZ.de/dee+         de0de0dee/         dee+e+f         fdZ1de/de/ddfd Z2dee+         d!e+d"e/d#e/de/de/d$e/de/d%e/d&ee         d'ee+         de/fd(Z3dAd)Z4d*ee+eee+e+f                  f         ddfd+Z5de0fd,Z6d-edeee+f         fd.Z7d/e+d0ee+ef         ddfd1Z8d2e+de+fd3Z9d4e/de/fd5Z:d6ee+ef         dee+ee         f         fd7Z;	 	 d@d8e+d#e<d9e=d:ej>        d'ee+         d&ee         dee+ef         fd;Z?d<ed=ef         ddfd>Z@d? ZAdS )B    N)Future)HTTPResponse)IOBase)
SSLContext)AnyDictOptionalSequenceUnion)urljoin)HTTPSHandlerOpenerDirectorProxyHandlerRequesturlopen)version)SlackRequestError)
Attachment)Block)Chunk)EntityMetadataEventAndEntityMetadataMetadataparamsreturnc                 F    | rd |                                  D             S dS )aJ  Converts all bool values in dict to "0" or "1".

    Slack APIs safely accept "0"/"1" as boolean values.
    Using True/False (bool in Python) doesn't work with aiohttp.
    This method converts only the bool values in top-level of a given dict.

    Args:
        params: params as a dict

    Returns:
        Modified dict
    c                 4    i | ]\  }}|t          |          S  )_to_0_or_1_if_bool.0kvs      W/root/projects/butler/venv/lib/python3.11/site-packages/slack_sdk/web/internal_utils.py
<dictcomp>z*convert_bool_to_0_or_1.<locals>.<dictcomp>&   s'    DDDTQ%a((DDD    Nitems)r   s    r$   convert_bool_to_0_or_1r)      s.      EDDV\\^^DDDD4r&   prefixsuffixc                 V   d                     dt          j                  }d                     t          j                  }d                     t          j                    t          j                              }d                    |||g          }| r|  dnd} |rd| nd}| |z   |z   S )zConstruct the user-agent header with the package info,
    Python version and OS version.

    Returns:
        The user agent string.
        e.g. 'Python/3.7.17 slackclient/2.0.0 Darwin/17.7.0'
    z{0}/{1}slackclientz$Python/{v.major}.{v.minor}.{v.micro}r#     )	formatr   __version__sysversion_infoplatformsystemreleasejoin)r*   r+   clientpython_versionsystem_infouser_agent_strings         r$   get_user_agentr=   *   s     mW-@AAF;BBSEUBVVN""8?#4#4h6F6H6HIIK.&+!FGG#+\\\\F#+\\\\F%%..r&   base_url
api_methodc                 L    |                     d          }t          | |          S )a*  Joins the base Slack URL and an API method to form an absolute URL.

    Args:
        base_url (str): The base URL
        api_method (str): The Slack Web API method. e.g. 'chat.postMessage'

    Returns:
        The absolute API URL.
            e.g. 'https://slack.com/api/chat.postMessage'
    /)lstripr   )r>   r?   s     r$   _get_urlrC   <   s'     ""3''J8Z(((r&   headerstokenhas_json	has_filesrequest_specific_headersc                 V   ddi}| d| vrt                      |d<   |r*|                    dd                    |          i           | i } |                    |            |r|                    |           |r|                    ddi           |r|                    dd           |S )a4  Constructs the headers need for a request.
    Args:
        has_json (bool): Whether or not the request has json.
        has_files (bool): Whether or not the request has files.
        request_specific_headers (dict): Additional headers specified by the user for a specific request.

    Returns:
        The headers dictionary.
            e.g. {
                'Content-Type': 'application/json;charset=utf-8',
                'Authorization': 'Bearer xoxb-1234-1243',
                'User-Agent': 'Python/3.7.17 slack/2.1.0 Darwin/17.7.0'
            }
    zContent-Typez!application/x-www-form-urlencodedNz
User-AgentAuthorizationz	Bearer {}zapplication/json;charset=utf-8)r=   updater1   pop)rD   rE   rF   rG   rH   final_headerss         r$   _get_headersrN   L   s    . 	;M ,g55&4&6&6l# Ko{/A/A%/H/HIJJJ !!!   75666 Qn.NOPPP 0.$///r&   targetdefault_paramsc                 L    |                                 D ]\  }}|| vr|| |<   d S Nr'   )rO   rP   namevalues       r$   _set_default_paramsrU   ~   s@    %++-- ! !ev F4L! !r&   	http_verbfilesdatajsonauthsslproxyc           	         |d u}|d u}|r|dk    rd}t          |          |Ct          |t                    r.d |                                D             }t	          ||           |3t          |t                    rd |                                D             }|Ct          |t                    r.d |                                D             }t	          ||           |%t          |t                    rt	          ||           | } |d|v r|                    d          } |d|v r |j        d          } t          || |||          |||||	|
|d}|S )	NPOSTz`Json data can only be submitted as POST requests. GET requests should use the 'params' argument.c                     i | ]
\  }}|||S rR   r   r    s      r$   r%   z#_build_req_args.<locals>.<dictcomp>   s    ???A1r&   c                     i | ]
\  }}|||S rR   r   r    s      r$   r%   z#_build_req_args.<locals>.<dictcomp>   s    AAA$!Q1=A===r&   c                     i | ]
\  }}|||S rR   r   r    s      r$   r%   z#_build_req_args.<locals>.<dictcomp>   s    CCC41aQ]!Q]]]r&   rE   )rD   rE   rF   rG   rH   )rD   rX   rW   r   rY   r[   r\   rZ   )r   
isinstancedictr(   rU   rL   rN   )rE   rV   rW   rX   rP   r   rY   rD   rZ   r[   r\   rF   rG   msgreq_argss                  r$   _build_req_argsrf      s    4HT!I %I''p$$$JtT22?????D.111Zt44AA%++--AAA j66CC6<<>>CCCFN333JtT22D.111Eg//

7##GtOO!!%,
 
 
  H  Or&   c           	        	 dt           t          t          t          t          t
          t          t          f         fd	dD ]i}|                     |d           }|Ot          |t                    r:t          |t                    s%	fd|D             }|                     ||i           j|                     dd           }|Ot          |t                    r:t          |t                    s%	fd|D             }|                     d|i           |                     dd           }|Ot          |t                    r:t          |t                    s%	fd|D             }|                     d|i           |                     d	d           }|at          |t
                    s*t          |t                    st          |t                    r$|                     d	 	|          i           d S d S d S )
Nobjc                    t          | t                    r|                                 S t          | t                    r|                                 S t          | t                    r|                                 S t          | t
                    r|                                 S t          | t                    r|                                 S t          | t                    r|                                 S | S rR   )rb   r   to_dictr   r   r   r   r   )rh   s    r$   rj   z)_parse_web_class_objects.<locals>.to_dict   s    c5!! 	!;;== c:&& 	!;;== c5!! 	!;;== c8$$ 	!;;== c122 	!;;== c>** 	!;;== 
r&   )blocksuser_auth_blocksc                 &    g | ]} |          S r   r   )r!   brj   s     r$   
<listcomp>z,_parse_web_class_objects.<locals>.<listcomp>   s!    666!771::666r&   attachmentsc                 &    g | ]} |          S r   r   )r!   arj   s     r$   ro   z,_parse_web_class_objects.<locals>.<listcomp>   s!    <<<1GGAJJ<<<r&   chunksc                 &    g | ]} |          S r   r   )r!   crj   s     r$   ro   z,_parse_web_class_objects.<locals>.<listcomp>   s!    222awwqzz222r&   metadata)r   r   r   r   r   r   r   r   getrb   r
   strrK   )
kwargsblocks_namerk   dict_blocksrp   dict_attachmentsrs   dict_chunksrv   rj   s
            @r$   _parse_web_class_objectsr~      s   U4
E8E[]kkl     6 6 6K..*VX">">
SY[^H_H_6666v666KMM;4555**]D11K:k8#D#DjYdfiNjNj<<<<<<<}&67888ZZ$''Fj::JvWZD[D[22226222x-...zz*d++H8X&& h//  h 677 
 	z778#4#4566666 r&   usersc                    |d S t          |t                    r+|                     dt          j        |          i           d S t          |t
                    r|                     d|i           d S t          d          )Nr   z4users must be either str or Sequence[Dict[str, str]])rb   listrK   rY   dumpsrx   r   )ry   r   s     r$   _update_call_participantsr      s    }% Xw
5 1 1233333	E3		 Xw&''''' VWWWr&   c                     d| v r| d         dur| d         dk    p/d| v o+d| d         v o!| d         d         duo| d         d         dk    }|S )zDetermine if the response contains 'next_cursor'
    and 'next_cursor' is not empty.

    Returns:
        A boolean value.
    next_cursorNr0   response_metadatar   )rX   presents     r$   _next_cursor_is_presentr      s     $fm)<D)HfTR_M`dfMf t# 	;T"566	;$%m4D@	; $%m4:	  Nr&   r#   c                 <    t          | t                    r| rdndS | S )N10)rb   boolr.   s    r$   r   r     s(    !T ! ssS Hr&   endpointry   c                    |                     d          }|r't          |                                          dk    rd S |                     d          }|r't          |                                          dk    rd S t          j                             d          }|rd S d|  d}d|  d}|                     d	          }|ft          |t                    rQt          d
 |D                       s6t          j	        |t                     t          j	        |t                     d S d S t          j	        |t                     d S )Ntextr   markdown_textSKIP_SLACK_SDK_WARNINGzFThe top-level `text` argument is missing in the request payload for a z call - It's a best practice to always provide a `text` argument when posting a message. The `text` argument is used in places where content cannot be rendered such as: system push notifications, assistive technology such as screen readers, etc.z_Additionally, the attachment-level `fallback` argument is missing in the request payload for a ad   call - To avoid this warning, it is recommended to always provide a top-level `text` argument when posting a message. Alternatively you can provide an attachment-level `fallback` argument, though this is now considered a legacy field (see https://docs.slack.dev/legacy/legacy-messaging/legacy-secondary-message-attachments#legacy_fields for more details).rp   c                     g | ]P}t          |t                    o8t          |                    d d                                                    dk    QS )fallbackr0   r   )rb   rc   lenrw   strip)r!   
attachments     r$   ro   z<_warn_if_message_text_content_is_missing.<locals>.<listcomp>5  sP    |||blZ
D))]c*..R2P2P2V2V2X2X.Y.Y\].]|||r&   )rw   r   r   osenvironrb   r   allwarningswarnUserWarning)r   ry   r   r   skip_deprecationmissing_text_messagemissing_fallback_messagerp   s           r$   (_warn_if_message_text_content_is_missingr   
  s~   ::fD DJJLL!!A%%JJ//M ]002233a77 z~~&>?? 
	WQY 	W 	W 	W 	Tjr 	T 	T 	T  **]++K :k4#@#@||p{|||
 
 	A M.<<<M2K@@@@@		A 	A 	*K88888r&   bodyc                     d                     d |                     dd                              d          D                       }t          |          dk    r|d d         dz   }d| }|S )Nr0   c                 6    g | ]}|                                 S r   )r   )r!   lines     r$   ro   z8_build_unexpected_body_error_message.<locals>.<listcomp>>  s     ^^^

^^^r&   
d   z...z*Received a response in a non-JSON format: )r8   replacesplitr   )r   body_for_loggingmessages      r$   $_build_unexpected_body_error_messager   =  s{    ww^^dD9Q9Q9W9WX\9]9]^^^__
s""+DSD1E9M;KMMGNr&   dc                 >    d |                                  D             S )Nc                     i | ]
\  }}|||S rR   r   r    s      r$   r%   z'_remove_none_values.<locals>.<dictcomp>M  s    888TQ!-Aq---r&   r'   )r   s    r$   _remove_none_valuesr   E  s      98QWWYY8888r&   upload_filec                    |                      d          }|                      d          }d }|t          |t          t          j        f          rOt          t          j        |          d          5 }|                                }d d d            n# 1 swxY w Y   nt          |t                    r|}nt          |t                    r>|                                }t          |t                    r|
                                }nct          d          |Rt          |t                    r|
                    d          }n't          |t                    r|}nt          d          |                      d          }|Ut          |t          t          j        f          r2t          j                            t          j        |                    }nd}|                      d	          }|t          d
| d|           ||}||t          |          ||                      d          |                      d          dS )Nfilecontentrbz<file parameter must be any of filepath, bytes, and io.IOBaseutf-8zKcontent for file upload must be 'str' (UTF-8 encoded) or 'bytes' (for data)filenamezUploaded filetitlez%File content not found for filename: z	, title: alt_txtsnippet_type)r   rX   lengthr   r   r   )rw   rb   rx   r   PathLikeopenfsencodereadbytesr   encoder   pathbasenamefspathr   )r   r   r   rX   readabler   r   s          r$   _to_v2_file_upload_itemr   P  sV   ??6""Dooi((G DdS"+.// 
	dbk$''.. '(}}' ' ' ' ' ' ' ' ' ' ' ' ' ' 'e$$ 	dDDf%% 	d99;;D$$$ %{{}}#$bccc		gs## 	s>>'**DD'' 	sDD#$qrrrz**HdS"+.// 	'w''	$88HH&HOOG$$E| b b b[` b bccc} d))??9--#77  s   2BBBurltimeoutloggerc                    d }|gt          |t                    r?t          j                            t          ||d          t          |                    }nt          d| d          |j        t          j
        k    r|                    d|             d }t          d| |i           }|r|                    ||          }nt          |||	          }|j                                        pd
}	|                                                    |	          }
|j        t          j
        k    r7d|j         dt)          |j                   d|
 }|                    |           |j        |j        |
dS )N)httphttps)contextzInvalid proxy detected: z must be a str valuezSending a request: POST r^   )methodr   rX   rD   )r   )r   r   r   z*Received the following response - status: z, headers: z, body: )statusrD   r   )rb   rx   urllibrequestbuild_openerr   r   r   levelloggingDEBUGdebugr   r   r   rD   get_content_charsetr   decoder   rc   )r   rX   r   r   r\   r[   openerrespreqcharsetr   r   s               r$   _upload_file_via_v2_urlr     s    (,FeS!! 	\^00ee<<==S))) FF
 $$Zu$Z$Z$Z[[[|w}$$555666#'D&cbIIIC :{{3{00sC999l..00;GG		""7++D|w}$${ T\**    	 	WkdlDIIIr&   responseSlackResponsec                 R    t          | t                    rd}t          |          d S )NzSorry! This SDK does not support run_async=True option for this API calls. Please migrate to AsyncWebClient, which is a new and stable way to go.)rb   r   r   )r   r   s     r$   _validate_for_legacy_clientr     s;     (F## )U 	  ((() )r&   c                  2    d} t          j        |            d S )Nzclient.files_upload() may cause some issues like timeouts for relatively large files. Our latest recommendation is to use client.files_upload_v2(), which is mostly compatible and much stabler, instead.)r   r   )r   s    r$   !_print_files_upload_v2_suggestionr     s%    	@ 
 M'r&   )NN)r   N)BrY   r   r   r5   r3   r   r   asyncior   http.clientr   ior   r[   r   typingr   r   r	   r
   r   urllib.parser   urllib.requestr   r   r   r   r   	slack_sdkr   slack_sdk.errorsr   slack_sdk.models.attachmentsr   slack_sdk.models.blocksr   slack_sdk.models.messages.chunkr   slack_sdk.models.metadatar   r   r   rx   r)   r=   rC   rc   r   rN   rU   rf   r~   r   r   r   r   r   r   r   r   intLoggerr   r   r   r   r&   r$   <module>r      s3     				  



         $ $ $ $ $ $             7 7 7 7 7 7 7 7 7 7 7 7 7 7             W W W W W W W W W W W W W W       . . . . . . 3 3 3 3 3 3 ) ) ) ) ) ) 1 1 1 1 1 1 V V V V V V V V V V8DcN#; cSVh@X    $/ /8C= /# / / / /$)s ) ) ) ) ) ) // C=/ 	/
 / 'tn/ 
#s(^/ / / /d! !d !t ! ! ! !7C=7 7 	7
 7 7 7 7 7 7 
*	7 C=7 
7 7 7 7t&7 &7 &7 &7R	XU3c3h8P3P-Q 	XVZ 	X 	X 	X 	XT    "# %S/    09s 09DcN 09W[ 09 09 09 09fs s    94 9D 9 9 9 9.c3h .DhsmAS<T . . . .l   $(J (J	(J
(J (J N	(J
 C=(J 
*	(J 
#s(^(J (J (J (JV	)OV+,	)		) 	) 	) 	)    r&   