From 09c6500d792ace236611a5ded8d2741c2fe48887 Mon Sep 17 00:00:00 2001 From: tcmofashi Date: Tue, 25 Mar 2025 22:14:39 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=BC=80=E5=A7=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.py | 138 ++++++++++++++++++++++++++++++++++++++++ src/plugins/chat/api.py | 54 ++++++++++++++++ 2 files changed, 192 insertions(+) create mode 100644 src/main.py create mode 100644 src/plugins/chat/api.py diff --git a/src/main.py b/src/main.py new file mode 100644 index 000000000..c32800dcc --- /dev/null +++ b/src/main.py @@ -0,0 +1,138 @@ +import asyncio +import time +from datetime import datetime + +from plugins.utils.statistic import LLMStatistics +from plugins.moods.moods import MoodManager +from plugins.schedule.schedule_generator import bot_schedule +from plugins.chat.emoji_manager import emoji_manager +from plugins.chat.relationship_manager import relationship_manager +from plugins.willing.willing_manager import willing_manager +from plugins.chat.chat_stream import chat_manager +from plugins.memory_system.memory import hippocampus +from plugins.chat.message_sender import message_manager +from plugins.chat.storage import MessageStorage +from plugins.chat.config import global_config +from common.logger import get_module_logger +from fastapi import FastAPI +from plugins.chat.api import app as api_app + +logger = get_module_logger("main") + + +class MainSystem: + def __init__(self): + self.llm_stats = LLMStatistics("llm_statistics.txt") + self.mood_manager = MoodManager.get_instance() + self._message_manager_started = False + self.app = FastAPI() + self.app.mount("/chat", api_app) + + async def initialize(self): + """初始化系统组件""" + logger.debug(f"正在唤醒{global_config.BOT_NICKNAME}......") + + # 启动LLM统计 + self.llm_stats.start() + logger.success("LLM统计功能启动成功") + + # 初始化表情管理器 + emoji_manager.initialize() + + # 启动情绪管理器 + self.mood_manager.start_mood_update(update_interval=global_config.mood_update_interval) + logger.success("情绪管理器启动成功") + + # 加载用户关系 + await relationship_manager.load_all_relationships() + asyncio.create_task(relationship_manager._start_relationship_manager()) + + # 启动愿望管理器 + await willing_manager.ensure_started() + + # 启动消息处理器 + if not self._message_manager_started: + asyncio.create_task(message_manager.start_processor()) + self._message_manager_started = True + + # 初始化聊天管理器 + await chat_manager._initialize() + asyncio.create_task(chat_manager._auto_save_task()) + + # 初始化日程 + await bot_schedule.initialize() + bot_schedule.print_schedule() + + # 启动FastAPI服务器 + import uvicorn + + uvicorn.run(self.app, host="0.0.0.0", port=18000) + logger.success("API服务器启动成功") + + async def schedule_tasks(self): + """调度定时任务""" + while True: + tasks = [ + self.build_memory_task(), + self.forget_memory_task(), + self.merge_memory_task(), + self.print_mood_task(), + self.generate_schedule_task(), + self.remove_recalled_message_task(), + emoji_manager.start_periodic_check(interval_MINS=global_config.EMOJI_CHECK_INTERVAL), + ] + await asyncio.gather(*tasks) + + async def build_memory_task(self): + """记忆构建任务""" + while True: + await hippocampus.operation_build_memory() + await asyncio.sleep(global_config.build_memory_interval) + + async def forget_memory_task(self): + """记忆遗忘任务""" + while True: + print("\033[1;32m[记忆遗忘]\033[0m 开始遗忘记忆...") + await hippocampus.operation_forget_topic(percentage=global_config.memory_forget_percentage) + print("\033[1;32m[记忆遗忘]\033[0m 记忆遗忘完成") + await asyncio.sleep(global_config.forget_memory_interval) + + async def merge_memory_task(self): + """记忆整合任务""" + while True: + await asyncio.sleep(global_config.build_memory_interval + 10) + + async def print_mood_task(self): + """打印情绪状态""" + while True: + self.mood_manager.print_mood_status() + await asyncio.sleep(30) + + async def generate_schedule_task(self): + """生成日程任务""" + while True: + await bot_schedule.initialize() + if not bot_schedule.enable_output: + bot_schedule.print_schedule() + await asyncio.sleep(7200) + + async def remove_recalled_message_task(self): + """删除撤回消息任务""" + while True: + try: + storage = MessageStorage() + await storage.remove_recalled_message(time.time()) + except Exception: + logger.exception("删除撤回消息失败") + await asyncio.sleep(3600) + + +async def main(): + """主函数""" + system = MainSystem() + await system.initialize() + await system.schedule_tasks() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/src/plugins/chat/api.py b/src/plugins/chat/api.py new file mode 100644 index 000000000..14a646832 --- /dev/null +++ b/src/plugins/chat/api.py @@ -0,0 +1,54 @@ +from fastapi import FastAPI, HTTPException +from pydantic import BaseModel +from typing import Optional, Dict, Any +from .bot import chat_bot +from .message_cq import MessageRecvCQ +from .message_base import UserInfo, GroupInfo +from src.common.logger import get_module_logger + +logger = get_module_logger("chat_api") + +app = FastAPI() + + +class MessageRequest(BaseModel): + message_id: int + user_info: Dict[str, Any] + raw_message: str + group_info: Optional[Dict[str, Any]] = None + reply_message: Optional[Dict[str, Any]] = None + platform: str = "api" + + +@app.post("/api/message") +async def handle_message(message: MessageRequest): + try: + user_info = UserInfo( + user_id=message.user_info["user_id"], + user_nickname=message.user_info["user_nickname"], + user_cardname=message.user_info.get("user_cardname"), + platform=message.platform, + ) + + group_info = None + if message.group_info: + group_info = GroupInfo( + group_id=message.group_info["group_id"], + group_name=message.group_info.get("group_name"), + platform=message.platform, + ) + + message_cq = MessageRecvCQ( + message_id=message.message_id, + user_info=user_info, + raw_message=message.raw_message, + group_info=group_info, + reply_message=message.reply_message, + platform=message.platform, + ) + + await chat_bot.message_process(message_cq) + return {"status": "success"} + except Exception as e: + logger.exception("API处理消息时出错") + raise HTTPException(status_code=500, detail=str(e)) from e