
    E0j^'                         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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 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  G d de          ZdS )    N)
quote_plus   )
Credential)CallbackHandler)EventHandler)SystemHandler)SystemMessage)EventMessage)CallbackMessage)setup_default_logger)DINGTALK_OPENAPI_ENDPOINT)VERSION_STRINGc                       e Zd Zedz   ZdZddedej        fdZ	de
fdZdefd	Zd
 Zd ZddZd Zd Zd Zd Zd Zd Zd ZddZdS )DingTalkStreamClientz/v1.0/gateway/connections/open
disconnectN
credentialloggerc                     || _         t                      | _        i | _        t	                      | _        d | _        |r|nt          d          | _        d| _	        d| _
        i | _        d S )Nzdingtalk_stream.clientF)r   r   event_handlercallback_handler_mapr   system_handler	websocketr   r   _pre_started_is_event_required_access_token)selfr   r   s      ^/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/dingtalk_stream/stream.py__init__zDingTalkStreamClient.__init__   sh    &0+7>>$&!-:__06&jff<PQi<j<j!"'    handlerc                 0    | |_         || _        d| _        d S NT)dingtalk_clientr   r   r   r    s     r   register_all_event_handlerz/DingTalkStreamClient.register_all_event_handler*   s     "&$"&r   c                 (    | |_         || j        |<   d S N)r#   r   )r   topicr    s      r   register_callback_handlerz.DingTalkStreamClient.register_callback_handler/   s    "&+2!%(((r   c                     | j         rd S d| _         | j                                         | j                                         | j                                        D ]}|                                 d S r"   )r   r   	pre_startr   r   valuesr$   s     r   r+   zDingTalkStreamClient.pre_start3   s     	F $$&&&%%'''07799 	  	 G	  	 r   c                 >  K   |                                   	 	 |                                 }|s6| j                            d           t	          j        d           d {V  	 N| j                            d|           |d          dt          |d                    }t          j	        |          4 d {V }|| _
        t	          j        |                     |                     |2 3 d {V }t          j        |          }t	          j        |                     |                     C6 	 d d d           d {V  n# 1 d {V swxY w Y   n# t           $ r}Y d }~d S d }~wt          j        j        t          j        j        f$ r@}| j                            d|           t	          j        d           d {V  Y d }~d }~wt(          $ r@}t	          j        d	           d {V  | j                            d
|           Y d }~d }~ww xY wn# w xY w)NTzopen connection failed
   zendpoint is %sendpointz?ticket=ticketz#[start] network exception, error=%s   zunknown exception)r+   open_connectionr   errorasynciosleepinfor   
websocketsconnectr   create_task	keepalivejsonloadsbackground_taskKeyboardInterrupt
exceptionsCancelledErrorConnectionClosedError	Exception	exception)r   
connectionurir   raw_messagejson_messagees          r   startzDingTalkStreamClient.start<   s>     	!1133
! K%%&>???!-+++++++++, +   !1:>>>#J/[[JxDX9Y9Y[[%-c22 P P P P P P Pi%.DN'y(A(ABBB-6 P P P P P P Pk'+z+'>'>+D,@,@,N,NOOOO .7YP P P P P P P P P P P P P P P P P P P P P P P P P P P %     &5)?A   !!"GKKKmB'''''''''     mA&&&&&&&&&%%&91===
 ;	s   A
E %AE :1E+D.1>E0E 
EE EE H 
HH $(H5GH H5H	H HH H<   c                    K   	 t          j        |           d {V  	 |                                 d {V  n# t          j        j        $ r Y d S w xY wRr'   )r4   r5   pingr7   r?   ConnectionClosed)r   wsping_intervals      r   r:   zDingTalkStreamClient.keepalive^   sz      	-.........ggii(9   		s   : AAc                   K   	 |                      |           d {V }|t          j        k    r!| j                                         d {V  d S d S # t
          $ r(}| j                            d|            Y d }~d S d }~ww xY w)Nzerror processing message: )route_messager   TAG_DISCONNECTr   closerB   r   r3   )r   rG   route_resultrH   s       r   r=   z$DingTalkStreamClient.background_taskf   s      	@!%!3!3L!A!AAAAAAAL3BBBn**,,,,,,,,,,, CB 	@ 	@ 	@K>1>>?????????	@s   A
