
    E0jx                        d dl Z d dlZd dlZd dl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ZddlmZmZmZmZmZ d dlZ G d	 d
e          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Zd"de de defdZ!de defdZ" G d de          Z# G d  d!e#          Z$dS )#    N   )CallbackHandlerCallbackMessage)
AckMessageHeaders)"generate_multi_text_line_card_data)DINGTALK_OPENAPI_ENDPOINT)ThreadPoolExecutor)MarkdownCardInstanceAIMarkdownCardInstanceCarouselCardInstanceMarkdownButtonCardInstanceRPAPluginCardInstancec                   0    e Zd Zd Zed             Zd ZdS )AtUserc                 0    d | _         d | _        i | _        d S N)dingtalk_idstaff_id
extensionsselfs    _/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/dingtalk_stream/chatbot.py__init__zAtUser.__init__   s        c                     t                      }d}|                                D ]+\  }}|dk    r||_        |dk    r||_        !||j        |<   ,|S )N 
dingtalkIdstaffId)r   itemsr   r   r   )clsduserdatanamevalues         r   	from_dictzAtUser.from_dict   si    xx7799 	. 	.KD%|###(  "" %(-%%r   c                 |    | j                                         }| j        
| j        |d<   | j        
| j        |d<   |S )Nr   r   )r   copyr   r   r   results     r   to_dictzAtUser.to_dict%   sD    %%'''#'#3F< =$ $F9r   N__name__
__module____qualname__r   classmethodr'   r,    r   r   r   r      sM          
 
 
 [
    r   r   c                   B    e Zd ZU eed<   d Zd Zed             Zd Z	dS )TextContentcontentc                 "    d | _         i | _        d S r   )r5   r   r   s    r   r   zTextContent.__init__1   s    r   c                     d| j         z  S )NzTextContent(content=%s))r5   r   s    r   __str__zTextContent.__str__5   s    (4<77r   c                     t                      }d}|                                D ]\  }}|dk    r||_        ||j        |<   |S )Nr   r5   )r4   r    r5   r   )r!   r"   r5   r$   r%   r&   s         r   r'   zTextContent.from_dict8   sT    --7799 	1 	1KD%y  "'+0"4((r   c                 Z    | j                                         }| j        
| j        |d<   |S )Nr5   )r   r)   r5   r*   s     r   r,   zTextContent.to_dictC   s.    %%''<# $F9r   N)
r.   r/   r0   str__annotations__r   r8   r1   r'   r,   r2   r   r   r4   r4   .   sg         LLL  8 8 8   [    r   r4   c                   0    e Zd Zd Zed             Zd ZdS )ImageContentc                     d | _         d S r   download_coder   s    r   r   zImageContent.__init__L   s    !r   c                 p    t                      }|                                D ]\  }}|dk    r||_        |S NdownloadCode)r>   r    rA   r!   r"   r5   r%   r&   s        r   r'   zImageContent.from_dictO   s?    ..7799 	. 	.KD%~%%(-%r   c                 ,    i }| j         
| j         |d<   |S rC   r@   r*   s     r   r,   zImageContent.to_dictW   s"    )%)%7F>"r   Nr-   r2   r   r   r>   r>   J   sM        " " "   [    r   r>   c                   0    e Zd Zd Zed             Zd ZdS )RichTextContentc                     d | _         d S r   rich_text_listr   s    r   r   zRichTextContent.__init__`   s    "r   c                 ~    t                      }g |_        |                                D ]\  }}|dk    r||_        |S NrichText)rH   rK   r    rE   s        r   r'   zRichTextContent.from_dictc   sI    !##!#7799 	/ 	/KD%z!!).&r   c                 ,    i }| j         
| j         |d<   |S rM   rJ   r*   s     r   r,   zRichTextContent.to_dictl   s"    *!%!4F:r   Nr-   r2   r   r   rH   rH   ^   sM        # # #   [    r   rH   c                       e Zd ZdZd Zd ZdS )HostingContextu   
    托管人的上下文
    c                 "    d| _         d| _        d S )Nr   user_idnickr   s    r   r   zHostingContext.__init__x   s    			r   c                 $    | j         | j        d}|S )N)userIdrU   rS   r*   s     r   r,   zHostingContext.to_dict|   s    lI
 
 r   N)r.   r/   r0   __doc__r   r,   r2   r   r   rQ   rQ   s   s<               r   rQ   c                   *    e Zd ZdZd ZdefdZd ZdS )ConversationMessageu   
    历史消息状态
    c                 0    d| _         d| _        d| _        d S )Nr   r   read_statussender_user_id	send_timer   s    r   r   zConversationMessage.__init__   s     r   returnc                     | j         dk    S )u;   
        消息是否被我已读
        :return:
        2)r]   r   s    r   
read_by_mezConversationMessage.read_by_me   s    
 3&&r   c                 0    | j         | j        | j        d}|S )N)
readStatussenderUserIdsendTimer\   r*   s     r   r,   zConversationMessage.to_dict   s&    * /
 

 r   N)r.   r/   r0   rX   r   boolrc   r,   r2   r   r   rZ   rZ      sW           
'D ' ' ' '    r   rZ   c                   V    e Zd ZU dZdZeed<   d Zed             Z	d Z
d Zd Zd	 Zd
S )ChatbotMessagez/v1.0/im/bot/messages/getz/v1.0/im/bot/messages/delegatetextc                 V   d | _         d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _	        d | _
        d | _        d | _        g | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        i | _        d S r   )is_in_at_listsession_webhooksender_nick
robot_codesession_webhook_expired_time
message_id	sender_idchatbot_user_idconversation_idis_admin	create_atrk   conversation_typeat_userschatbot_corp_idsender_corp_idconversation_titlemessage_typeimage_contentrich_text_contentsender_staff_idhosting_contextconversation_msg_contextr   r   s    r   r   zChatbotMessage.__init__   s    !#,0)##	!%#""& !!%#/3(,%r   c                    t                      }d}|                                D ]L\  }}|dk    r||_        |dk    r||_        "|dk    r||_        0|dk    r||_        >|dk    rt          |          |_        Y|dk    r||_        g|dk    r||_	        u|d	k    r||_
        |d
k    r||_        |dk    r||_        |dk    r||_        |dk    r||_        |dk    rd |D             |_        |dk    r||_        |dk    r||_        |dk    r||_        |dk    r||_        |dk    r't(                              |d                   |_        7|dk    r't.                              |d                   |_        d|dk    r%t2                              |d                   |_        |dk    r	||_        |dk    r9t9                      |_        |d         |j        _        |d         |j        _        |dk    r]g |_         |D ]Q}tC                      }|d         |_"        |d         |_#        |d         |_$        |j         %                    |           RB||j&        |<   N|S ) Nr   
isInAtListsessionWebhook
senderNick	robotCodesessionWebhookExpiredTimemsgIdsenderIdchatbotUserIdconversationIdisAdmincreateAtconversationTypeatUsersc                 B    g | ]}t                               |          S r2   )r   r'   .0is     r   
<listcomp>z,ChatbotMessage.from_dict.<locals>.<listcomp>   s&    CCC 0 0 3 3CCCr   chatbotCorpIdsenderCorpIdconversationTitlemsgtyperk   picturer5   rN   senderStaffIdhostingContextrW   rU   conversationMsgContextre   rg   rf   )'rj   r    rm   rn   ro   rp   intrq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r4   r'   rk   r>   r~   rH   r   r   rQ   r   rT   rU   r   rZ   r]   r_   r^   appendr   )r!   r"   msgr$   r%   r&   vconversation_msgs           r   r'   zChatbotMessage.from_dict   s   7799 9	- 9	-KD%|##$)!!)))&+##%%"'$$!&44436u::00!&## %((&+##)))&+##""$## %+++(-%%""CCUCCC((&+##''%*"",,,).&&""#( F??*44QvY??CHHi''(4(>(>q|(L(LC%%j((,;,E,Ea	l,S,SC)((&+##)))&4&6&6#.3Ho#++0=#((111/1, J JA':'<'<$34\?$012:$.676G$30778HIIIIJ (-t$$
r   c                    | j                                         }| j        
| j        |d<   | j        
| j        |d<   | j        
| j        |d<   | j        
| j        |d<   | j        
| j        |d<   | j        
| j        |d<   | j        
| j        |d<   | j	        
| j	        |d<   | j
        
| j
        |d	<   | j        
| j        |d
<   | j        
| j        |d<   | j        | j                                        |d<   | j        | j                                        |d<   | j        | j                                        |d<   | j        
| j        |d<   | j        d | j        D             |d<   | j        
| j        |d<   | j        
| j        |d<   | j        
| j        |d<   | j        
| j        |d<   | j        
| j        |d<   | j        | j                                        |d<   | j        d | j        D             |d<   |S )Nr   r   r   r   r   r   r   r   r   r   r   rk   r5   r   c                 6    g | ]}|                                 S r2   r,   r   s     r   r   z*ChatbotMessage.to_dict.<locals>.<listcomp>  s      D D D D D Dr   r   r   r   r   r   r   r   c                 6    g | ]}|                                 S r2   r   )r   r   s     r   r   z*ChatbotMessage.to_dict.<locals>.<listcomp>-  s     /c/c/c		/c/c/cr   r   )r   r)   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rk   r,   r~   r   rx   ry   rz   r{   r|   r}   r   r   r   r*   s     r   r,   zChatbotMessage.to_dict   sW   %%'')#'#5F< +'+';F#$'#'#3F< ?&"&/F;,8262SF./?&"oF7O>%!%F:+&*&:F?#+'+';F#$=$ $F9>%!%F:9 !Y..00F6N) $ 2 : : < <F9!- $ 6 > > @ @F9!-)-)?F%&=$ D Ddm D D DF9+&*&:F?#*%)%8F>"".*.*AF&'( $ 1F9+&*&:F?#+'+';'C'C'E'EF#$(4/c/cTEb/c/c/cF+,r   c                     | j         dk    r| j        j        gS | j         dk    r2g }| j        j        D ]!}d|v r|                    |d                    "|S d S )Nrk   rN   )r}   rk   r5   r   rK   r   )r   rk   items      r   get_text_listzChatbotMessage.get_text_list0  ss    &&I%&&*,,D.= . .T>>KKV---K -,r   c                     | j         dk    r| j        j        gS | j         dk    r2g }| j        j        D ]!}d|v r|                    |d                    "|S d S )Nr   rN   rD   )r}   r~   rA   r   rK   r   )r   imagesr   s      r   get_image_listzChatbotMessage.get_image_list;  sw    	))&455*,,F.= 8 8!T))MM$~"6777M -,r   c           	      H    d| j         d| j        d| j        d| j        d	S )NzChatbotMessage(message_type=z, text=z, sender_nick=z, conversation_title=))r}   rk   ro   r|   r   s    r   r8   zChatbotMessage.__str__F  s;     III###	
 	
r   N)r.   r/   r0   TOPICDELEGATE_TOPICr4   r<   r   r1   r'   r,   r   r   r8   r2   r   r   rj   rj      s         'E5N
  6 = = [=~0 0 0d	 	 		 	 	
 
 
 
 
r   rj   r   rT   user_nicknamer`   c                     | | |dt          t          j                              d}t                              |          S )N1)r   r   senderr   	messageIdr;   uuiduuid1rj   r'   )rT   r   r"   s      r   reply_specified_single_chatr   O  sA     &&	 	A ##A&&&r   open_conversation_idc                 ~    | dt          t          j                              d}t                              |          S )Nrb   )r   r   r   r   )r   r"   s     r   reply_specified_group_chatr   Z  s;    .&&	 	A
 ##A&&&r   c                       e Zd Z fdZ	 	 d,dededededed	ed
efdZddddi dddfdededededede	dedede
d
efdZ	 	 d-dedede
dededed
efdZ	 	 	 	 	 d.dedede
dededede
ded
efdZ	 	 d/dedededed
ef
dZ	 	 d0dededede
d
ef
dZded
e
fdZded
e
fdZd ed
efd!Zd/d"ededefd#Zd"edefd$Zded"edefd%Z	 	 d1d&e	deded	ed
ef
d'Zd(ed&e	fd)Zed*efd+            Z xZS )2ChatbotHandlerc                 V    t          t          |                                            d S r   )superr   r   )r   	__class__s    r   r   zChatbotHandler.__init__e  s%    nd##,,.....r   r   Fmarkdownincoming_messagetitlelogo	at_senderat_allr`   c                     t          | j        |          }|                    ||           |                    |||           |S )u   
        回复一个markdown卡片
        :param markdown:
        :param incoming_message:
        :param title:
        :param logo:
        :param at_sender:
        :param at_all:
        :return:
        )r   r   )r   dingtalk_clientset_title_and_logoreply)r   r   r   r   r   r   r   markdown_card_instances           r   reply_markdown_cardz"ChatbotHandler.reply_markdown_cardh  sO     "6d6JL\!]!]11%>>>$$X6$RRR%%r   N	plugin_idplugin_versionplugin_nameability_nameplugin_argsgoalcorp_id
recipientsc
                     t          | j        |          }
|
                    |           |
                    |           |
                    ||||||	           |
S )u4  
        回复一个markdown卡片
        :param ability_name:
        :param incoming_message:
        :param recipients:
        :param corp_id:
        :param goal:
        :param plugin_args:
        :param plugin_name:
        :param plugin_version:
        :param plugin_id:
        :return:
        r   )r   r   set_goalset_corp_idr   )r   r   r   r   r   r   r   r   r   r   rpa_plugin_card_instances              r   reply_rpa_plugin_cardz$ChatbotHandler.reply_rpa_plugin_card{  ss    . $99MO_#`#`  ))$/// ,,W555 &&y.+|]h2< 	' 	> 	> 	> ('r   button_listtipsc                     t          | j        |          }|                    ||           |                    |||           |S )u   
        回复一个带button的卡片
        :param tips:
        :param incoming_message:
        :param markdown:
        :param button_list:
        :param title:
        :param logo:
        :return:
        )r   )r   r   r   r   )r   r   r   r   r   r   r   markdown_button_instances           r   reply_markdown_buttonz$ChatbotHandler.reply_markdown_button  sO     $>d>RTd#e#e  33E4@@@ &&x4&HHH''r   Tsupport_forwardc	                     t          | j        |          }	|	                    ||           |	                    ||           |	                    |d           |	                    |||           |	S )u  
        回复一个带button的ai卡片
        :param support_forward:
        :param recipients:
        :param tips:
        :param incoming_message:
        :param markdown:
        :param button_list:
        :param title:
        :param logo:
        :return:
        )r   r   T)r   r   )r   r   r   )r   r   r   ai_startai_streaming	ai_finish)
r   r   r   r   r   r   r   r   r   r   s
             r   reply_ai_markdown_buttonz'ChatbotHandler.reply_ai_markdown_button  s    * $:$:NP`#a#a  33E4@@@ ))ZQ`)aaa --x-MMM **H+\`*aaa''r   c                     t          | j        |          }|                    ||           |                    |||           |S )u   
        回复一个轮播图卡片
        :param markdown:
        :param incoming_message:
        :param title:
        :param logo:
        :param image_slider:
        :param button_text:
        :return:
        )r   r   r   r   )r   r   r   image_sliderbutton_textr   r   carousel_card_instances           r   reply_carousel_cardz"ChatbotHandler.reply_carousel_card  sL     "6d6JL\!]!]11%>>>$$X|[III%%r   c                     t          | j        |          }|                    ||           |                    |           |S )u   
        发起一个AI卡片
        :param recipients:
        :param incoming_message:
        :param title:
        :param logo:
        :return:
        r   )r   r   r   r   )r   r   r   r   r   ai_markdown_card_instances         r   ai_markdown_card_startz%ChatbotHandler.ai_markdown_card_start  sK     %;4;OQa$b$b!!44UDAAA!**j*AAA((r   c                 *    |                                 S )u  
        获取文本列表
        :param incoming_message:
        :return: text list。如果是纯文本消息，结果列表中只有一个元素；如果是富文本消息，结果是长列表，按富文本消息的逻辑分割，大致是按换行符分割的。
        )r   )r   r   s     r   "extract_text_from_incoming_messagez1ChatbotHandler.extract_text_from_incoming_message  s      --///r   c                 ,   |                                 }|t          |          dk    rdS g }|D ]c}|                     |          }t          j        |          }| j                            |j        ddd          }|                    |           d|S )u   
        获取用户发送的图片，重新上传，获取新的mediaId列表
        :param incoming_message:
        :return: mediaid list
        Nr   imagez	image.pngz	image/png)filetypefilenamemimetype)	r   lenget_image_download_urlrequestsgetr   upload_to_dingtalkr5   r   )r   r   
image_listmediaidsrA   download_urlr~   mediaids           r   #extract_image_from_incoming_messagez2ChatbotHandler.extract_image_from_incoming_message  s     &4466
ZA!5!54' 	% 	%M66}EEL$L66M*==m>S^eGRGR > T TG OOG$$$$r   rA   c                    | j                                         }|s| j                            d           dS dd|dt	          j                    z  d}| 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|                                d         S )u   
        根据downloadCode获取下载链接 https://open.dingtalk.com/document/isvapp/download-the-file-content-of-the-robot-receiving-message
        :param download_code:
        :return:
        =send_off_duty_prompt failed, cannot get dingtalk access tokenNapplication/json*/*eDingTalkStream/1.0 SDK/0.1.0 Python/%s (+https://github.com/open-dingtalk/dingtalk-stream-sdk-python)Content-TypeAcceptzx-acs-dingtalk-access-tokenz
User-Agent)r   rD   z!/v1.0/robot/messageFiles/downloadr   headersr$   zget_image_download_url, error=, response.text=downloadUrl)r   get_access_tokenloggererrorplatformpython_version
credential	client_idr	   r   postjsondumpsrk   raise_for_status	Exception)	r   rA   access_tokenrequest_headersvaluesurlresponse_textresponsees	            r   r   z%ChatbotHandler.get_image_download_url  sM    +<<>> 	K]^^^4 /+7\'6889	
 
 -8B)
 

 (*MM
	M}S-<*.*V*<*<> > >H %MM%%'''' 	 	 	KaqaaR_aabbb22222	 }}}--s   2AB9 9
