64 lines
2.9 KiB
Python
64 lines
2.9 KiB
Python
"""NapCat 通知文本渲染器。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from typing import Any, Mapping
|
||
|
||
|
||
class NapCatNoticeTextRenderer:
|
||
"""根据通知载荷生成可读文本。"""
|
||
|
||
def build_notice_text(self, payload: Mapping[str, Any], actor_name: str) -> str:
|
||
"""根据 NapCat 通知事件生成可读文本。
|
||
|
||
Args:
|
||
payload: 原始通知事件。
|
||
actor_name: 事件操作者显示名。
|
||
|
||
Returns:
|
||
str: 生成的可读通知文本。
|
||
"""
|
||
notice_type = str(payload.get("notice_type") or "").strip()
|
||
sub_type = str(payload.get("sub_type") or "").strip()
|
||
target_id = str(payload.get("target_id") or "").strip()
|
||
target_user_id = str(payload.get("user_id") or "").strip()
|
||
is_natural_lift = bool(payload.get("is_natural_lift", False))
|
||
|
||
if notice_type in {"group_recall", "friend_recall"}:
|
||
return f"{actor_name} 撤回了一条消息"
|
||
if notice_type == "notify" and sub_type == "poke":
|
||
target_text = f" -> {target_id}" if target_id else ""
|
||
return f"{actor_name} 发起了戳一戳{target_text}"
|
||
if notice_type == "notify" and sub_type == "group_name":
|
||
return f"{actor_name} 修改了群名称"
|
||
if notice_type == "group_ban" and sub_type == "ban":
|
||
duration = payload.get("duration")
|
||
if target_user_id in {"", "0"}:
|
||
return f"{actor_name} 开启了全体禁言"
|
||
return f"{actor_name} 禁言了用户 {target_user_id},时长 {duration} 秒"
|
||
if notice_type == "group_ban" and sub_type == "whole_lift_ban":
|
||
if is_natural_lift:
|
||
return "群全体禁言已自然解除"
|
||
return f"{actor_name} 解除了全体禁言"
|
||
if notice_type == "group_ban" and sub_type == "lift_ban":
|
||
if is_natural_lift:
|
||
return f"用户 {target_user_id} 的禁言已自然解除"
|
||
return f"{actor_name} 解除了用户 {target_user_id} 的禁言"
|
||
if notice_type == "group_upload":
|
||
file_info = payload.get("file", {})
|
||
file_name = ""
|
||
if isinstance(file_info, Mapping):
|
||
file_name = str(file_info.get("name") or "").strip()
|
||
return f"{actor_name} 上传了文件{f':{file_name}' if file_name else ''}"
|
||
if notice_type == "group_increase":
|
||
return f"{actor_name} 加入了群聊"
|
||
if notice_type == "group_decrease":
|
||
return f"{actor_name} 离开了群聊"
|
||
if notice_type == "group_admin":
|
||
return f"{actor_name} 的群管理员状态发生变化"
|
||
if notice_type == "essence":
|
||
return f"{actor_name} 触发了精华消息事件"
|
||
if notice_type == "group_msg_emoji_like":
|
||
return f"{actor_name} 给一条消息添加了表情回应"
|
||
return f"[notice] {notice_type}.{sub_type}".strip(".")
|