refactor(core): 统一消息对象类型并增强代码健壮性

本次提交对多个核心模块进行了重构和修复,主要目标是统一内部消息对象的类型为 `DatabaseMessages`,并增加多处空值检查和类型注解,以提升代码的健壮性和可维护性。

- **统一消息类型**: 在 `action_manager` 中,将 `action_message` 和 `target_message` 的类型注解和处理逻辑统一为 `DatabaseMessages`,消除了对 `dict` 类型的兼容代码,使逻辑更清晰。
- **增强健壮性**:
    - 在 `permission_api` 中,为所有对外方法增加了对 `_permission_manager` 未初始化时的空值检查,防止在管理器未就绪时调用引发异常。
    - 在 `chat_api` 和 `cross_context_api` 中,增加了对 `stream.user_info` 的存在性检查,避免在私聊场景下 `user_info` 为空时导致 `AttributeError`。
- **类型修复**: 修正了 `action_modifier` 和 `plugin_base` 中的类型注解错误,并解决了 `action_modifier` 中因 `chat_stream` 未初始化可能导致的潜在问题。
- **代码简化**: 移除了 `action_manager` 中因兼容 `dict` 类型而产生的冗余代码分支,使逻辑更直接。
This commit is contained in:
minecraft1024a
2025-11-01 16:51:04 +08:00
committed by Windpicker-owo
parent 3e8373e0ec
commit 8a0075ee92
6 changed files with 43 additions and 34 deletions

View File

@@ -61,7 +61,7 @@ class PermissionAPI:
def __init__(self):
self._permission_manager: IPermissionManager | None = None
# 需要保留的前缀(视为绝对节点名,不再自动加 plugins.<plugin>. 前缀)
self.RESERVED_PREFIXES: tuple[str, ...] = "system."
self.RESERVED_PREFIXES: tuple[str, ...] = ("system.",)
# 系统节点列表 (name, description, default_granted)
self._SYSTEM_NODES: list[tuple[str, str, bool]] = [
("system.superuser", "系统超级管理员:拥有所有权限", False),
@@ -80,10 +80,14 @@ class PermissionAPI:
async def check_permission(self, platform: str, user_id: str, permission_node: str) -> bool:
self._ensure_manager()
if not self._permission_manager:
return False
return await self._permission_manager.check_permission(UserInfo(platform, user_id), permission_node)
async def is_master(self, platform: str, user_id: str) -> bool:
self._ensure_manager()
if not self._permission_manager:
return False
return await self._permission_manager.is_master(UserInfo(platform, user_id))
async def register_permission_node(
@@ -109,6 +113,8 @@ class PermissionAPI:
if original_name != node_name:
logger.debug(f"规范化权限节点 '{original_name}' -> '{node_name}'")
node = PermissionNode(node_name, description, plugin_name, default_granted)
if not self._permission_manager:
return False
return await self._permission_manager.register_permission_node(node)
async def register_system_permission_node(
@@ -141,18 +147,26 @@ class PermissionAPI:
async def grant_permission(self, platform: str, user_id: str, permission_node: str) -> bool:
self._ensure_manager()
if not self._permission_manager:
return False
return await self._permission_manager.grant_permission(UserInfo(platform, user_id), permission_node)
async def revoke_permission(self, platform: str, user_id: str, permission_node: str) -> bool:
self._ensure_manager()
if not self._permission_manager:
return False
return await self._permission_manager.revoke_permission(UserInfo(platform, user_id), permission_node)
async def get_user_permissions(self, platform: str, user_id: str) -> list[str]:
self._ensure_manager()
if not self._permission_manager:
return []
return await self._permission_manager.get_user_permissions(UserInfo(platform, user_id))
async def get_all_permission_nodes(self) -> list[dict[str, Any]]:
self._ensure_manager()
if not self._permission_manager:
return []
nodes = await self._permission_manager.get_all_permission_nodes()
return [
{
@@ -166,6 +180,8 @@ class PermissionAPI:
async def get_plugin_permission_nodes(self, plugin_name: str) -> list[dict[str, Any]]:
self._ensure_manager()
if not self._permission_manager:
return []
nodes = await self._permission_manager.get_plugin_permission_nodes(plugin_name)
return [
{