95 lines
3.5 KiB
Python
95 lines
3.5 KiB
Python
"""插件管理器 - 只加载 plugin-loader,其他所有插件由 plugin-loader 插件自行管理"""
|
||
from typing import Any, Optional
|
||
|
||
from oss.plugin.loader import PluginLoader
|
||
|
||
# 深度隐藏的成就系统导入
|
||
try:
|
||
from oss.core.achievements import get_validator
|
||
_ACHIEVEMENTS_ENABLED = True
|
||
except ImportError:
|
||
_ACHIEVEMENTS_ENABLED = False
|
||
|
||
|
||
class PluginManager:
|
||
"""极简插件管理器
|
||
|
||
遵循「最小化核心框架」设计哲学:
|
||
- 核心框架只负责加载 plugin-loader 插件
|
||
- 所有其他插件(HTTP、WebSocket、Dashboard 等)都由 plugin-loader 插件扫描和加载
|
||
- store/@{FutureOSS}/ 是唯一的插件来源
|
||
"""
|
||
|
||
def __init__(self):
|
||
self.loader = PluginLoader()
|
||
self.plugin_loader: Optional[Any] = None
|
||
|
||
def load(self):
|
||
"""仅加载 plugin-loader 核心插件
|
||
|
||
plugin-loader 插件会负责:
|
||
1. 扫描 store/@{FutureOSS}/ 目录
|
||
2. 加载所有启用的插件
|
||
3. 处理依赖关系
|
||
4. 执行 PL 注入机制
|
||
"""
|
||
# 只加载 plugin-loader,其他所有插件都由它来管理
|
||
pl_info = self.loader.load_core_plugin("plugin-loader")
|
||
if pl_info:
|
||
self.plugin_loader = pl_info["instance"]
|
||
|
||
# 隐藏成就:深海潜水员 - 当加载插件管理器时解锁
|
||
if _ACHIEVEMENTS_ENABLED:
|
||
try:
|
||
validator = get_validator()
|
||
validator.unlock("deep_diver")
|
||
except Exception:
|
||
pass
|
||
|
||
def start(self):
|
||
"""启动 plugin-loader,它会初始化并启动所有其他插件"""
|
||
import time
|
||
start_time = time.time()
|
||
|
||
if self.plugin_loader:
|
||
# plugin-loader.init() 会扫描并加载 store/ 中的所有插件
|
||
self.plugin_loader.init()
|
||
# plugin-loader.start() 会按依赖顺序启动所有插件
|
||
self.plugin_loader.start()
|
||
|
||
# 计算启动时间并检查速度成就
|
||
elapsed_ms = (time.time() - start_time) * 1000
|
||
if _ACHIEVEMENTS_ENABLED:
|
||
try:
|
||
validator = get_validator()
|
||
validator.check_startup_speed(elapsed_ms)
|
||
|
||
# 检查插件数量成就
|
||
if hasattr(self.plugin_loader, 'manager') and hasattr(self.plugin_loader.manager, 'plugins'):
|
||
plugin_count = len(self.plugin_loader.manager.plugins)
|
||
validator.check_plugin_count(plugin_count)
|
||
except Exception:
|
||
pass
|
||
|
||
def stop(self):
|
||
"""停止所有插件(由 plugin-loader 统一管理)"""
|
||
if self.plugin_loader:
|
||
try:
|
||
self.plugin_loader.stop()
|
||
except KeyboardInterrupt:
|
||
print("[PluginManager] 用户中断停止过程")
|
||
except Exception as e:
|
||
import traceback
|
||
print(f"[PluginManager] 停止插件时出错:{type(e).__name__}: {e}")
|
||
traceback.print_exc()
|
||
|
||
# 隐藏成就:崩溃幸存者 - 如果正常停止则不解锁,只有异常停止才可能解锁
|
||
# 这里我们记录停止事件,用于将来可能的连续运行成就
|
||
if _ACHIEVEMENTS_ENABLED:
|
||
try:
|
||
validator = get_validator()
|
||
# 记录会话结束
|
||
validator.track_progress("session_end")
|
||
except Exception:
|
||
pass
|