Files

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