限制拍一拍规则仅在用户拍机器人本人时触发
1. 新增事件解析约束:PAT事件仅当pattedusername等于当前机器人wxid时生效。 2. 用户互拍等非拍机器人场景返回空事件,不再命中拍一拍规则。 3. can_process与process_message统一复用该事件解析结果,避免重复判断不一致。
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user