A 
BA??Bc                   K   d}|                     dd          }d }|t          j        k    rt          j        |          }| j                            |           d {V }|j        j        t          j        k    r4t          j
        }| j                            d|j        j        |           n| j                            d|j        j        |           n|t          j        k    r5t          j        |          }| j                            |           d {V }n|t           j        k    r}t!          j        |          }| j                             |j        j                  }|r|                    |           d {V }nB| j                            d|j        j        |           n| j                            d|           |rD| j                            t)          j        |                                                     d {V  |S )N typez(received disconnect topic=%s, message=%sz+unknown message topic, topic=%s, message=%sz4unknown callback message topic, topic=%s, message=%szunknown message, content=%s)getr	   TYPE	from_dictr   raw_processheadersr(   TOPIC_DISCONNECTr   rR   r   r6   warningr
   r   r   r   r   sendr;   dumpsto_dict)r   rG   resultmsg_typeackmsgr    s          r   rQ   z"DingTalkStreamClient.route_messagen   s     ##FB//})))),77C+77<<<<<<<<C{ M$BBB-<  !KS[M^`lmmmm##$QSVS^Sdfrssss***(66C*66s;;;;;;;;CC---!+L99C/33CK4EFFG 2#//44444444##$Z\_\g\m$02 2 2 2 K =|LLL 	A.%%dj&?&?@@@@@@@@@r   c                    	 	 t          j        |                                            n,# t          $ r}Y d }~t	          j        d           d S d }~ww xY w	 t	          j        d           n# t	          j        d           w xY w)NTr1   )r4   runrI   r>   timer5   )r   rH   s     r   start_foreverz"DingTalkStreamClient.start_forever   s    	DJJLL))))$   
1 * 
1
1	s%   &* A, 
AA, AA, ,Bc                    | j                             dt          j        z             dddt          dt          j                    dd}g }| j        r|                    ddd	           | j	        
                                D ]}|                    d
