加入bot,自动注入内容,在项目启动完成之后,给每个插件注入bot

This commit is contained in:
liuwei
2025-05-20 15:10:26 +08:00
parent 322297a69c
commit da89eea4f1
6 changed files with 69 additions and 53 deletions

View File

@@ -11,14 +11,15 @@ from plugin_common.message_plugin_interface import MessagePluginInterface
from plugin_common.scheduled_plugin_interface import ScheduledPluginInterface
from plugin_common.plugin_registry import PluginRegistry
from plugin_common.event_system import EventSystem, EventType
from wechat_ipad import WechatAPIClient
class PluginManager:
"""插件管理器,负责加载、卸载、启动、停止插件"""
# 单例实例
_instance = None
@classmethod
def get_instance(cls, plugin_dir=None):
"""获取单例实例
@@ -32,14 +33,13 @@ class PluginManager:
if cls._instance is None:
cls._instance = cls(plugin_dir=plugin_dir or "plugins")
return cls._instance
def __new__(cls, *args, **kwargs):
"""实现单例模式"""
if cls._instance is None:
cls._instance = super(PluginManager, cls).__new__(cls)
cls._instance._initialized = False
return cls._instance
def __init__(self, plugin_dir: str = "plugins"):
"""
@@ -154,7 +154,7 @@ class PluginManager:
self.LOG.warning(f"PluginManager加载失败的插件模块: {failed_modules}")
self.LOG.info(f"PluginManager当前已加载的插件实例: {list(self.plugins.keys())}")
self.LOG.info(f"PluginManager最终的模块映射关系: {self.module_to_display}")
return self.plugins
def _get_module_name_from_plugin(self, plugin: PluginInterface) -> Optional[str]:
@@ -171,7 +171,7 @@ class PluginManager:
# 获取完整模块路径
full_module = plugin.__class__.__module__
module_parts = full_module.split('.')
# 处理不同的模块路径情况
if len(module_parts) >= 2 and module_parts[0] == 'plugins':
# 对于目录插件,模块名在第二个位置
@@ -270,10 +270,10 @@ class PluginManager:
# 获取显示名称
display_name = plugin.name
# 存储插件实例
self.plugins[display_name] = plugin
# 添加模块名到显示名的映射
self.module_to_display[module_name] = display_name
# self.LOG.info(f"PluginManager添加模块映射 {module_name} -> {display_name}")
@@ -317,7 +317,7 @@ class PluginManager:
# 获取显示名称
display_name = plugin.name
# 存储插件实例
self.plugins[display_name] = plugin
@@ -403,7 +403,7 @@ class PluginManager:
# 记录原插件状态和模块名
was_running = plugin.status == PluginStatus.RUNNING
module_name = self._get_module_name_from_plugin(plugin)
if not module_name:
self.LOG.error(f"无法获取插件 {display_name} 的模块名,重载失败")
return None
@@ -546,21 +546,21 @@ class PluginManager:
self.module_to_display[module_name] = display_name
self.LOG.info(f"PluginManager添加缺失的模块映射 {module_name} -> {display_name}")
return display_name, plugin
# 不区分大小写比较
if module_name and module_name.lower() == name.lower():
if module_name not in self.module_to_display:
self.module_to_display[module_name] = display_name
return display_name, plugin
# 检查名称是否包含在模块名中(不区分大小写)
if module_name and name.lower() in module_name.lower():
return display_name, plugin
# 检查模块名是否包含在名称中(不区分大小写)
if module_name and module_name.lower() in name.lower():
return display_name, plugin
# 检查名称是否包含在显示名称中(不区分大小写)
if name.lower() in display_name.lower():
return display_name, plugin
@@ -570,5 +570,15 @@ class PluginManager:
# 记录未找到插件的详细信息,帮助调试
self.LOG.warning(f"未找到插件: {name},当前已加载插件: {list(self.plugins.keys())}")
self.LOG.warning(f"模块映射: {self.module_to_display}")
return None, None
return None, None
def inject_bot(self, bot: WechatAPIClient):
self.system_context["bot"] = bot
for name, plugin in self.plugins.items():
if hasattr(plugin, "set_bot"):
try:
plugin.set_bot(bot)
self.LOG.info(f"已成功注入 bot 到插件 {name}")
except Exception as e:
self.LOG.error(f"注入 bot 到插件 {name} 失败: {e}")