C. C))C.rk   c                    | j                                         }|s| j                            d           dS ||dk    rd}||dk    rd}t	          |||g          }dd|d	t          j                    z  d
}| j         j        j        t          j
        |          dd}t          dz   }	 d}	t          j        ||t          j
        |                    }
|
j        }	|
                                 n># t           $ r1}| j                            d| d|	            |
j        cY d}~S d}~ww xY w|
	                                S )u7  
        设置离线提示词，需要使用OpenAPI，当前仅支持自建应用。
        :param text: 离线提示词，支持markdown
        :param title: 机器人名称，默认："钉钉Stream机器人"
        :param logo: 机器人logo，默认："@lALPDfJ6V_FPDmvNAfTNAfQ"
        :return:
        r  Nr   u   钉钉Stream机器人z@lALPDfJ6V_FPDmvNAfTNAfQ)r   r   textsr  r  r  r  StandardCard)r   cardDatacardTemplateIdz0/v1.0/innerApi/robot/stream/away/template/updater  zset_off_duty_prompt, error=r
  )r   r  r  r  r   r  r  r  r  r  r  r	   r   r  rk   r  r  status_code)r   rk   r   r   r  prompt_card_datar  r  r  r  r  r  s               r   set_off_duty_promptz"ChatbotHandler.set_off_duty_prompt7  s    +<<>> 	K]^^^4=ERKK+E<42::-D=EPT]a\bccc /+7\'6889	
 
 -8B