|d	           t          j        | j        j        | j        j        |dt          z  |                                 d                              d          }	 d}t%          j        t          j        ||          }|j        }|                                 n8# t,          $ r+}| j                             d| d|            Y d }~d S d }~ww xY w|                                S )Nzopen connection, url=%sapplication/jsonzDingTalkStream/1.0 SDK/z Python/z? (+https://github.com/open-dingtalk/dingtalk-stream-sdk-python))Content-TypeAcceptz
User-AgentEVENT*)rW   r(   CALLBACKzdingtalk-sdk-python/v%s-union)clientIdclientSecretsubscriptionsualocalIpzutf-8rV   r\   datazopen connection failed, error=, response.text=)r   r6   r   OPEN_CONNECTION_APIr   platformpython_versionr   appendr   keysr;   r`   r   	client_idclient_secretget_host_ipencoderequestsposttextraise_for_statusrB   r3   )r   request_headerstopicsr(   request_bodyresponse_textresponserH   s           r   r2   z$DingTalkStreamClient.open_connection   s   25I5]]^^^.(( !/0G0I0I0I0IK
 
 " 	;MM7S99:::.3355 	@ 	@EMM:>>????z1 O9#1NB''))#
 #
   6'?? 	
	M}%9%M-<*68 8 8H %MM%%'''' 	 	 	KaqaaR_aabbb44444	 }}s   <>D; ;
E0 E++E0c                     d}	 t          j         t           j        t           j                  }|                    d           |                                d         }|                                 |S # |                                 |c cY S xY w)u:   
        查询本机ip地址
        :return: ip
        rV   )z8.8.8.8P   r   )socketAF_INET
SOCK_DGRAMr8   getsocknamerS   )r   ipss      r   r   z DingTalkStreamClient.get_host_ip   s}    
 	fnf.?@@AIIo&&&#BGGIIII GGIIIIIIIIIIIs   AA2 2Bc                     i | _         dS )z$ reset token if open api return 401 N)r   )r   s    r   reset_access_tokenz'DingTalkStreamClient.reset_access_token   s    r   c                    t          t          j                              }| j        r|| j        d         k     r| j        d         S ddd}| j        j        | j        j        d}	 t          dz   }d}t          j        ||t          j
        |                    }|j        }|                                 n8# t          $ r+}| j                            d	| d
|            Y d }~d S d }~ww xY w|	                                }t          t          j                              |d         z   dz
  |d<   || _        | j        d         S )N
expireTimeaccessTokenrk   )rl   rm   )appKey	appSecretz/v1.0/oauth2/accessTokenrV   rv   z(get dingtalk access token failed, error=rx   expireIni,  )intrh   r   r   r~   r   r   r   r   r;   r`   r   r   rB   r   r3   )	r   nowr   r,   urlr   r   rH   rb   s	            r   get_access_tokenz%DingTalkStreamClient.get_access_token   sm   $)++ 	5#(:<(H"H"H%m44 /(
 

 o/6
 
	+.HHCM}S-<*.*V*<*<> > >H %MM%%'''' 	 	 	Kkkk\ikklll44444	 "49;;//&2DDO|#!-00s   %AB6 6
C+  C&&C+image	image.png	image/pngc                    |                                  }|s| j                            d           d S d|||fi}d|i}dt          |           }	 d}	t	          j        |||          }
|
j        }	|
j        dk    r|                                  |
	                                 n8# t          $ r+}| j                            d| d	|	            Y d }~d S d }~ww xY wd
|
                                vrQ| j                            d|
                                           t          d|
                                z            |
                                d
         S )Nz;upload_to_dingtalk failed, cannot get dingtalk access tokenmediarW   z4https://oapi.dingtalk.com/media/upload?access_token=rV   )rw   filesi  z!upload to dingtalk failed, error=rx   media_idz/upload to dingtalk failed, error response is %szupload failed, error=%s)r   r   r3   r   r   r   r   status_coder   r   rB   r;   )r   image_contentfiletypefilenamemimetypeaccess_tokenr   r,   
upload_urlr   r   rH   s               r   upload_to_dingtalkz'DingTalkStreamClient.upload_to_dingtalk   s   ,,.. 	K[\\\4hx8
 H
 gJWcLdLdff

	M}ZfEJJJH$MM#s**'')))%%'''' 	 	 	Kd!ddUbddeee44444	 X]]__,,KOQYQ^Q^Q`Q`aaa5GHHH}}z**s   AB% %
C/ CCr'   )rJ   )r   r   r   )__name__
__module____qualname__r   ry   rR   r   loggingLoggerr   r   r%   r   r)   r+   rI   r:   r=   rQ   ri   r2   r   r   r   r    r   r   r   r      s8       36VV!N	  	 : 	 w~ 	  	  	  	 ', ' ' ' '
3 3 3 3 3          D   @ @ @  :  ! ! !F       1 1 1>+ + + + + +r   r   )r4   asyncio.exceptionsr;   r   rz   rh   r   r   r7   urllib.parser   r   r   handlersr   r   r   framesr	   r
   r   logr   utilsr   versionr   objectr   r   r   r   <module>r      sb                  # # # # # # " " " " " " % % % % % % " " " " " " # # # # # # ! ! ! ! ! !             # # # # # # % % % % % % , , , , , , # # # # # #g+ g+ g+ g+ g+6 g+ g+ g+ g+ g+r   