限制拍一拍规则仅在用户拍机器人本人时触发

1. 新增事件解析约束:PAT事件仅当pattedusername等于当前机器人wxid时生效。

2. 用户互拍等非拍机器人场景返回空事件,不再命中拍一拍规则。

3. can_process与process_message统一复用该事件解析结果,避免重复判断不一致。
This commit is contained in:
liuwei
2026-04-23 14:16:55 +08:00
parent 45518cdccf
commit b83bb8eb37

View File

@@ -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):
# 先做一次匹配并塞入 messageprocess_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: