新增 Intercom 渠道扩展,支持在 Yuxi 平台中集成 Intercom 客服渠道。 包含以下功能模块: - client: Intercom API 客户端封装 - config: 渠道配置管理 - gateway: SSE/WebSocket 网关接入 - webhook: Webhook 事件处理 - streaming: 流式消息处理 - format: 消息格式转换 - outbound: 外发消息管理 - handoff: 转人工会话切换 - pairing: 用户配对与绑定 - security: 安全签名校验 - dedupe: 消息去重 - monitor: 渠道状态监控 - status: 会话状态管理 - session_guard: 会话防护 - types: 类型定义
55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
import logging
|
|
|
|
from yuxi.channel.extensions.intercom.format import html_to_text
|
|
from yuxi.channel.extensions.intercom.types import IntercomInboundEvent, IntercomAdminIdentity
|
|
from yuxi.channel.message.models import GroupContext, MessageType, PeerInfo, UnifiedMessage
|
|
from yuxi.channel.routing.models import PeerKind
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class IntercomMonitor:
|
|
|
|
@staticmethod
|
|
def is_echo(event: IntercomInboundEvent, identity: IntercomAdminIdentity) -> bool:
|
|
return event.author_type in ("admin", "bot") and event.author_id == identity.admin_id
|
|
|
|
@staticmethod
|
|
def convert_event(
|
|
event: IntercomInboundEvent,
|
|
account_id: str,
|
|
) -> UnifiedMessage | None:
|
|
body_text = html_to_text(event.body_html)
|
|
if not body_text and not event.attachments:
|
|
return None
|
|
|
|
message_type = _detect_type(event)
|
|
|
|
return UnifiedMessage(
|
|
msg_id=f"intercom:{event.message_id}",
|
|
channel_type="intercom",
|
|
account_id=account_id,
|
|
content=body_text,
|
|
sender=PeerInfo(
|
|
kind=PeerKind.DIRECT,
|
|
id=event.author_id,
|
|
display_name=event.author_name,
|
|
),
|
|
message_type=message_type,
|
|
group=GroupContext(id=event.conversation_id),
|
|
raw_payload=event.raw,
|
|
timestamp=event.created_at if event.created_at else None,
|
|
)
|
|
|
|
|
|
def _detect_type(event: IntercomInboundEvent) -> MessageType:
|
|
if event.attachments:
|
|
for att in event.attachments:
|
|
content_type = att.get("content_type", "")
|
|
if content_type.startswith("image/"):
|
|
return MessageType.IMAGE
|
|
if content_type.startswith("video/"):
|
|
return MessageType.VIDEO
|
|
return MessageType.FILE
|
|
return MessageType.TEXT
|