From b83bb8eb375a7aaadf80b0aaaf46c70c2dde63d7 Mon Sep 17 00:00:00 2001 From: liuwei Date: Thu, 23 Apr 2026 14:16:55 +0800 Subject: [PATCH] =?UTF-8?q?=E9=99=90=E5=88=B6=E6=8B=8D=E4=B8=80=E6=8B=8D?= =?UTF-8?q?=E8=A7=84=E5=88=99=E4=BB=85=E5=9C=A8=E7=94=A8=E6=88=B7=E6=8B=8D?= =?UTF-8?q?=E6=9C=BA=E5=99=A8=E4=BA=BA=E6=9C=AC=E4=BA=BA=E6=97=B6=E8=A7=A6?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增事件解析约束:PAT事件仅当pattedusername等于当前机器人wxid时生效。 2. 用户互拍等非拍机器人场景返回空事件,不再命中拍一拍规则。 3. can_process与process_message统一复用该事件解析结果,避免重复判断不一致。 --- plugins/fun_command_play/main.py | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) 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: