From 09a17e5c121c67084d457c0616a550524ce521d6 Mon Sep 17 00:00:00 2001 From: ikun-11451 <334495606@qq.com> Date: Fri, 3 Oct 2025 20:21:56 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=90=8E?= =?UTF-8?q?=E7=AB=AFapi=E5=96=B5~?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/__init__.py | 1 + src/api/message_router.py | 13 +++++++++++++ src/main.py | 10 ++++++++++ 3 files changed, 24 insertions(+) create mode 100644 src/api/__init__.py create mode 100644 src/api/message_router.py diff --git a/src/api/__init__.py b/src/api/__init__.py new file mode 100644 index 000000000..359eff96e --- /dev/null +++ b/src/api/__init__.py @@ -0,0 +1 @@ +# This file makes src/api a Python package. \ No newline at end of file diff --git a/src/api/message_router.py b/src/api/message_router.py new file mode 100644 index 000000000..5a2dd2d0a --- /dev/null +++ b/src/api/message_router.py @@ -0,0 +1,13 @@ +from fastapi import APIRouter +from src.plugin_system.apis import message_api + +router = APIRouter() + +@router.get("/messages/recent") +async def get_recent_messages(chat_id: str, limit: int = 10): + """ + 获取最近的聊天记录 + """ + # 假设 message_api.get_recent_messages 是一个异步函数 + messages = await message_api.get_recent_messages(chat_id=chat_id, limit=limit) + return {"chat_id": chat_id, "messages": messages} \ No newline at end of file diff --git a/src/main.py b/src/main.py index 68d8e0801..8236f7472 100644 --- a/src/main.py +++ b/src/main.py @@ -245,6 +245,16 @@ MoFox_Bot(第三方修改版) # start_api_server() # logger.info("API服务器启动成功") + # 注册API路由 + try: + from src.api.message_router import router as message_router + self.server.register_router(message_router, prefix="/api") + logger.info("API路由注册成功") + except ImportError as e: + logger.error(f"导入API路由失败: {e}") + except Exception as e: + logger.error(f"注册API路由时发生错误: {e}") + # 加载所有actions,包括默认的和插件的 plugin_manager.load_all_plugins() From 19c37280d489ab2e67587cc85557afec20506925 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Fri, 3 Oct 2025 20:43:07 +0800 Subject: [PATCH 2/5] =?UTF-8?q?feat(api):=20=E6=96=B0=E5=A2=9E=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=BB=9F=E8=AE=A1API=E7=AB=AF=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将原有的获取最近消息的API替换为功能更强大的消息统计API。 新的 `/messages/recent` 端点允许按天数和消息类型(发送、接收或全部)查询机器人的消息数量统计。 - 支持 `days` 和 `message_type` 查询参数。 - 实现统计逻辑,区分机器人发送和接收的消息。 - 增加异常处理,提高API的健壮性。 --- src/api/message_router.py | 47 ++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/src/api/message_router.py b/src/api/message_router.py index 5a2dd2d0a..687f48f1e 100644 --- a/src/api/message_router.py +++ b/src/api/message_router.py @@ -1,13 +1,48 @@ -from fastapi import APIRouter +import time +from typing import Literal + +from fastapi import APIRouter, HTTPException, Query + +from src.config.config import global_config from src.plugin_system.apis import message_api router = APIRouter() @router.get("/messages/recent") -async def get_recent_messages(chat_id: str, limit: int = 10): +async def get_message_stats( + days: int = Query(1, ge=1, description="指定查询过去多少天的数据"), + message_type: Literal["all", "sent", "received"] = Query("all", description="筛选消息类型: 'sent' (BOT发送的), 'received' (BOT接收的), or 'all' (全部)") +): """ - 获取最近的聊天记录 + 获取BOT在指定天数内的消息统计数据。 """ - # 假设 message_api.get_recent_messages 是一个异步函数 - messages = await message_api.get_recent_messages(chat_id=chat_id, limit=limit) - return {"chat_id": chat_id, "messages": messages} \ No newline at end of file + try: + end_time = time.time() + start_time = end_time - (days * 24 * 3600) + + messages = await message_api.get_messages_by_time(start_time, end_time) + + sent_count = 0 + received_count = 0 + bot_qq = str(global_config.bot.qq_account) + + for msg in messages: + if msg.get("user_id") == bot_qq: + sent_count += 1 + else: + received_count += 1 + if message_type == "sent": + return {"days": days, "message_type": message_type, "count": sent_count} + elif message_type == "received": + return {"days": days, "message_type": message_type, "count": received_count} + else: + return { + "days": days, + "message_type": message_type, + "sent_count": sent_count, + "received_count": received_count, + "total_count": len(messages) + } + + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) From 46478d7c149ce0dfc3b9b035c6f9f5189771c869 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Fri, 3 Oct 2025 20:47:02 +0800 Subject: [PATCH 3/5] =?UTF-8?q?feat(proactive=5Fthinker):=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E9=98=B2=E5=88=B7=E5=B1=8F=E5=86=B3=E7=AD=96=E5=8E=9F?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在主动思考的决策原则中增加了一条新规则。 如果群聊的上下文中只有AI自己的消息而没有其他人的回应,AI也许将选择不回复,以避免刷屏。 --- .../built_in/proactive_thinker/proactive_thinker_executor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/built_in/proactive_thinker/proactive_thinker_executor.py b/src/plugins/built_in/proactive_thinker/proactive_thinker_executor.py index ea5187f1f..166837340 100644 --- a/src/plugins/built_in/proactive_thinker/proactive_thinker_executor.py +++ b/src/plugins/built_in/proactive_thinker/proactive_thinker_executor.py @@ -288,6 +288,7 @@ class ProactiveThinkerExecutor: # 决策原则 - **避免打扰**: 如果你最近(尤其是在最近的几次决策中)已经主动发起过对话,请倾向于选择“不回复”,除非有非常重要和紧急的事情。 +- **如果上下文中只有你的消息而没有别人的消息**:选择不回复,以防刷屏或者打扰到别人虽然第一 --- From 0e2182efa624e6983692b869c339bed54b63495f Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Fri, 3 Oct 2025 21:05:59 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=8A=A8=E4=B8=80=E4=B8=8Bmanifest?= =?UTF-8?q?=E4=BB=A5=E9=98=B2=E5=8A=A0=E8=BD=BD=E7=9A=84=E6=97=B6=E5=80=99?= =?UTF-8?q?=E8=A2=AB=E7=94=A8=E6=88=B7=E7=9C=8B=E7=AC=91=E8=AF=9D()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/built_in/proactive_thinker/_manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/built_in/proactive_thinker/_manifest.json b/src/plugins/built_in/proactive_thinker/_manifest.json index 0ad67e293..30f2a138e 100644 --- a/src/plugins/built_in/proactive_thinker/_manifest.json +++ b/src/plugins/built_in/proactive_thinker/_manifest.json @@ -12,7 +12,7 @@ "host_application": { "min_version": "0.10.0" }, - "keywords": ["emoji", "reaction", "like", "表情", "回应", "点赞"], + "keywords": ["主动思考","自己发消息"], "categories": ["Chat", "Integration"], "default_locale": "zh-CN", From c46a31a7c40db2ebe2f8ff64fe5c8d7451b92f54 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Fri, 3 Oct 2025 21:17:50 +0800 Subject: [PATCH 5/5] =?UTF-8?q?refactor(express):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E5=88=9B=E5=BB=BA=E7=9A=84=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 `try-except` 块移至循环外部,以减少重复的异常处理代码。这样可以更清晰地处理在创建多个目录过程中可能发生的任何错误,同时保持代码的简洁性。 --- src/chat/express/expression_learner.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/chat/express/expression_learner.py b/src/chat/express/expression_learner.py index f9e0e68af..517204351 100644 --- a/src/chat/express/expression_learner.py +++ b/src/chat/express/expression_learner.py @@ -511,11 +511,11 @@ class ExpressionLearnerManager: os.path.join(base_dir, "learnt_grammar"), ] - for directory in directories_to_create: - try: + try: + for directory in directories_to_create: os.makedirs(directory, exist_ok=True) - logger.debug(f"确保目录存在: {directory}") - except Exception as e: + logger.debug(f"确保目录存在: {directory}") + except Exception as e: logger.error(f"创建目录失败 {directory}: {e}") @staticmethod