模块管理优化
This commit is contained in:
@@ -320,32 +320,55 @@ class PluginManagerPlugin(MessagePluginInterface):
|
|||||||
# 记录插件状态,以便重新加载后恢复
|
# 记录插件状态,以便重新加载后恢复
|
||||||
was_running = plugin.status == PluginStatus.RUNNING
|
was_running = plugin.status == PluginStatus.RUNNING
|
||||||
|
|
||||||
# 先卸载插件 - 使用模块名而不是显示名称
|
try:
|
||||||
self.LOG.info(f"正在卸载插件 {actual_plugin_name}(模块名:{module_name}) 以进行重载")
|
# 先确保插件已停止运行
|
||||||
if not self.plugin_manager.unload_plugin(module_name):
|
if was_running:
|
||||||
wcf.send_text(f"❌插件 {actual_plugin_name} 卸载失败,无法重载",
|
self.LOG.info(f"插件 {actual_plugin_name} 正在运行,先停止它")
|
||||||
(roomid if roomid else sender), sender)
|
self.plugin_manager.stop_plugin(module_name)
|
||||||
return False, f"插件 {actual_plugin_name} 卸载失败,无法重载"
|
|
||||||
|
# 先卸载插件 - 使用模块名而不是显示名称
|
||||||
# 然后加载插件 - 使用模块名而不是显示名称
|
self.LOG.info(f"正在卸载插件 {actual_plugin_name}(模块名:{module_name}) 以进行重载")
|
||||||
self.LOG.info(f"正在加载插件 {module_name}")
|
|
||||||
plugin = self.plugin_manager.load_plugin(module_name)
|
# 尝试卸载,如果失败则尝试强制从注册表移除
|
||||||
if not plugin:
|
unload_success = self.plugin_manager.unload_plugin(module_name)
|
||||||
wcf.send_text(f"❌插件 {actual_plugin_name} 加载失败",
|
if not unload_success:
|
||||||
(roomid if roomid else sender), sender)
|
self.LOG.warning(f"常规卸载失败,尝试强制卸载插件 {actual_plugin_name}")
|
||||||
return False, f"插件 {actual_plugin_name} 加载失败"
|
# 从插件注册表中移除
|
||||||
|
if actual_plugin_name in self.plugin_registry.get_all_plugins():
|
||||||
# 如果之前是启用状态,则重新启用
|
self.plugin_registry.remove_plugin(actual_plugin_name)
|
||||||
if was_running:
|
unload_success = True
|
||||||
self.LOG.info(f"正在启用插件 {actual_plugin_name}")
|
|
||||||
if not self.plugin_manager.start_plugin(module_name): # 使用模块名而不是显示名称
|
if not unload_success:
|
||||||
wcf.send_text(f"⚠️插件 {actual_plugin_name} 重载成功,但启用失败",
|
wcf.send_text(f"❌插件 {actual_plugin_name} 卸载失败,无法重载",
|
||||||
(roomid if roomid else sender), sender)
|
(roomid if roomid else sender), sender)
|
||||||
return True, f"插件 {actual_plugin_name} 重载成功,但启用失败"
|
return False, f"插件 {actual_plugin_name} 卸载失败,无法重载"
|
||||||
|
|
||||||
wcf.send_text(f"✅插件 {actual_plugin_name} 重载成功",
|
# 然后加载插件 - 使用模块名而不是显示名称
|
||||||
(roomid if roomid else sender), sender)
|
self.LOG.info(f"正在加载插件 {module_name}")
|
||||||
return True, f"插件 {actual_plugin_name} 重载成功"
|
plugin = self.plugin_manager.load_plugin(module_name)
|
||||||
|
if not plugin:
|
||||||
|
wcf.send_text(f"❌插件 {actual_plugin_name} 加载失败",
|
||||||
|
(roomid if roomid else sender), sender)
|
||||||
|
return False, f"插件 {actual_plugin_name} 加载失败"
|
||||||
|
|
||||||
|
# 如果之前是启用状态,则重新启用
|
||||||
|
if was_running:
|
||||||
|
self.LOG.info(f"正在启用插件 {actual_plugin_name}")
|
||||||
|
if not self.plugin_manager.start_plugin(module_name): # 使用模块名而不是显示名称
|
||||||
|
wcf.send_text(f"⚠️插件 {actual_plugin_name} 重载成功,但启用失败",
|
||||||
|
(roomid if roomid else sender), sender)
|
||||||
|
return True, f"插件 {actual_plugin_name} 重载成功,但启用失败"
|
||||||
|
|
||||||
|
wcf.send_text(f"✅插件 {actual_plugin_name} 重载成功",
|
||||||
|
(roomid if roomid else sender), sender)
|
||||||
|
return True, f"插件 {actual_plugin_name} 重载成功"
|
||||||
|
except Exception as e:
|
||||||
|
import traceback
|
||||||
|
error_trace = traceback.format_exc()
|
||||||
|
self.LOG.error(f"重载插件 {actual_plugin_name} 时出错: {e}\n{error_trace}")
|
||||||
|
wcf.send_text(f"❌重载插件出错: {str(e)}",
|
||||||
|
(roomid if roomid else sender), sender)
|
||||||
|
return False, f"重载插件出错: {e}"
|
||||||
|
|
||||||
def _unload_plugin(self, plugin_name: str, wcf, sender: str, roomid: str, silent: bool = False) -> Tuple[bool, str]:
|
def _unload_plugin(self, plugin_name: str, wcf, sender: str, roomid: str, silent: bool = False) -> Tuple[bool, str]:
|
||||||
"""卸载插件"""
|
"""卸载插件"""
|
||||||
@@ -375,19 +398,43 @@ class PluginManagerPlugin(MessagePluginInterface):
|
|||||||
# 获取插件的模块名,这才是插件管理器需要的名称
|
# 获取插件的模块名,这才是插件管理器需要的名称
|
||||||
module_name = plugin.__class__.__module__.split('.')[-2]
|
module_name = plugin.__class__.__module__.split('.')[-2]
|
||||||
|
|
||||||
|
# 先确保插件已停止运行
|
||||||
|
if plugin.status == PluginStatus.RUNNING:
|
||||||
|
self.LOG.info(f"插件 {actual_plugin_name} 正在运行,先停止它")
|
||||||
|
self.plugin_manager.stop_plugin(module_name)
|
||||||
|
|
||||||
# 使用插件管理器卸载插件 - 使用模块名而不是显示名称
|
# 使用插件管理器卸载插件 - 使用模块名而不是显示名称
|
||||||
self.LOG.info(f"正在卸载插件 {actual_plugin_name}(模块名:{module_name})")
|
self.LOG.info(f"正在卸载插件 {actual_plugin_name}(模块名:{module_name})")
|
||||||
success = self.plugin_manager.unload_plugin(module_name)
|
|
||||||
if success:
|
# 尝试直接从插件注册表中移除插件
|
||||||
|
try:
|
||||||
|
# 先尝试正常卸载
|
||||||
|
success = self.plugin_manager.unload_plugin(module_name)
|
||||||
|
|
||||||
|
# 如果失败,尝试强制从注册表移除
|
||||||
|
if not success:
|
||||||
|
self.LOG.warning(f"常规卸载失败,尝试强制卸载插件 {actual_plugin_name}")
|
||||||
|
# 从插件注册表中移除
|
||||||
|
if actual_plugin_name in self.plugin_registry.get_all_plugins():
|
||||||
|
self.plugin_registry.remove_plugin(actual_plugin_name)
|
||||||
|
success = True
|
||||||
|
|
||||||
|
if success:
|
||||||
|
if not silent:
|
||||||
|
wcf.send_text(f"✅插件 {actual_plugin_name} 卸载成功",
|
||||||
|
(roomid if roomid else sender), sender)
|
||||||
|
return True, f"插件 {actual_plugin_name} 卸载成功"
|
||||||
|
else:
|
||||||
|
if not silent:
|
||||||
|
wcf.send_text(f"❌插件 {actual_plugin_name} 卸载失败",
|
||||||
|
(roomid if roomid else sender), sender)
|
||||||
|
return False, f"插件 {actual_plugin_name} 卸载失败"
|
||||||
|
except Exception as e:
|
||||||
|
self.LOG.error(f"卸载插件 {actual_plugin_name} 时出错: {e}")
|
||||||
if not silent:
|
if not silent:
|
||||||
wcf.send_text(f"✅插件 {actual_plugin_name} 卸载成功",
|
wcf.send_text(f"❌卸载插件出错: {str(e)}",
|
||||||
(roomid if roomid else sender), sender)
|
(roomid if roomid else sender), sender)
|
||||||
return True, f"插件 {actual_plugin_name} 卸载成功"
|
return False, f"卸载插件出错: {e}"
|
||||||
else:
|
|
||||||
if not silent:
|
|
||||||
wcf.send_text(f"❌插件 {actual_plugin_name} 卸载失败",
|
|
||||||
(roomid if roomid else sender), sender)
|
|
||||||
return False, f"插件 {actual_plugin_name} 卸载失败"
|
|
||||||
|
|
||||||
def _load_plugin(self, plugin_name: str, wcf, sender: str, roomid: str, silent: bool = False) -> Tuple[bool, str]:
|
def _load_plugin(self, plugin_name: str, wcf, sender: str, roomid: str, silent: bool = False) -> Tuple[bool, str]:
|
||||||
"""加载插件"""
|
"""加载插件"""
|
||||||
|
|||||||
Reference in New Issue
Block a user