Files
abot/plugins/member_context/main.py
T

167 lines
6.8 KiB
Python

from typing import Dict, Any, Tuple, Optional, List
from base.plugin_common.message_plugin_interface import MessagePluginInterface
from base.plugin_common.plugin_interface import PluginStatus
from plugins.member_context.service import MemberContextService
class MemberContextPlugin(MessagePluginInterface):
"""群成员交互摘要后台插件"""
FEATURE_KEY = "MEMBER_CONTEXT_CAPABILITY"
FEATURE_DESCRIPTION = "🧠 成员交互摘要 [后台AI提取,仅对启用群生效]"
@property
def name(self) -> str:
return "成员交互摘要"
@property
def version(self) -> str:
return "1.0.0"
@property
def description(self) -> str:
return "为群成员生成后台交互摘要,并按群功能开关控制"
@property
def author(self) -> str:
return "ABOT Team"
@property
def commands(self) -> List[str]:
return []
@property
def feature_key(self) -> Optional[str]:
return self.FEATURE_KEY
@property
def feature_description(self) -> Optional[str]:
return self.FEATURE_DESCRIPTION
def __init__(self):
super().__init__()
self.feature = self.register_feature()
self.service: Optional[MemberContextService] = None
def initialize(self, context: Dict[str, Any]) -> bool:
self.LOG.debug(f"正在初始化 {self.name} 插件...")
self.service = MemberContextService(context["db_manager"], self._config)
self.LOG.debug(f"{self.name} 插件初始化完成")
return True
def start(self) -> bool:
self.LOG.debug(f"[{self.name}] 插件已启动")
self.status = PluginStatus.RUNNING
return True
def stop(self) -> bool:
self.LOG.info(f"[{self.name}] 插件已停止")
self.status = PluginStatus.STOPPED
return True
def can_process(self, message: Dict[str, Any]) -> bool:
return False
async def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]:
return False, None
def get_schedule_actions(self) -> List[Dict[str, Any]]:
"""把成员画像日/周/月刷新动作声明给统一调度中心。"""
schedule_cfg = self._config.get("schedule", {}) or {}
refresh_times = schedule_cfg.get("refresh_times", []) or []
weekly_refresh_time = str(schedule_cfg.get("weekly_refresh_time", "") or "").strip()
monthly_refresh_time = str(schedule_cfg.get("monthly_refresh_time", "") or "").strip()
actions: List[Dict[str, Any]] = []
if refresh_times:
actions.append(
{
"action_key": "daily_refresh",
"name": "成员画像日刷新",
"description": "刷新启用群的成员交互摘要(日任务)",
"trigger_type": "at_times",
"trigger_config": {"time_list": refresh_times},
"target_scope": "all_enabled_groups",
"target_config": {},
"payload": {},
"default_enabled": True,
}
)
if weekly_refresh_time:
actions.append(
{
"action_key": "weekly_refresh",
"name": "成员画像周刷新",
"description": "刷新启用群的成员交互摘要(周任务,含周摘要)",
"trigger_type": "every_week_time",
"trigger_config": {"weekday": 6, "time_str": weekly_refresh_time},
"target_scope": "all_enabled_groups",
"target_config": {},
"payload": {},
"default_enabled": True,
}
)
if monthly_refresh_time:
actions.append(
{
"action_key": "monthly_refresh",
"name": "成员画像月刷新",
"description": "刷新启用群的成员交互摘要(月任务,含月摘要)",
"trigger_type": "every_month_last_day_time",
"trigger_config": {"time_str": monthly_refresh_time},
"target_scope": "all_enabled_groups",
"target_config": {},
"payload": {},
"default_enabled": True,
}
)
return actions
async def run_scheduled_action(self, action_key: str, context: Dict[str, Any]) -> Dict[str, Any]:
"""执行成员画像后台调度动作。"""
if not self.service:
return {"success": False, "summary": "服务未初始化", "detail": {}}
if action_key not in {"daily_refresh", "weekly_refresh", "monthly_refresh"}:
return {"success": False, "summary": f"不支持的动作: {action_key}", "detail": {"action_key": action_key}}
# 兼容“指定群执行”的场景;若未指定则沿用全量刷新逻辑。
target_groups = [str(g).strip() for g in (context.get("target_groups") or []) if str(g).strip()]
# 调度层补偿策略:
# 1. 周任务除了补周摘要,也顺手检查月摘要缺口;
# 2. 月任务先补齐缺失周摘要,再继续补月摘要,避免“月摘要依赖周摘要但周摘要没补上”;
# 3. 日任务仍保持轻量,不主动放大到全量周/月补偿。
enable_weekly = action_key in {"weekly_refresh", "monthly_refresh"}
enable_monthly = action_key in {"weekly_refresh", "monthly_refresh"}
try:
if target_groups:
groups = 0
members = 0
skipped = 0
for group_id in target_groups:
result = self.service.refresh_group_contexts(
group_id,
enable_weekly_digest=enable_weekly,
enable_monthly_digest=enable_monthly,
)
if result.get("disabled"):
continue
groups += 1
members += int(result.get("refreshed", 0))
skipped += int(result.get("skipped", 0))
detail = {"groups": groups, "members": members, "skipped": skipped, "targeted": True}
else:
detail = self.service.refresh_all_chatrooms(
enable_weekly_digest=enable_weekly,
enable_monthly_digest=enable_monthly,
)
detail["targeted"] = False
return {
"success": True,
"summary": f"成员画像刷新完成: 群{detail.get('groups', 0)},成员{detail.get('members', 0)}",
"detail": detail,
}
except Exception as e:
return {"success": False, "summary": f"执行异常: {e}", "detail": {"error": str(e)}}