
    i?                     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
  e
e          ZdefdZdefdZdedz  dedz  fd	Zdedz  d
ededz  fdZdeeef         deeef         fdZddeeef         d
edefdZdeeef         deeef         fdZdeeef         ddfdZdeeef         ddfdZdS )    N)Any)settings)
get_loggerreturnc                  f    t          t          j                  ot          t          j                  S N)boolr   !SLACK_ERROR_NOTIFICATIONS_ENABLEDSLACK_ERROR_WEBHOOK_URL     2/code/app/services/notifications/slack_notifier.py_notifications_enabledr      s.    :;; (A A r   c                      t                      S r   )r   r   r   r   _should_notifyr      s    !###r   textc                     | d S |                      dd                               dd                               dd          S )N&z&amp;<z&lt;>z&gt;)replace)r   s    r   	_sanitizer      s@    |t<<W%%--c6::BB3OOOr   limitc                 N    | d S t          |           |k    r| n| d |          dS )Nz...)len)r   r   s     r   	_truncater      s7    |tt99%%44d6E6l+?+?+??r   datac                 >    d |                                  D             S )Nc                     i | ]
\  }}|||S r   r   ).0keyvalues      r   
<dictcomp>z!_compact_dict.<locals>.<dictcomp>$   s#    KKK:39JC9J9J9Jr   )items)r   s    r   _compact_dictr%   #   s    KKKKKKr   
  c                 l    t          j        t          |           d          }t          ||          pdS )N   )indent )jsondumpsr%   r   )r   r   r   s      r   _json_blockr-   '   s3    :mD))!444DT5!!'R'r   contextc                    t          t          |                     dd          d                    pd}t          t          |                     dd          d                    pd}d}dd	|d
ddddd                    d d| d| |                     d          r2dt          t	          |                     d                               nd fD                       ddg}t          |                     d          t          |                     d                    |                     d          |                     d          t          |                     d                    |                     d          d          }|                    dddt          |           ddd           t          |                     d          t          t          |                     d          d                    t          |                     d           d!          d"          }|                    ddd#t          |           ddd           ||d$S )%NtitlezUnhandled errorx   messagezInternal Server Errori  ERRORheader
plain_textT)typer   emoji)r6   r   sectionmrkdwnz

c              3      K   | ]}||V  	d S r   r   )r    lines     r   	<genexpr>z!_build_payload.<locals>.<genexpr>D   s>       $ $ $$ $ $ $ $ $r   z*Message:*
z	*Level:*

request_idz*requestId:*
pathmethodstatus_code
user_agent	client_ip)	requestIdr>   r?   
statusCode	userAgentclientIpz*Context*
```z```
error_nameerror_messagei  error_stacki.  )namer2   stackz*Exception*
```)r   blocks)r   r   getjoinstrr%   appendr-   )r.   r0   r2   levelrL   context_blockexception_blocks          r   _build_payloadrT   ,   s   )GKK1BCCSIIJJ 	 

 	)GKK	3JKKTRRSS 	#"  E $ 	
 	
   $ $ 1w00,U,,  '{{<88&XYs7;;|;T;T7U7U-V-VXXX!%!$ $ $   	
 	
F< " \22gkk&1122kk(++!++m44"7;;|#<#<==K00	
 	
	 	M MM H])C)CHHH 	
 	
   $KK-- 7;;+G+G!N!NOOw{{=995AA	
 	
 O MM L;+G+GLLL 	
 	
   V,,,r   payloadc                 :   t           j        }|sd S t          j        |                               d          }t
          j                            ||ddid          }	 t
          j                            |d          5 }|j	        dk    rt          d	|j	                   	 d d d            d S # 1 swxY w Y   d S # t
          j        j        $ rI}|                                                    dd
          }t          d	|j         d|           |d }~ww xY w)Nzutf-8zContent-Typezapplication/jsonPOST)r   headersr?      )timeouti  zSlack webhook failed with r   )errorsz: )r   r   r+   r,   encodeurllibrequestRequesturlopenstatusRuntimeErrorerror	HTTPErrorreaddecodecode)rU   webhook_urlbodyr^   responseexcdetailss          r   _post_to_slackrm      s   2K :g%%g..Dn$$!34	 %  GX^##GQ#77 	S8#%%"#Q#Q#QRRR &	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S <! X X X((**##GI#>>MMMGMMNNTWWXs=   !B= ?#B0#B= 0B44B= 7B48B= =DADDc                    K   t                      sd S t          |           }	 t          j        t          |           d {V  d S # t
          $ r&}t                              d|           Y d }~d S d }~ww xY w)Nz#Slack error notification failed: %s)r   rT   asyncio	to_threadrm   	Exceptionloggerrc   )r.   rU   rk   s      r   notify_errorrs      s       W%%GA88888888888 A A A:C@@@@@@@@@As    A 
A5A00A5)r&   )ro   r+   urllib.errorr]   urllib.requesttypingr   app.settingsr   app.utils.loggerr   __name__rr   r	   r   r   rO   r   intr   dictr%   r-   rT   rm   rs   r   r   r   <module>r|      s%                   ! ! ! ! ! ! ' ' ' ' ' '	H		    $ $ $ $ $PC$J P3: P P P P@C$J @s @sTz @ @ @ @LS#X L4S> L L L L( (d38n (S (C ( ( ( (
P-DcN P-tCH~ P- P- P- P-fXDcN Xt X X X X(AS#X A4 A A A A A Ar   