#344,
 
 (*\\
	(M}S-<*.*V*<*<> > >H %MM%%'''' 	( 	( 	(K^A^^}^^___'''''''	( }}s   ,AC3 3
D.=&D)#D.)D.c                 ^   ddd}dd|id|j         gid}	 d}t          j        |j        |t	          j        |          	          }|j        }|                                 n8# t          $ r+}| j	        
                    d
| d|            Y d }~d S d }~ww xY w|                                S )Nr  r  r  r  rk   r5   	atUserIds)r   rk   atr   r  zreply text failed, error=r
  r   r   r  rn   r  r  rk   r  r  r  r  )r   rk   r   r  r  r  r  r  s           r   
reply_textzChatbotHandler.reply_textj  s     /
 

 4 .>?
 

	M}%5%E-<*.*V*<*<> > >H %MM%%'''' 	 	 	K\!\\]\\]]]44444	 }}s   AA# #
B- BBc                 `   ddd}d||dd|j         gid}	 d}t          j        |j        |t	          j        |          	          }|j        }|                                 n8# t          $ r+}| j	        
                    d
| d|            Y d }~d S d }~ww xY w|                                S )Nr  r  r(  r   )r   rk   r)  )r   r   r*  r   r  zreply markdown failed, error=r
  r+  )	r   r   rk   r   r  r  r  r  r  s	            r   reply_markdownzChatbotHandler.reply_markdown  s   
 /
 

 " 
 .>?	
 	

	M}%5%E-<*.*V*<*<> > >H %MM%%'''' 	 	 	K`a``Q^``aaa44444	 }}s   AA$ $
