Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox-Core into dev
This commit is contained in:
@@ -9,7 +9,7 @@ from mofox_wire import MessageBuilder, SegPayload, UserInfoPayload
|
|||||||
from src.common.logger import get_logger
|
from src.common.logger import get_logger
|
||||||
from src.plugin_system.apis import config_api
|
from src.plugin_system.apis import config_api
|
||||||
|
|
||||||
from ...event_models import ACCEPT_FORMAT, NoticeType, QQ_FACE, PLUGIN_NAME
|
from ...event_models import ACCEPT_FORMAT, NoticeType, QQ_FACE, PLUGIN_NAME, RealMessageType
|
||||||
from ..utils import get_group_info, get_member_info, get_self_info, get_stranger_info, get_message_detail
|
from ..utils import get_group_info, get_member_info, get_self_info, get_stranger_info, get_message_detail
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
@@ -106,6 +106,10 @@ class NoticeHandler:
|
|||||||
|
|
||||||
case NoticeType.group_msg_emoji_like:
|
case NoticeType.group_msg_emoji_like:
|
||||||
if self._get_config("features.enable_emoji_like", True):
|
if self._get_config("features.enable_emoji_like", True):
|
||||||
|
# 过滤机器人自己贴表情的回声,避免重复动作
|
||||||
|
if str(user_id) == str(self_id):
|
||||||
|
logger.debug("忽略机器人自己贴表情的notice回声")
|
||||||
|
return None
|
||||||
logger.debug("处理群聊表情回复")
|
logger.debug("处理群聊表情回复")
|
||||||
handled_segment, user_info = await self._handle_group_emoji_like_notify(
|
handled_segment, user_info = await self._handle_group_emoji_like_notify(
|
||||||
raw, group_id, user_id
|
raw, group_id, user_id
|
||||||
@@ -328,15 +332,11 @@ class NoticeHandler:
|
|||||||
from ...event_types import NapcatEvent
|
from ...event_types import NapcatEvent
|
||||||
|
|
||||||
target_message = await get_message_detail(raw.get("message_id", ""))
|
target_message = await get_message_detail(raw.get("message_id", ""))
|
||||||
target_message_text = ""
|
if not target_message:
|
||||||
if target_message:
|
|
||||||
target_message_text = target_message.get("raw_message", "")
|
|
||||||
else:
|
|
||||||
logger.error("未找到对应消息")
|
logger.error("未找到对应消息")
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
if len(target_message_text) > 15:
|
target_message_text = await self._extract_message_preview(target_message)
|
||||||
target_message_text = target_message_text[:15] + "..."
|
|
||||||
|
|
||||||
user_info: UserInfoPayload = {
|
user_info: UserInfoPayload = {
|
||||||
"platform": "qq",
|
"platform": "qq",
|
||||||
@@ -367,6 +367,48 @@ class NoticeHandler:
|
|||||||
}
|
}
|
||||||
return seg_data, user_info
|
return seg_data, user_info
|
||||||
|
|
||||||
|
async def _extract_message_preview(self, message_detail: Dict[str, Any], depth: int = 0) -> str:
|
||||||
|
"""提取被表情回应消息的可读摘要,支持多层嵌套"""
|
||||||
|
if depth > 3:
|
||||||
|
return "..."
|
||||||
|
|
||||||
|
preview_parts: List[str] = []
|
||||||
|
for seg in message_detail.get("message", []):
|
||||||
|
seg_type = seg.get("type")
|
||||||
|
seg_data = seg.get("data", {})
|
||||||
|
|
||||||
|
if seg_type == RealMessageType.text:
|
||||||
|
preview_parts.append(seg_data.get("text", ""))
|
||||||
|
elif seg_type == RealMessageType.face:
|
||||||
|
face_id = str(seg_data.get("id", ""))
|
||||||
|
preview_parts.append(QQ_FACE.get(face_id, f"[表情{face_id}]"))
|
||||||
|
elif seg_type == RealMessageType.image:
|
||||||
|
preview_parts.append("[图片]" if seg_data.get("sub_type") == 0 else "[表情包]")
|
||||||
|
elif seg_type == RealMessageType.at:
|
||||||
|
at_name = seg_data.get("text") or seg_data.get("qq") or "未知对象"
|
||||||
|
preview_parts.append(f"@{at_name}")
|
||||||
|
elif seg_type == RealMessageType.reply:
|
||||||
|
reply_id = seg_data.get("id")
|
||||||
|
if reply_id:
|
||||||
|
reply_detail = await get_message_detail(reply_id)
|
||||||
|
nested_preview = await self._extract_message_preview(reply_detail or {}, depth + 1)
|
||||||
|
preview_parts.append(f"[回复:{nested_preview}]")
|
||||||
|
elif seg_type == RealMessageType.forward:
|
||||||
|
preview_parts.append("[转发消息]")
|
||||||
|
elif seg_type == RealMessageType.file:
|
||||||
|
file_name = seg_data.get("file") or seg_data.get("name") or "文件"
|
||||||
|
preview_parts.append(f"[文件:{file_name}]")
|
||||||
|
elif seg_type == RealMessageType.json:
|
||||||
|
preview_parts.append("[卡片消息]")
|
||||||
|
elif seg_type:
|
||||||
|
preview_parts.append(f"[{seg_type}]")
|
||||||
|
|
||||||
|
preview = "".join(preview_parts).strip() or "[消息]"
|
||||||
|
max_length = 60
|
||||||
|
if len(preview) > max_length:
|
||||||
|
preview = preview[:max_length] + "..."
|
||||||
|
return preview
|
||||||
|
|
||||||
async def _handle_group_upload_notify(
|
async def _handle_group_upload_notify(
|
||||||
self, raw: Dict[str, Any], group_id: Any, user_id: Any, self_id: Any
|
self, raw: Dict[str, Any], group_id: Any, user_id: Any, self_id: Any
|
||||||
) -> Tuple[SegPayload | None, UserInfoPayload | None]:
|
) -> Tuple[SegPayload | None, UserInfoPayload | None]:
|
||||||
|
|||||||
Reference in New Issue
Block a user