ForcePilot/backend/package/yuxi/channel/extensions/intercom/monitor.py

55 lines
1.8 KiB
Python
Raw Normal View History

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