B. BB	card_datac                 D   | j                                         }|s| j                            d           dS dd|dt	          j                    z  d}|                     |          }d| j         j        j        t          j
        |          i |d}	|j        d	k    r|j        |	d
<   n+|j        dk    r d|j        i}
t          j
        |
          |	d<   |rd|	d         d<   nd|	d         d<   |r/|j        |j        dg}t          j
        |d          |	d         d<    |	j        di | t           dz   }	 d}t#          j        |||	          }|j        }|                                 |S # t*          $ r+}| j                            d| d|            Y d}~dS d}~ww xY w)ut  
        机器人回复互动卡片。由于 sessionWebhook 不支持发送互动卡片，所以需要使用 OpenAPI，当前仅支持自建应用。
        https://open.dingtalk.com/document/orgapp/robots-send-interactive-cards
        :param card_data: 卡片数据内容，interactive_card.py 中有一些简单的样例，高阶需求请至卡片搭建平台：https://card.dingtalk.com/card-builder
        :param incoming_message: 回调数据源
        :param at_sender: 是否at发送人
        :param at_all: 是否at所有人
        :param kwargs: 其他参数，具体可参考文档。
        :return:
        zYsimple_reply_interactive_card_only_for_inner_app failed, cannot get dingtalk access tokenNr  r  r  r  r!  )r#  r   r"  sendOptions	cardBizIdrb   openConversationIdr   rW   singleChatReceiverTr1  atAllF)nickNamerW   )ensure_asciiatUserListJsonz)/v1.0/im/v1.0/robot/interactiveCards/sendr   )r	  r  zreply card failed, error=r
  r2   )r   r  r  r  r  r  _gen_card_idr  r  r  r  rx   ru   r   ro   updater	   r   r  rk   r  r  )r   r/  r   r   r   kwargsr  r  card_biz_idbodysingle_chat_receiveruser_list_jsonr  r  r  r  s                   r   
