
    `gj4                        d Z ddlZddlZddlZddlmZmZmZ  ej                  e	      Z
 ej                         Zd Zd Zd Zd>dZdZd	d
dddddddddddddddddddddgddZdedefdZd Zd!d"dddddd#ddddddd$dddddd%dd&gddZdedefd'Zd Zd(d)dddddd*ddd+dddddd,g d-ddZdedefd.Zd/Zd0d1dddddd2dddddd3dd4gddZdedefd5Z ej>                  d	d6eeeg dd7d89	        ej>                  d!d6eeeg dd:d89	        ej>                  d(d6eeeg dd;d<9	        ej>                  d0d6eeeg dd=d<9	       y)?a  Feishu Drive Tools -- document comment operations via Feishu/Lark API.

Provides tools for listing, replying to, and adding document comments.
Uses the same lazy-import + BaseRequest pattern as feishu_comment.py.
The lark client is injected per-thread by the comment event handler.
    N)registry
tool_errortool_resultc                     | t         _        y)zFStore a lark client for the current thread (called by feishu_comment).N)_localclient)r   s    J/root/.hermes/venv/lib/python3.12/site-packages/tools/feishu_drive_tool.py
set_clientr
      s	    FM    c                  $    t        t        dd      S )z7Return the lark client for the current thread, or None.r   N)getattrr    r   r	   
get_clientr      s    68T**r   c                  p    dd l } 	 | j                  j                  d      d uS # t        t        f$ r Y yw xY w)Nr   	lark_oapiF)importlib.utilutil	find_specImportError
ValueError)	importlibs    r	   _check_feishur      s=     ~~''4D@@$ s   # 55c                 4   ddl m} ddlm} ddlm} |dk(  r|j                  n|j                  }	|j                         j                  |	      j                  |      j                  |j                  h      }
|r|
j                  |      }
|r|
j                  |      }
||
j                  |      }
|
j!                         }| j#                  |      }t%        |dd      }t%        |dd	      }i }t%        |d
d      }|r>t'        |d      r2	 t)        j*                  |j,                        }|j/                  di       }|s9t%        |dd      }t5        |t6              r|}n|rt'        |d      rt9        |      }|||fS # t(        j0                  t2        f$ r Y [w xY w)z?Build and execute a BaseRequest, return (code, msg, data_dict).r   )AccessTokenType)
HttpMethod)BaseRequestGETNcodemsg rawcontentdata__dict__)r   r   lark_oapi.core.enumr   !lark_oapi.core.model.base_requestr   r   POSTbuilderhttp_methoduritoken_typesTENANTpathsqueriesbodybuildrequestr   hasattrjsonloadsr"   getJSONDecodeErrorAttributeError
isinstancedictvars)r   methodr*   r-   r.   r/   r   r   r   r)   r(   r1   responser   r   r#   r!   	body_json	resp_datas                      r	   _do_requestr?   (   sr   ).=$*eO*..K 		[	!	S	o,,-	.	  --&//'*,,t$mmoG ~~g&H8VT*D
(E2
&C D
(E4
(C
wsI&	

3;;/I==,D Hfd3	i&D79j9	?Dd? $$n5 		s   
1E; ;FFz./open-apis/drive/v1/files/:file_token/commentsfeishu_drive_list_commentsz[List comments on a Feishu document. Use is_whole=true to list whole-document comments only.objectstringzThe document file token.)typedescriptionzFile type (default: docx).docx)rC   rD   defaultbooleanz-If true, only return whole-document comments.Fintegerz&Number of comments per page (max 100).d   zPagination token for next page.)
file_token	file_typeis_whole	page_size
page_tokenrJ   )rC   
propertiesrequired)namerD   
parametersargsreturnc                    t               }|t        d      S | j                  dd      j                         }|st        d      S | j                  dd      xs d}| j                  dd      }| j                  d	d
      }| j                  dd      }d|fdd	t	        |      fg}|r|j                  d       |r|j                  d|f       t        |dt        d|i|      \  }	}
}|	dk7  rt        d|	 d|
       S t        |      S )NFeishu client not availablerJ   r    zfile_token is requiredrK   rE   rL   FrM   rI   rN   user_id_typeopen_id)rL   truer   r-   r.   r   zList comments failed: code= msg=)	r   r   r5   stripstrappendr?   _LIST_COMMENTS_URIr   )rS   kwargsr   rJ   rK   rL   rM   rN   r.   r   r   r#   s               r	   _handle_list_commentsrb      s   \F~788,+113J233f-7Ixx
E*Hc*I,+J 
i #	c)n%G
 +,j12!)Z(OD#t
 qy7vU3%HIItr   zB/open-apis/drive/v1/files/:file_token/comments/:comment_id/replies!feishu_drive_list_comment_repliesz:List all replies in a comment thread on a Feishu document.z#The comment ID to list replies for.z%Number of replies per page (max 100).)rJ   
comment_idrK   rM   rN   rd   c                    t               }|t        d      S | j                  dd      j                         }| j                  dd      j                         }|r|st        d      S | j                  dd      xs d}| j                  dd	      }| j                  d
d      }d|fddt	        |      fg}|r|j                  d
|f       t        |dt        ||d|      \  }	}
}|	dk7  rt        d|	 d|
       S t        |      S )NrV   rJ   r    rd   z&file_token and comment_id are requiredrK   rE   rM   rI   rN   rW   r   rJ   rd   r[   r   zList replies failed: code=r\   )	r   r   r5   r]   r^   r_   r?   _LIST_REPLIES_URIr   )rS   ra   r   rJ   rd   rK   rM   rN   r.   r   r   r#   s               r	   _handle_list_repliesrh      s   \F~788,+113J,+113JZBCCf-7Ic*I,+J 
i #	c)n%G
 j12!('zBOD#t
 qy6tfE#GHHtr   feishu_drive_reply_commentzReply to a local comment thread on a Feishu document. Use this for local (quoted-text) comments. For whole-document comments, use feishu_drive_add_comment instead.zThe comment ID to reply to.z6The reply text content (plain text only, no markdown).)rJ   rd   r"   rK   )rJ   rd   r"   c                    t               }|t        d      S | j                  dd      j                         }| j                  dd      j                         }| j                  dd      j                         }|r|r|st        d      S | j                  dd      xs d}dd	d
d|idgii}t	        |dt
        ||dd|fg|      \  }}	}
|dk7  rt        d| d|	       S t        d|
      S )NrV   rJ   r    rd   r"   z0file_token, comment_id, and content are requiredrK   rE   elementstext_runtext)rC   rl   r'   rf   )r-   r.   r/   r   zReply comment failed: code=r\   Tsuccessr#   )r   r   r5   r]   r?   _REPLY_COMMENT_URIr   )rS   ra   r   rJ   rd   r"   rK   r/   r   r   r#   s              r	   _handle_reply_commentrq     s   \F~788,+113J,+113Jhhy"%++-GZwLMMf-7I 	&!' 1
	D "*'zBy)*	OD#t qy7vU3%HIIt$//r   z2/open-apis/drive/v1/files/:file_token/new_commentsfeishu_drive_add_commentzAdd a new whole-document comment on a Feishu document. Use this for whole-document comments or as a fallback when reply_comment fails with code 1069302.z8The comment text content (plain text only, no markdown).)rJ   r"   rK   r"   c                    t               }|t        d      S | j                  dd      j                         }| j                  dd      j                         }|r|st        d      S | j                  dd      xs d}|d|d	gd
}t	        |dt
        d|i|      \  }}}	|dk7  rt        d| d|       S t        d|	      S )NrV   rJ   r    r"   z#file_token and content are requiredrK   rE   rm   )rC   rm   )rK   reply_elementsr'   )r-   r/   r   zAdd comment failed: code=r\   Trn   )r   r   r5   r]   r?   _ADD_COMMENT_URIr   )
rS   ra   r   rJ   r"   rK   r/   r   r   r#   s
             r	   _handle_add_commentrv   _  s    \F~788,+113Jhhy"%++-GW?@@f-7I W-
D "(Z(OD#t
 qy5dV5FGGt$//r   feishu_drivezList document commentsu   💬)	rQ   toolsetschemahandlercheck_fnrequires_envis_asyncrD   emojizList comment replieszReply to a document commentu   ✉️zAdd a whole-document comment)NNN) __doc__r3   logging	threadingtools.registryr   r   r   	getLogger__name__loggerlocalr   r
   r   r   r?   r`   !FEISHU_DRIVE_LIST_COMMENTS_SCHEMAr9   r^   rb   rg    FEISHU_DRIVE_LIST_REPLIES_SCHEMArh   rp   FEISHU_DRIVE_REPLY_SCHEMArq   ru   FEISHU_DRIVE_ADD_COMMENT_SCHEMArv   registerr   r   r	   <module>r      s      < <			8	$ 
	
+
.j F  )	B  !9
 !;! "N  "G !@)
2 "N7#% !L   3  N Y  0O !9
 !D
 !;! "F !@'
0 "<05$  Dt # J Z  )	M
  !9
 !<
 !W
 !;!
& <+ B!0 !03 !0P H  '	1
  !9
 !Y
 !;!
 "9-## :0d 0 0D   	%,!(

   	,+ &

   	%$!-

   	#*.

r   