ForcePilot/backend/package/yuxi/channels/adapters/feishu/comment_handler.py

81 lines
2.4 KiB
Python
Raw Normal View History

from __future__ import annotations
from typing import Any
from yuxi.channels.models import (
ChannelIdentity,
ChannelMessage,
ChannelType,
ChatType,
EventType,
MessageType,
)
def handle_comment_event(
channel_id: str,
channel_type: ChannelType,
raw_payload: dict[str, Any],
bot_open_id: str = "",
) -> ChannelMessage | None:
event = raw_payload.get("event", {})
comment = event.get("comment", {})
if not comment:
return None
comment_id = comment.get("comment_id", "") or event.get("comment_id", "")
content = comment.get("content", {}) or {}
comment_text = _extract_comment_text(content)
commenter = comment.get("commenter", {}) or event.get("commenter", {}) or {}
commenter_id = commenter.get("open_id", "") or commenter.get("user_id", "")
doc_info = event.get("doc", {}) or {}
doc_name = doc_info.get("name", "") or event.get("doc_name", "")
doc_url = doc_info.get("url", "") or event.get("doc_url", "")
doc_type = doc_info.get("type", "") or event.get("doc_type", "doc")
full_content = "[文档评论] "
if doc_name:
full_content += f"{doc_name}"
if doc_url:
full_content += f" ({doc_url})"
full_content += f"\n{comment_text}"
return ChannelMessage(
identity=ChannelIdentity(
channel_id=channel_id,
channel_type=channel_type,
channel_user_id=commenter_id,
channel_chat_id=f"comment_{comment_id}",
channel_message_id=comment_id,
),
event_type=EventType.SYSTEM_EVENT,
message_type=MessageType.TEXT,
chat_type=ChatType.DIRECT,
content=full_content,
metadata={
"event_subtype": "drive_comment",
"doc_name": doc_name,
"doc_url": doc_url,
"doc_type": doc_type,
"comment_id": comment_id,
"commenter_id": commenter_id,
},
)
def _extract_comment_text(content: dict[str, Any]) -> str:
elements = content.get("elements", [])
if not elements:
return content.get("text", "")
parts: list[str] = []
for elem in elements:
if isinstance(elem, str):
parts.append(elem)
continue
text = elem.get("textRun", {}).get("text", "") or elem.get("text", "")
if text:
parts.append(text)
return "".join(parts)