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