修复Bot自言自语拦截:不再仅依赖recent_replies,同时检查_replied_texts

根因:Bot自言自语拦截条件为recent_replies不为空,但物理重启后
DB被清空→recent_replies为空→拦截逻辑完全不执行。

修复:构建_self_check_sources列表,合并recent_replies和_replied_texts。
_replied_texts在物理重启时保留(Task #1616),确保拦截逻辑始终有效。
This commit is contained in:
youpaishidifu
2026-08-29 12:20:07 +08:00
parent f0f2c39d71
commit 96388d18f9
+11 -3
View File
@@ -9341,7 +9341,15 @@ class MessageMonitor:
# ⭐ Task #1574 v2:拆行比对——OCR只读bot回复的首行(如"php有2种登陆模式:"),
# 但recent_replies存的是完整多行回复(含表格)。整块比对Jaccard必然低分漏过。
# 修复:把每条bot回复拆成行,逐行比对。策略3新增:子串包含检查。
if len(ts) >= 6 and self._msg_history and recent_replies:
# ⭐ Task #1616 v2:不再仅依赖recent_replies(物理重启后DB清空→为空),
# 同时检查_replied_texts(跨重启持久的bot回复去重集)。
_self_check_sources = list(recent_replies) if recent_replies else []
# 补充:将_replied_texts中的完整回复加入比对源(防止重启后recent_replies为空)
if replied:
for _r in replied:
if _r not in _self_check_sources:
_self_check_sources.append(_r)
if len(ts) >= 6 and self._msg_history and _self_check_sources:
try:
# 归一化函数:去时间戳、去标点空格、去英文
def _norm_self_check(s):
@@ -9353,8 +9361,8 @@ class MessageMonitor:
# CJK骨架提取:连续中文字符序列
sk_ts = ''.join(c for c in ts if '\u4e00' <= c <= '\u9fff')
_self_skip = False
# 与最近5分钟的bot回复做归一化比对
for br in recent_replies:
# 与最近5分钟的bot回复 + _replied_texts做归一化比对
for br in _self_check_sources:
# ⭐ 拆行:把多行回复拆成独立行,逐行比对
# 防止OCR只读首行时被完整回复的长文本"稀释"导致Jaccard不达标
br_lines = [ln.strip() for ln in br.split('\n') if ln.strip()]