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

64 lines
2.1 KiB
Python
Raw Normal View History

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)