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
|