diff --git a/plugins/dify/main.py b/plugins/dify/main.py index edfd400..2951689 100644 --- a/plugins/dify/main.py +++ b/plugins/dify/main.py @@ -135,7 +135,7 @@ class DifyPlugin(MessagePluginInterface): if not query: self.message_util.send_text_msg("请在@我的同时提供问题内容", roomid, sender) - return True, "没有提供问题内容" + return False, "没有提供问题内容" # self.message_util.send_text_msg("⏳AI 正在加油,请稍候… 😊", roomid, sender) @@ -157,12 +157,12 @@ class DifyPlugin(MessagePluginInterface): return True, "发送成功" else: self.message_util.send_text_msg("❌未能获取到回复,请稍后再试", roomid, sender) - return True, "未获取到回复" + return False, "未获取到回复" except Exception as e: self.LOG.error(f"处理Dify聊天请求出错: {e}") self.message_util.send_text_msg(f"❌请求出错:{str(e)}", roomid, sender) - return True, f"处理出错: {e}" + return False, f"处理出错: {e}" # 原有的命令处理逻辑 parts = content.split(" ", 1) @@ -172,7 +172,7 @@ class DifyPlugin(MessagePluginInterface): if len(parts) < 2 or not parts[1].strip(): self.message_util.send_text_msg(f"{self.command_format}", (roomid if roomid else sender), sender) - return True, "命令格式错误" + return False, "命令格式错误" # 检查权限 if roomid and gbm.get_group_permission(roomid, Feature.AI_CAPABILITY) == PermissionStatus.DISABLED: @@ -206,13 +206,13 @@ class DifyPlugin(MessagePluginInterface): else: self.message_util.send_text_msg("❌未能获取到回复,请稍后再试", (roomid if roomid else sender), sender if roomid else "") - return True, "未获取到回复" + return False, "未获取到回复" except Exception as e: self.LOG.error(f"处理Dify聊天请求出错: {e}") self.message_util.send_text_msg(f"❌请求出错:{str(e)}", (roomid if roomid else sender), sender if roomid else "") - return True, f"处理出错: {e}" + return False, f"处理出错: {e}" def _chat_with_dify(self, session_id: str, user_id: str, query: str) -> Optional[str]: """ diff --git a/plugins/douyin_parser/main.py b/plugins/douyin_parser/main.py index 58b6f80..ef3f399 100644 --- a/plugins/douyin_parser/main.py +++ b/plugins/douyin_parser/main.py @@ -122,7 +122,7 @@ class DouyinParserPlugin(MessagePluginInterface): video_info = self._parse_douyin(original_url) if not video_info: print(f"❌无法解析抖音视频信息") - return True, "解析失败" + return False, "解析失败" video_url = video_info.get('video', '') title = video_info.get('title', '无标题') @@ -131,7 +131,7 @@ class DouyinParserPlugin(MessagePluginInterface): if not video_url: print(f"❌无法获取视频地址") - return True, "获取视频地址失败" + return False, "获取视频地址失败" # 根据模式选择发送方式 if self.download_mode == "file": @@ -142,7 +142,7 @@ class DouyinParserPlugin(MessagePluginInterface): return True, "发送视频文件成功" else: print(f"❌下载视频失败") - return True, "下载视频失败" + return False, "下载视频失败" else: # 发送卡片 wcf.send_rich_text( @@ -159,11 +159,11 @@ class DouyinParserPlugin(MessagePluginInterface): except DouyinParserError as e: self.LOG.error(f"抖音解析错误: {e}") print(f"❌抖音解析失败: {str(e)}") - return True, f"解析错误: {e}" + return False, f"解析错误: {e}" except Exception as e: self.LOG.error(f"处理抖音链接出错: {e}\n{traceback.format_exc()}") print(f"❌处理抖音链接出错: {str(e)}") - return True, f"处理出错: {e}" + return False, f"处理出错: {e}" def _clean_url(self, url: str) -> str: """清理URL""" diff --git a/plugins/group_auto_invite/main.py b/plugins/group_auto_invite/main.py index 40f2194..66b945d 100644 --- a/plugins/group_auto_invite/main.py +++ b/plugins/group_auto_invite/main.py @@ -170,12 +170,12 @@ class GroupAutoInvitePlugin(MessagePluginInterface): return True, "邀请发送成功" else: wcf.send_text(f"❌ 邀请发送失败,请稍后再试", sender) - return True, "邀请发送失败" + return False, "邀请发送失败" except Exception as e: self.LOG.error(f"处理加群请求出错: {e}") wcf.send_text(f"❌ 处理加群请求出错: {e}", sender) - return True, f"处理出错: {e}" + return False, f"处理出错: {e}" def add_mapping(self, key, group_id): """添加群组ID到指定key""" diff --git a/plugins/message_summary/main.py b/plugins/message_summary/main.py index b4eaea7..2db8c03 100644 --- a/plugins/message_summary/main.py +++ b/plugins/message_summary/main.py @@ -95,11 +95,11 @@ class MessageSummaryPlugin(MessagePluginInterface): # 直接发送消息 if wcf: wcf.send_text("只支持群聊消息总结", message.get("sender")) - return True, None + return False, None # 权限判断 gbm: GroupBotManager = message.get("gbm") if gbm and gbm.get_group_permission(group_id, Feature.SUMMARY_CAPABILITY) == PermissionStatus.DISABLED: - return True, None + return False, None # 从消息历史中获取群聊记录 all_contacts: dict = message.get("all_contacts") diff --git a/plugins/music/main.py b/plugins/music/main.py index 16ff9c2..0a14134 100644 --- a/plugins/music/main.py +++ b/plugins/music/main.py @@ -97,7 +97,7 @@ class MusicPlugin(MessagePluginInterface): if len(content.split(" ")) == 1: wcf.send_text(f"❌命令格式错误!\n{self.command_format}", (roomid if roomid else sender), sender) - return True, "命令格式错误" + return False, "命令格式错误" # 检查权限 if roomid and gbm.get_group_permission(roomid, Feature.MUSIC) == PermissionStatus.DISABLED: @@ -112,7 +112,7 @@ class MusicPlugin(MessagePluginInterface): if not song_info or not song_info.get("play_url"): wcf.send_text(f"❌未找到歌曲:{user_song_name}", (roomid if roomid else sender), sender) - return True, "未找到歌曲" + return False, "未找到歌曲" # 发送音乐 self._send_music_message(wcf, song_info, roomid or sender) @@ -120,7 +120,7 @@ class MusicPlugin(MessagePluginInterface): except Exception as e: self.LOG.error(f"处理音乐请求出错: {e}") - return True, f"处理出错: {e}" + return False, f"处理出错: {e}" def _search_song(self, song_name: str) -> Dict[str, Any]: """搜索歌曲信息""" diff --git a/plugins/point_trade/main.py b/plugins/point_trade/main.py index 33fcdf1..c1da9a0 100644 --- a/plugins/point_trade/main.py +++ b/plugins/point_trade/main.py @@ -245,7 +245,7 @@ class PointTradePlugin(MessagePluginInterface): if not user_points: wcf.send_text(f"❌未找到你的积分记录!请先参与积分活动[签到,答题/t]。", (roomid if roomid else sender), sender) - return True, "未找到积分记录" + return False, "未找到积分记录" # 获取用户昵称 user_info = self._get_user_record(sender, roomid) diff --git a/plugins/video/main.py b/plugins/video/main.py index 8f7907b..cca2dd2 100644 --- a/plugins/video/main.py +++ b/plugins/video/main.py @@ -111,7 +111,7 @@ class VideoPlugin(MessagePluginInterface): if not file_abspath or not file_abspath.endswith("mp4"): wcf.send_text(f"\n❌视频下载失败,请稍后再试", (roomid if roomid else sender), sender) - return True, "视频下载失败" + return False, "视频下载失败" # 发送视频 result = wcf.send_file(file_abspath, (roomid if roomid else sender)) @@ -122,7 +122,7 @@ class VideoPlugin(MessagePluginInterface): self.LOG.error(f"处理视频请求出错: {e}") wcf.send_text(f"\n❌请求出错:{e}", (roomid if roomid else sender), sender) - return True, f"处理出错: {e}" + return False, f"处理出错: {e}" def _download_stream(self, url, save_path): """ diff --git a/plugins/video_man/main.py b/plugins/video_man/main.py index 8587763..ced35e9 100644 --- a/plugins/video_man/main.py +++ b/plugins/video_man/main.py @@ -111,7 +111,7 @@ class VideoManPlugin(MessagePluginInterface): if not file_abspath: self.message_util.send_text_msg(f"\n❌视频下载失败,请稍后再试", (roomid if roomid else sender), sender) - return True, "视频下载失败" + return False, "视频下载失败" # 发送视频 result = wcf.send_file(file_abspath, (roomid if roomid else sender)) @@ -120,7 +120,7 @@ class VideoManPlugin(MessagePluginInterface): except Exception as e: self.LOG.error(f"处理视频请求出错: {e}") - return True, f"处理出错: {e}" + return False, f"处理出错: {e}" def _download_video(self, api_url): """ diff --git a/plugins/xiuren_image/main.py b/plugins/xiuren_image/main.py index 4b6269c..092ab93 100644 --- a/plugins/xiuren_image/main.py +++ b/plugins/xiuren_image/main.py @@ -108,7 +108,7 @@ class XiurenImagePlugin(MessagePluginInterface): if not pic_path: wcf.send_text(f"❌未找到图片资源", (roomid if roomid else sender), sender) - return True, "未找到图片资源" + return False, "未找到图片资源" # 发送图片 result = wcf.send_file(pic_path, (roomid if roomid else sender)) @@ -117,7 +117,7 @@ class XiurenImagePlugin(MessagePluginInterface): except Exception as e: self.LOG.error(f"处理图片请求出错: {e}") - return True, f"处理出错: {e}" + return False, f"处理出错: {e}" def _get_random_pic(self) -> Optional[str]: """获取随机图片路径""" diff --git a/utils/decorator/plugin_decorators.py b/utils/decorator/plugin_decorators.py index 1d4d562..4dc491b 100644 --- a/utils/decorator/plugin_decorators.py +++ b/utils/decorator/plugin_decorators.py @@ -61,7 +61,7 @@ def plugin_stats_decorator(plugin_name: str) -> Callable: logger.debug(f"[{plugin_name}] 记录插件调用统计") stats_db.record_plugin_call( plugin_name=plugin_name, - command=command, # 使用提取的指令而不是完整内容 + command=command, user_id=sender, group_id=roomid, success=success, @@ -69,6 +69,30 @@ def plugin_stats_decorator(plugin_name: str) -> Callable: ) logger.info(f"[{plugin_name}] 成功记录插件调用: {command}, 耗时: {process_time_ms:.2f}ms") + # 定义不需要记录错误的正常业务状态 + normal_responses = { + "没有权限", + "命令格式错误", + "请先开启功能", + # 可以添加其他正常的业务状态返回 + } + + # 新增:如果业务代码返回失败,且不属于正常业务状态,则记录错误信息 + if not success and response and response not in normal_responses: + logger.debug(f"[{plugin_name}] 业务代码返回失败,记录错误信息: {response}") + try: + stats_db.record_error( + plugin_name=plugin_name, + command=command, + user_id=sender, + group_id=roomid, + error_message=f"业务返回失败: {response}", + stack_trace="业务代码捕获的错误,无堆栈信息" + ) + logger.info(f"[{plugin_name}] 成功记录业务失败信息: {response}") + except Exception as err_record_error: + logger.error(f"[{plugin_name}] 记录业务失败信息出错: {err_record_error}") + return success, response except Exception as e: # 计算执行时间(毫秒) @@ -100,12 +124,13 @@ def plugin_stats_decorator(plugin_name: str) -> Callable: command=command, # 使用提取的指令而不是完整内容 user_id=sender, group_id=roomid, - error_message=error_message, - stack_trace=stack_trace + error_message=error_message[:500] if error_message else "未知错误", # 限制长度并确保不为空 + stack_trace=stack_trace[:2000] if stack_trace else "无堆栈信息" # 限制长度并确保不为空 ) logger.info(f"[{plugin_name}] 成功记录插件错误: {command}, 错误: {error_message}") except Exception as db_error: logger.error(f"[{plugin_name}] 记录插件统计数据失败: {db_error}") + logger.error(traceback.format_exc()) # 重新抛出异常,让上层处理 raise