118 lines
3.4 KiB
Python
118 lines
3.4 KiB
Python
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 |