reply_cardzChatbotHandler.reply_card  sE     +<<>> 	Kkm m m4 /+7\'6889	
 
 ''(899,-8B
9-- %
 
 -44)9)ID%&&/366*:$  *.4H)I)ID%& 	1+/D((+0D( 	c !1 <.> N 59J~\a4b4b4bD 01f'*UU	M}S-<*.0 0 0H %MM%%''' 	 	 	K\!\\]\\]]]22222	s   45E* *
F4 FFr<  c                    | j                                         }|s| j                            d           dS dd|dt	          j                    z  d}|t          j        |          d}t          dz   }	 d	}t          j
        ||t          j        |          
          }|j        }|                                 n># t          $ r1}	| j                            d|	 d|            |j        cY d}	~	S d}	~	ww xY w|                                S )u  
        更新机器人发送互动卡片（普通版）。
        https://open.dingtalk.com/document/orgapp/update-the-robot-to-send-interactive-cards
        :param card_biz_id: 唯一标识一张卡片的外部ID（卡片幂等ID，可用于更新或重复发送同一卡片到多个群会话）。需与 self.reply_card 接口返回的 card_biz_id 保持一致。
        :param card_data: 要更新的卡片数据内容。详情参考卡片搭建平台：https://card.dingtalk.com/card-builder
        :return:
        z4update_card failed, cannot get dingtalk access tokenNr  r  r  r  )r2  r"  z /v1.0/im/robots/interactiveCardsr   r  zupdate card failed, error=r
  )r   r  r  r  r  r  r  r  r	   r   putrk   r  r  r$  )
