import json import logging from datetime import datetime, UTC from yuxi.channel.extensions.jd.types import InboundJDMessage from yuxi.channel.message.models import MessageType, PeerInfo, UnifiedMessage from yuxi.channel.routing.models import PeerKind logger = logging.getLogger(__name__) class JDMonitor: def convert_to_unified(self, msg: InboundJDMessage) -> UnifiedMessage: msg_type = MessageType.TEXT if msg.msg_type == 2: msg_type = MessageType.IMAGE content = self._extract_content(msg) return UnifiedMessage( msg_id=msg.msg_id, channel_type="jd", account_id="default", content=content, message_type=msg_type, sender=PeerInfo( id=msg.from_id, kind=PeerKind.DIRECT, display_name=msg.from_id, ), timestamp=self._parse_timestamp(msg.msg_time), raw_payload=msg.raw, body_for_agent=content, metadata={ "chat_id": msg.chat_id, "to_id": msg.to_id, "from_type": msg.from_type, "extend": msg.extend, }, ) def _extract_content(self, msg: InboundJDMessage) -> str: if msg.msg_type in (2, 3, 4): try: data = json.loads(msg.content) if msg.msg_type == 2: return data.get("url", msg.content) if msg.msg_type == 3: return f"{data.get('text', '')}\n{data.get('url', '')}" if msg.msg_type == 4: return f"[商品卡片] {data.get('pid', '')}\n{data.get('url', '')}" except (json.JSONDecodeError, TypeError): return msg.content return msg.content def _parse_timestamp(self, msg_time: str) -> datetime | None: try: dt = datetime.strptime(msg_time, "%Y-%m-%d %H:%M:%S") return dt.replace(tzinfo=UTC) except (ValueError, TypeError): import time return datetime.fromtimestamp(time.time(), tz=UTC)