from typing import Dict, List, Optional from dataclasses import dataclass from enum import Enum import json import os from utils.logger import logger @dataclass class Permission: """权限类""" key: str name: str description: str value: int plugin_id: Optional[str] = None class PermissionStatus(Enum): """权限状态枚举""" ENABLED = 1 DISABLED = 0 class PermissionManager: """权限管理器(单例模式)""" _instance = None _initialized = False def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) return cls._instance def __init__(self): if not self._initialized: self._permissions: Dict[str, Permission] = {} self._config_file = "config/permissions.json" self._load_permissions() self._initialized = True def _load_permissions(self): """从配置文件加载权限""" try: if os.path.exists(self._config_file): with open(self._config_file, 'r', encoding='utf-8') as f: data = json.load(f) for key, perm_data in data.items(): self._permissions[key] = Permission(**perm_data) except Exception as e: logger.error(f"加载权限配置失败: {e}") def _save_permissions(self): """保存权限到配置文件""" try: os.makedirs(os.path.dirname(self._config_file), exist_ok=True) with open(self._config_file, 'w', encoding='utf-8') as f: json.dump( {k: v.__dict__ for k, v in self._permissions.items()}, f, ensure_ascii=False, indent=2 ) except Exception as e: logger.error(f"保存权限配置失败: {e}") def register_permission( self, key: str, name: str, description: str, plugin_id: Optional[str] = None ) -> Permission: """注册新权限""" if key in self._permissions: return self._permissions[key] value = len(self._permissions) + 1 permission = Permission( key=key, name=name, description=description, value=value, plugin_id=plugin_id ) self._permissions[key] = permission self._save_permissions() return permission def get_permission(self, key: str) -> Optional[Permission]: """获取权限""" return self._permissions.get(key) def get_permission_by_value(self, value: int) -> Optional[Permission]: """通过值获取权限""" for perm in self._permissions.values(): if perm.value == value: return perm return None def get_all_permissions(self) -> List[Permission]: """获取所有权限""" return list(self._permissions.values()) def get_plugin_permissions(self, plugin_id: str) -> List[Permission]: """获取插件的所有权限""" return [ perm for perm in self._permissions.values() if perm.plugin_id == plugin_id ] def remove_permission(self, key: str) -> bool: """移除权限""" if key in self._permissions: del self._permissions[key] self._save_permissions() return True return False