Merge branch 'r-dev' into r-dev
This commit is contained in:
@@ -17,8 +17,7 @@ from src.common.database.database_model import Images, ImageType
|
||||
from src.common.database.database import get_db_session, get_db_session_manual
|
||||
from src.common.utils.utils_image import ImageUtils
|
||||
from src.prompt.prompt_manager import prompt_manager
|
||||
from src.config.config import global_config
|
||||
from src.config.config import model_config
|
||||
from src.config.config import config_manager, global_config, model_config
|
||||
from src.llm_models.utils_model import LLMRequest
|
||||
|
||||
logger = get_logger("emoji")
|
||||
@@ -32,7 +31,7 @@ EMOJI_REGISTERED_DIR = DATA_DIR / "emoji_registered" # 已注册的表情包注
|
||||
MAX_EMOJI_FOR_PROMPT = 20 # 最大允许的表情包描述数量于图片替换的 prompt 中
|
||||
|
||||
|
||||
def _ensure_directories():
|
||||
def _ensure_directories() -> None:
|
||||
"""确保表情包相关目录存在"""
|
||||
EMOJI_DIR.mkdir(parents=True, exist_ok=True)
|
||||
EMOJI_REGISTERED_DIR.mkdir(parents=True, exist_ok=True)
|
||||
@@ -48,14 +47,33 @@ class EmojiManager:
|
||||
表情包管理器
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self) -> None:
|
||||
_ensure_directories()
|
||||
|
||||
self._emoji_num: int = 0
|
||||
self.emojis: list[MaiEmoji] = []
|
||||
self._maintenance_wakeup_event: asyncio.Event = asyncio.Event()
|
||||
self._reload_callback_registered: bool = False
|
||||
|
||||
config_manager.register_reload_callback(self.reload_runtime_config)
|
||||
self._reload_callback_registered = True
|
||||
|
||||
logger.info("启动表情包管理器")
|
||||
|
||||
def reload_runtime_config(self) -> None:
|
||||
"""响应配置热重载,唤醒维护循环以尽快应用最新配置。"""
|
||||
self._maintenance_wakeup_event.set()
|
||||
logger.info("[配置热重载] Emoji 模块配置已更新,将立即应用到维护循环")
|
||||
|
||||
def shutdown(self) -> None:
|
||||
"""清理 EmojiManager 生命周期资源。"""
|
||||
if not self._reload_callback_registered:
|
||||
return
|
||||
config_manager.unregister_reload_callback(self.reload_runtime_config)
|
||||
self._reload_callback_registered = False
|
||||
self._maintenance_wakeup_event.set()
|
||||
logger.info("[关闭] Emoji 模块已注销配置热重载回调")
|
||||
|
||||
async def get_emoji_description(
|
||||
self, *, emoji_bytes: Optional[bytes] = None, emoji_hash: Optional[str] = None
|
||||
) -> Optional[Tuple[str, List[str]]]:
|
||||
@@ -640,7 +658,13 @@ class EmojiManager:
|
||||
logger.info(f"[定期维护] 删除无法注册的表情包文件: {emoji_file.name}")
|
||||
except Exception as e:
|
||||
logger.error(f"[定期维护] 删除文件 {emoji_file.name} 时出错: {e}")
|
||||
await asyncio.sleep(global_config.emoji.check_interval * 60)
|
||||
wait_seconds = max(global_config.emoji.check_interval * 60, 0)
|
||||
try:
|
||||
await asyncio.wait_for(self._maintenance_wakeup_event.wait(), timeout=wait_seconds)
|
||||
except asyncio.TimeoutError:
|
||||
pass
|
||||
finally:
|
||||
self._maintenance_wakeup_event.clear()
|
||||
|
||||
async def register_emoji_by_filename(self, filename: Path | str) -> bool:
|
||||
"""
|
||||
|
||||
20
src/main.py
20
src/main.py
@@ -1,5 +1,6 @@
|
||||
from maim_message import MessageServer
|
||||
from rich.traceback import install
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
import asyncio
|
||||
import time
|
||||
@@ -31,17 +32,21 @@ install(extra_lines=3)
|
||||
logger = get_logger("main")
|
||||
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from src.webui.webui_server import WebUIServer
|
||||
|
||||
|
||||
class MainSystem:
|
||||
def __init__(self):
|
||||
def __init__(self) -> None:
|
||||
# 使用消息API替代直接的FastAPI实例
|
||||
self.app: MessageServer = get_global_api()
|
||||
self.server: Server = get_global_server()
|
||||
self.webui_server = None # 独立的 WebUI 服务器
|
||||
self.webui_server: WebUIServer | None = None # 独立的 WebUI 服务器
|
||||
|
||||
# 设置独立的 WebUI 服务器
|
||||
self._setup_webui_server()
|
||||
|
||||
def _setup_webui_server(self):
|
||||
def _setup_webui_server(self) -> None:
|
||||
"""设置独立的 WebUI 服务器"""
|
||||
from src.config.config import global_config
|
||||
|
||||
@@ -57,7 +62,7 @@ class MainSystem:
|
||||
except Exception as e:
|
||||
logger.error(t("startup.webui_server_init_failed", error=e))
|
||||
|
||||
async def initialize(self):
|
||||
async def initialize(self) -> None:
|
||||
"""初始化系统组件"""
|
||||
logger.info(t("startup.waking_up", nickname=global_config.bot.nickname))
|
||||
|
||||
@@ -66,7 +71,7 @@ class MainSystem:
|
||||
|
||||
logger.info(t("startup.initialization_completed_banner", nickname=global_config.bot.nickname))
|
||||
|
||||
async def _init_components(self):
|
||||
async def _init_components(self) -> None:
|
||||
"""初始化其他组件"""
|
||||
init_start_time = time.time()
|
||||
|
||||
@@ -126,7 +131,7 @@ class MainSystem:
|
||||
logger.error(t("startup.brain_external_world_failed", error=e))
|
||||
raise
|
||||
|
||||
async def schedule_tasks(self):
|
||||
async def schedule_tasks(self) -> None:
|
||||
"""调度定时任务"""
|
||||
try:
|
||||
tasks = [
|
||||
@@ -153,7 +158,7 @@ class MainSystem:
|
||||
# logger.info("[记忆遗忘] 记忆遗忘完成")
|
||||
|
||||
|
||||
async def main():
|
||||
async def main() -> None:
|
||||
"""主函数"""
|
||||
system = MainSystem()
|
||||
try:
|
||||
@@ -166,6 +171,7 @@ async def main():
|
||||
await get_plugin_runtime_manager().bridge_event("on_stop")
|
||||
await get_plugin_runtime_manager().stop()
|
||||
await async_task_manager.stop_and_wait_all_tasks()
|
||||
emoji_manager.shutdown()
|
||||
await config_manager.stop_file_watcher()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user