diff --git a/plugins/fun_command_play/main.py b/plugins/fun_command_play/main.py index 512c7b8..65be61a 100644 --- a/plugins/fun_command_play/main.py +++ b/plugins/fun_command_play/main.py @@ -414,7 +414,7 @@ class FunCommandPlayPlugin(MessagePluginInterface): scope_type, scope_id, _ = self._normalize_scope(message) content = str(message.get("content", "") or "").strip() - event_key = self._extract_event_key(message) + event_key, _ = self._resolve_effective_event(message) session_key = scope_id or str(message.get("sender", "") or "") return self.rule_service.match_rule( @@ -425,6 +425,30 @@ class FunCommandPlayPlugin(MessagePluginInterface): session_key=session_key, ) + def _resolve_current_wxid(self, message: Dict[str, Any]) -> str: + """解析当前机器人 wxid。""" + # 优先使用已注入的 self.bot(主流程),没有则回退 message['bot'](兜底)。 + bot_obj = self.bot if getattr(self, "bot", None) else message.get("bot") + return str(getattr(bot_obj, "wxid", "") or "").strip() + + def _resolve_effective_event(self, message: Dict[str, Any]) -> Tuple[str, Dict[str, str]]: + """解析最终可用事件。 + + 关键约束: + - 对于拍一拍(PAT),仅当“被拍者是机器人自己”才返回 PAT。 + - 其他拍一拍场景(用户拍用户)返回空事件,避免误触发规则。 + """ + pat_meta = self._parse_pat_event_meta(message) + if pat_meta.get("event_key") == "PAT": + current_wxid = self._resolve_current_wxid(message) + patted_username = str(pat_meta.get("pat_pattedusername", "") or "").strip() + if current_wxid and patted_username and patted_username == current_wxid: + return "PAT", pat_meta + return "", {} + + # 非结构化 PAT 场景走原有兜底识别。 + return self._extract_event_key(message), {} + def can_process(self, message: Dict[str, Any]) -> bool: """判断是否可处理。 @@ -455,9 +479,9 @@ class FunCommandPlayPlugin(MessagePluginInterface): # 先做一次匹配并塞入 message,process_message 阶段直接复用,减少重复计算。 matched_rule = self._find_match_rule(message) if matched_rule: - event_meta = self._parse_pat_event_meta(message) + event_key, event_meta = self._resolve_effective_event(message) message["_fun_rule_match"] = matched_rule - message["_fun_event_key"] = str(event_meta.get("event_key") or self._extract_event_key(message)) + message["_fun_event_key"] = str(event_key or "") message["_fun_event_meta"] = event_meta return True return False @@ -548,7 +572,7 @@ class FunCommandPlayPlugin(MessagePluginInterface): event_key = str(message.get("_fun_event_key", "") or "") event_meta = message.get("_fun_event_meta") if not isinstance(event_meta, dict): - event_meta = self._parse_pat_event_meta(message) + _, event_meta = self._resolve_effective_event(message) context = self._build_message_context(message, event_key=event_key, event_meta=event_meta) try: