(messageId, selfId)
| 5545 | } |
| 5546 | |
| 5547 | async function fetchOneBotMessage(messageId, selfId) { |
| 5548 | if (!messageId) return null; |
| 5549 | const response = await fetch(`${oneBotApiBase}/get_msg`, { |
| 5550 | method: "POST", |
| 5551 | headers: { "content-type": "application/json" }, |
| 5552 | body: JSON.stringify({ message_id: Number(messageId) }) |
| 5553 | }); |
| 5554 | const body = await response.json().catch(() => ({})); |
| 5555 | if (!response.ok || body.status !== "ok" || !body.data) { |
| 5556 | throw new Error(`Unable to fetch quoted QQ message ${messageId}`); |
| 5557 | } |
| 5558 | |
| 5559 | const data = body.data; |
| 5560 | const senderId = data.user_id == null ? undefined : String(data.user_id); |
| 5561 | const segments = Array.isArray(data.message) ? data.message : []; |
| 5562 | const forwardSegment = segments.find((segment) => segment?.type === "forward"); |
| 5563 | const textFromSegments = segments |
| 5564 | .filter((segment) => segment?.type === "text") |
| 5565 | .map((segment) => segment.data?.text ?? "") |
| 5566 | .join("") |
| 5567 | .trim(); |
| 5568 | const forwardContext = forwardSegment?.data?.id |
| 5569 | ? await fetchOneBotForwardContent(forwardSegment.data.id).catch(() => null) |
| 5570 | : null; |
| 5571 | const images = dedupeQqImages([ |
| 5572 | ...extractOneBotImageInputs(data), |
| 5573 | ...((forwardContext?.images) || []) |
| 5574 | ]); |
| 5575 | return { |
| 5576 | messageId: String(data.message_id ?? messageId), |
| 5577 | senderId, |
| 5578 | senderName: data.sender?.card || data.sender?.nickname || senderId || "群友", |
| 5579 | text: forwardContext?.text |
| 5580 | ? `[合并转发]\n${forwardContext.text}` |
| 5581 | : (data.raw_message || textFromSegments), |
| 5582 | images, |
| 5583 | isSelf: selfId != null && senderId === String(selfId), |
| 5584 | raw: data |
| 5585 | }; |
| 5586 | } |
| 5587 | |
| 5588 | async function fetchOneBotForwardContent(forwardId) { |
| 5589 | const response = await fetch(`${oneBotApiBase}/get_forward_msg`, { |
no test coverage detected