diff --git a/plugins/plugin_manager/main.py b/plugins/plugin_manager/main.py index 4c0d9b9..c2e1912 100644 --- a/plugins/plugin_manager/main.py +++ b/plugins/plugin_manager/main.py @@ -285,22 +285,55 @@ class PluginManagerPlugin(MessagePluginInterface): def _reload_plugin(self, plugin_name: str, wcf, sender: str, roomid: str) -> Tuple[bool, str]: """重新加载插件""" + # 查找匹配的插件名称 + actual_plugin_name = self._find_plugin_by_name(plugin_name) + + if not actual_plugin_name: + wcf.send_text(f"❌未找到插件 {plugin_name},请检查名称是否正确", + (roomid if roomid else sender), sender) + return True, f"未找到插件 {plugin_name}" + # 不允许重载自身 - if plugin_name == self.name: + if actual_plugin_name == self.name: wcf.send_text(f"⚠️不能重载插件管理插件自身", (roomid if roomid else sender), sender) return True, "不能重载插件管理插件自身" - # 使用插件管理器重新加载插件 - plugin = self.plugin_manager.reload_plugin(plugin_name) - if plugin: - wcf.send_text(f"✅插件 {plugin_name} 重载成功", + plugin = self.plugin_registry.get_plugin(actual_plugin_name) + if not plugin: + wcf.send_text(f"❌插件 {actual_plugin_name} 不存在", (roomid if roomid else sender), sender) - return True, f"插件 {plugin_name} 重载成功" - else: - wcf.send_text(f"❌插件 {plugin_name} 重载失败", + return True, f"插件 {actual_plugin_name} 不存在" + + # 记录插件状态,以便重新加载后恢复 + was_running = plugin.status == PluginStatus.RUNNING + + # 先卸载插件 + self.LOG.info(f"正在卸载插件 {actual_plugin_name} 以进行重载") + if not self.plugin_manager.unload_plugin(actual_plugin_name): + wcf.send_text(f"❌插件 {actual_plugin_name} 卸载失败,无法重载", (roomid if roomid else sender), sender) - return False, f"插件 {plugin_name} 重载失败" + return False, f"插件 {actual_plugin_name} 卸载失败,无法重载" + + # 然后加载插件 + self.LOG.info(f"正在加载插件 {actual_plugin_name}") + plugin = self.plugin_manager.load_plugin(actual_plugin_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(actual_plugin_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} 重载成功" def _unload_plugin(self, plugin_name: str, wcf, sender: str, roomid: str, silent: bool = False) -> Tuple[bool, str]: """卸载插件"""