fix: 手动停止卡死+配置文件内容误触发自动回复

问题1(Task #1590):手动停止导致GUI卡死
- 根因:gui.py line 791 self.monitor.stop()在GUI主线程执行,线程join卡住时GUI冻结
- 修复:改为后台线程执行(复用_stop_monitor_async)

问题2(Task #1591):配置文件内容"图标: shield"误触发自动回复
- 根因:_core_nouns含"图标"→残片过滤器放行→KB搜索命中sdf1_login→触发回复
- 修复:在_is_noise_text中增加配置文件格式检测(key: value格式,无问号/疑问词时拦截)

验证:正则^[\u4e00-\u9fff]{2,10}\s*[::]\s*\S+$正确匹配配置文件格式,
正常查询(如"图标怎么设置")不会被误拦。

Closes #1590 #1591
This commit is contained in:
youpaishidifu
2026-08-24 16:26:29 +08:00
parent 06d58ee1c1
commit 3c118d3665
2 changed files with 8 additions and 1 deletions
+2 -1
View File
@@ -788,11 +788,12 @@ class MsgBotApp(ctk.CTk):
# 通知OCR管理器:监控已激活,不释放引擎
self._ocr_manager.set_monitor_active(True)
else:
self.monitor.stop()
# ⭐ UI 立即更新;stop() 在后台线程执行,主线程保持响应,不再触发冻结弹窗
self._status_label.configure(text="⏸ 已暂停")
self._log("⏸ 消息监控已暂停")
# 通知OCR管理器:监控已停止,开始计时
self._ocr_manager.set_monitor_active(False)
threading.Thread(target=self._stop_monitor_async, daemon=True, name="gui-toggle-stop").start()
def _browse_kb(self):
path = filedialog.askdirectory(title="选择知识库文件夹")
+6
View File
@@ -7689,6 +7689,12 @@ class MessageMonitor:
_has_subject = any(s in text for s in ('我', '你', '他', '我们', '你们', '他们', '玩家', '用户', '管理员'))
# 无疑问词 + 无动词 或 无疑问词 + 无主语 → 可能是残片
if not _has_question_word and (not _has_verb or not _has_subject):
# ⭐ Task #1591: 配置文件格式检测(如"图标: shield"、"标题: xxx")
# 特征:key: value格式,无问号/疑问词,不是用户查询
_colon_match = re.match(r'^[\u4e00-\u9fff]{2,10}\s*[::]\s*\S+$', text)
if _colon_match:
logger.debug(f"[ocr] 过滤器2结果: 检测到配置文件格式(key: value),返回True: {text!r}")
return True
# ⭐ 核心名词放行:包含核心名词的短文本可能是用户查询词,不视为残片
_core_nouns = {'公告', '更新', '通知', '说明', '规则', '版本', '下载', '安装', '登录', '配置', '设置', '操作', '模式', '列表', '详情', '信息', '内容', '介绍', '功能', '系统', '服务', '玩家', '用户', '管理员', '服务器', '客户端', '插件', '模块', '接口', 'API', 'BUG', '问题', '错误', '异常', '日志', '配置', '文件', '目录', '路径', '地址', '链接', '网址', '网站', '网页', '页面', '界面', '菜单', '按钮', '图标', '图片', '视频', '音频', '文档', '手册', '指南', '教程', '帮助', '支持', '反馈', '建议', '意见', '投诉', '举报', '奖励', '惩罚', '活动', '比赛', '排名', '积分', '等级', '权限', '角色', '职业', '技能', '装备', '道具', '货币', '交易', '市场', '商店', '背包', '仓库', '邮件', '聊天', '组队', '公会', '领地', '地图', '任务', '副本', 'BOSS', '怪物', '掉落', '经验', '属性', '状态', '效果', 'BUFF', 'DEBUFF', '冷却', '消耗', '需求', '条件', '限制'}
if any(noun in text for noun in _core_nouns):