91 lines
2.9 KiB
Python
91 lines
2.9 KiB
Python
"""NapCat 入站纯文本与二进制辅助。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Mapping
|
|
|
|
import base64
|
|
|
|
from ...types import NapCatSegments
|
|
|
|
|
|
class NapCatInboundTextMixin:
|
|
"""封装入站纯文本与二进制辅助逻辑。"""
|
|
|
|
def build_plain_text(self, raw_message: NapCatSegments) -> str:
|
|
"""从标准消息段中提取可展示的纯文本。
|
|
|
|
Args:
|
|
raw_message: 标准化后的消息段列表。
|
|
|
|
Returns:
|
|
str: 用于 Host 展示和命令判断的纯文本内容。
|
|
"""
|
|
plain_text_parts: list[str] = []
|
|
for item in raw_message:
|
|
if not isinstance(item, Mapping):
|
|
continue
|
|
item_type = str(item.get("type") or "").strip()
|
|
item_data = item.get("data")
|
|
if item_type == "text":
|
|
plain_text_parts.append(str(item_data or ""))
|
|
elif item_type == "at" and isinstance(item_data, Mapping):
|
|
at_target_name = str(
|
|
item_data.get("target_user_cardname")
|
|
or item_data.get("target_user_nickname")
|
|
or item_data.get("target_user_id")
|
|
or ""
|
|
).strip()
|
|
if at_target_name:
|
|
plain_text_parts.append(f"@{at_target_name}")
|
|
elif item_type == "reply":
|
|
plain_text_parts.append("[reply]")
|
|
elif item_type == "forward":
|
|
plain_text_parts.append("[forward]")
|
|
elif item_type in {"image", "emoji", "voice"}:
|
|
plain_text_parts.append(f"[{item_type}]")
|
|
|
|
plain_text = "".join(part for part in plain_text_parts if part).strip()
|
|
return plain_text or "[unsupported]"
|
|
|
|
@staticmethod
|
|
def _encode_binary(binary_data: bytes) -> str:
|
|
"""将二进制内容编码为 Base64 字符串。
|
|
|
|
Args:
|
|
binary_data: 待编码的二进制内容。
|
|
|
|
Returns:
|
|
str: Base64 编码字符串。
|
|
"""
|
|
return base64.b64encode(binary_data).decode("utf-8")
|
|
|
|
@staticmethod
|
|
def _decode_binary(binary_base64: str) -> bytes:
|
|
"""将 Base64 字符串解码为二进制内容。
|
|
|
|
Args:
|
|
binary_base64: Base64 字符串。
|
|
|
|
Returns:
|
|
bytes: 解码后的二进制内容。
|
|
"""
|
|
return base64.b64decode(binary_base64)
|
|
|
|
@staticmethod
|
|
def _normalize_numeric_segment_value(value: Any) -> Any:
|
|
"""将可安全识别的数字字符串转为整数。
|
|
|
|
Args:
|
|
value: 原始字段值。
|
|
|
|
Returns:
|
|
Any: 规范化后的字段值。
|
|
"""
|
|
if isinstance(value, str):
|
|
stripped_value = value.strip()
|
|
if stripped_value.isdigit():
|
|
return int(stripped_value)
|
|
return stripped_value
|
|
return value
|