chore: sync current WechatHookBot workspace

This commit is contained in:
2026-03-09 15:48:45 +08:00
parent 4016c1e6eb
commit 9119e2307d
195 changed files with 24438 additions and 17498 deletions

View File

@@ -3,13 +3,14 @@ import inspect
import os
import sys
import traceback
from pathlib import Path
from typing import Dict, Type, List, Union
from loguru import logger
# from WechatAPI import WechatAPIClient # 注释掉WechatHookBot 不需要这个导入
from utils.singleton import Singleton
from utils.config_manager import get_bot_config
from utils.config_manager import get_bot_config, get_project_root
from utils.llm_tooling import register_plugin_tools, unregister_plugin_tools
from .event_manager import EventManager
from .plugin_base import PluginBase
@@ -22,6 +23,7 @@ class PluginManager(metaclass=Singleton):
self.plugin_info: Dict[str, dict] = {} # 新增:存储所有插件信息
self.bot = None
self._plugins_dir = get_project_root() / "plugins"
# 使用统一配置管理器
bot_config = get_bot_config()
@@ -118,9 +120,14 @@ class PluginManager(metaclass=Singleton):
bool: 是否成功加载插件
"""
found = False
for dirname in os.listdir("plugins"):
if not self._plugins_dir.exists():
logger.warning(f"插件目录不存在: {self._plugins_dir}")
return False
for plugin_dir in self._plugins_dir.iterdir():
dirname = plugin_dir.name
try:
if os.path.isdir(f"plugins/{dirname}") and os.path.exists(f"plugins/{dirname}/main.py"):
if plugin_dir.is_dir() and (plugin_dir / "main.py").exists():
module = importlib.import_module(f"plugins.{dirname}.main")
importlib.reload(module)
@@ -137,6 +144,7 @@ class PluginManager(metaclass=Singleton):
if not found:
logger.warning(f"未找到插件类 {plugin_name}")
return False
def _resolve_load_order(self, plugin_classes: List[Type[PluginBase]]) -> List[Type[PluginBase]]:
"""
@@ -202,8 +210,13 @@ class PluginManager(metaclass=Singleton):
all_plugin_classes = []
plugin_disabled_map = {}
for dirname in os.listdir("plugins"):
if os.path.isdir(f"plugins/{dirname}") and os.path.exists(f"plugins/{dirname}/main.py"):
if not self._plugins_dir.exists():
logger.warning(f"插件目录不存在: {self._plugins_dir}")
return loaded_plugins
for plugin_dir in self._plugins_dir.iterdir():
dirname = plugin_dir.name
if plugin_dir.is_dir() and (plugin_dir / "main.py").exists():
try:
module = importlib.import_module(f"plugins.{dirname}.main")
for name, obj in inspect.getmembers(module):
@@ -369,10 +382,15 @@ class PluginManager(metaclass=Singleton):
return []
async def refresh_plugins(self):
for dirname in os.listdir("plugins"):
if not self._plugins_dir.exists():
logger.warning(f"插件目录不存在: {self._plugins_dir}")
return
for plugin_dir in self._plugins_dir.iterdir():
dirname = plugin_dir.name
try:
dirpath = f"plugins/{dirname}"
if os.path.isdir(dirpath) and os.path.exists(f"{dirpath}/main.py"):
dirpath = Path(plugin_dir)
if dirpath.is_dir() and (dirpath / "main.py").exists():
# 验证目录名合法性
if not dirname.isidentifier():
logger.warning(f"跳过非法插件目录名: {dirname}")
@@ -415,8 +433,7 @@ class PluginManager(metaclass=Singleton):
try:
# 尝试从 AIChat 插件配置读取
import tomllib
from pathlib import Path
aichat_config_path = Path("plugins/AIChat/config.toml")
aichat_config_path = self._plugins_dir / "AIChat" / "config.toml"
if aichat_config_path.exists():
with open(aichat_config_path, "rb") as f:
aichat_config = tomllib.load(f)
@@ -429,8 +446,7 @@ class PluginManager(metaclass=Singleton):
"""获取工具超时配置"""
try:
import tomllib
from pathlib import Path
aichat_config_path = Path("plugins/AIChat/config.toml")
aichat_config_path = self._plugins_dir / "AIChat" / "config.toml"
if aichat_config_path.exists():
with open(aichat_config_path, "rb") as f:
aichat_config = tomllib.load(f)