r   r<  r/  r  r  r  r  r  r  r  s
             r   update_cardzChatbotHandler.update_card  sS    +<<>> 	KTUUU4 /+7\'6889	
 
 %
9--
 
 (*LL
	(M|C,;)-F););= = =H %MM%%'''' 	( 	( 	(K]1]]m]]^^^'''''''	( }}s   5AB< <
C7&C2,C72C7r   c                 $   | j         d| j        d| j        d| j        dt	          t          j                              	}t          j                    }|	                    |
                    d                     |                                S )N_zutf-8)rs   r{   ru   rr   r;   r   r   hashlibsha256r:  encode	hexdigest)r   factorms      r   r9  zChatbotHandler._gen_card_id!  s     MMM3---s/B/B/BCNNNTWX\XbXdXdTeTeTegN	w''((({{}}r   )r   r   FF)r   r   r   )r   r   r   NT)r   r   )r   r   N)FF)r.   r/   r0   r   r;   rj   rh   r   r   dictlistr   r   r   r   r   r   r   r   r   r   r   r   r&  r,  r.  r@  rC  staticmethodr9  __classcell__r   s   @r   r   r   c  s       / / / / / qsDI& &C &> &Z] &jm &'+&=A&Nb& & & &( 0246132424*,-/15( (n (),(.1( ,/( -0	(
 ,0( %(( (+( +/( ;P( ( ( (@ uw;=( (n (PS (bf (nq (%((58(B\( ( ( (. .0.0-/489=( (3A(+.( /3( (+	(
 ),( (+( .2( 37( CY( ( ( (> *,(*& &N &c &#&&"%&/C& & & &( UWBF) )~ )c )%();?)Ka) ) ) ) 0> 0VZ 0 0 0 0N W[    .&.C &.C &. &. &. &.P1 1 1C 1C 1 1 1 1f%3   :!  *8   D &+"'	Q Q"Q%3Q #Q  	Q
 !$Q Q Q Qf&s &t & & & &P .    \    r   r   c                   `     e Zd ZU dZ ed          Zeed<   d
def fdZd Z	de
fd	Z xZS )AsyncChatbotHandleruW   
    多任务执行handler，注意：process函数重载的时候不要用 async
       max_workersasync_executorrU  c                     t          t          |                                            t          |          | _        d S )NrT  )r   rR  r   r
   rV  )r   rU  r   s     r   r   zAsyncChatbotHandler.__init__1  s9    !4((113330[IIIr   c                     t           j        dfS )uQ   
        不要用 async 修饰
        :param message:
        :return:
        znot implement)r   STATUS_NOT_IMPLEMENT)r   messages     r   processzAsyncChatbotHandler.process5  s     .??r   callback_messagec                 
   K    fd} j                             |           t                      }t          j        |_        j        j        |j        _        t          j        |j        _	        d|_
        j        |_        |S )Nc                      	                                 d S # t          $ r6} j                            t	          j                               Y d } ~ d S d } ~ ww xY wr   )r[  r  r  r  	traceback
format_exc)r  r\  r   s    r   funcz-AsyncChatbotHandler.raw_process.<locals>.func>  sq    :-..... : : :!!)"6"8"8999999999:s    
A+AAok)rV  submitr   	STATUS_OKcoder	  rr   r   CONTENT_TYPE_APPLICATION_JSONcontent_typerZ  r$   )r   r\  ra  ack_messages   ``  r   raw_processzAsyncChatbotHandler.raw_process=  s      	: 	: 	: 	: 	: 	: 	""4((( ll%/)9)A)L&+2+P("+0r   )rS  )r.   r/   r0   rX   r
   rV  r<   r   r   r[  r   ri  rO  rP  s   @r   rR  rR  *  s           *<);)J)J)JN&JJJJ JC J J J J J J@ @ @/        r   rR  )r   )%r  r   r  rF  streamr   r   framesr   r   interactive_cardr   utilsr	   concurrent.futuresr
   r   card_instancer   r   r   r   r   r_  objectr   r4   r>   rH   rQ   rZ   rj   r;   r   r   r   rR  r2   r   r   <module>rq     s       4 4 4 4 4 4 4 4 ' ' ' ' ' ' ' ' @ @ @ @ @ @ , , , , , , 1 1 1 1 1 1 6 6 6 6 6 6 6 6 6 6 6 6 6 6        V   8    &   8    6   (    f   *    V   "    &   4n
 n
 n
 n
 n
V n
 n
 n
b' ' 'S '. ' ' ' ''S '^ ' ' ' 'D D D D D_ D D DN" " " " ". " " " " "r   