refactor(db,plugin): 优化数据库初始化和插件系统类型安全

- 重构数据库初始化逻辑,添加防重入保护和更好的错误处理
- 优化插件组件注册系统的类型注解和代码结构
- 简化统计模块异常处理逻辑
- 移除插件管理器中的重载功能以简化代码
- 更新Pyright配置排除内置插件目录
- 修复权限管理器异步方法调用
This commit is contained in:
雅诺狐
2025-10-07 16:29:17 +08:00
parent 4971d18f14
commit 6659c60799
8 changed files with 234 additions and 256 deletions

View File

@@ -5,7 +5,7 @@
"""
import datetime
from typing import Any, Optional, TypedDict, Literal, Union, Callable, TypeVar, cast
from typing import Any, Optional, TypeVar, cast
from sqlalchemy import select, delete
@@ -47,29 +47,26 @@ class AntiInjectionStatistics:
"""当前会话开始时间"""
@staticmethod
async def get_or_create_stats() -> Optional[AntiInjectionStats]: # type: ignore[name-defined]
async def get_or_create_stats() -> AntiInjectionStats:
"""获取或创建统计记录
Returns:
AntiInjectionStats | None: 成功返回模型实例,否则 None
"""
try:
async with get_db_session() as session:
async with get_db_session() as session:
# 获取最新的统计记录,如果没有则创建
stats = (
stats = (
(await session.execute(select(AntiInjectionStats).order_by(AntiInjectionStats.id.desc())))
.scalars()
.first()
)
if not stats:
stats = AntiInjectionStats()
session.add(stats)
await session.commit()
await session.refresh(stats)
return stats
except Exception as e:
logger.error(f"获取统计记录失败: {e}")
return None
if not stats:
stats = AntiInjectionStats()
session.add(stats)
await session.commit()
await session.refresh(stats)
return stats
@staticmethod
async def update_stats(**kwargs: Any) -> None:
@@ -97,7 +94,7 @@ class AntiInjectionStatistics:
if key == "processing_time_delta":
# 处理时间累加 - 确保不为 None
delta = float(value)
stats.processing_time_total = _add_optional(stats.processing_time_total, delta) # type: ignore[attr-defined]
stats.processing_time_total = _add_optional(stats.processing_time_total, delta)
continue
elif key == "last_processing_time":
# 直接设置最后处理时间
@@ -146,7 +143,7 @@ class AntiInjectionStatistics:
# 计算派生统计信息 - 处理 None 值
total_messages = stats.total_messages or 0 # type: ignore[attr-defined]
total_messages = stats.total_messages or 0
detected_injections = stats.detected_injections or 0 # type: ignore[attr-defined]
processing_time_total = stats.processing_time_total or 0.0 # type: ignore[attr-defined]