chore: sync current WechatHookBot workspace
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user