feat(init): 添加自动清理无效插件和群组数据功能 (#2116)

* feat(init): 添加自动清理无效插件和群组数据功能

- 添加nonebot_plugin_apscheduler依赖用于定时任务
- 导入ChatHistory模型用于清理聊天记录
- 移除CacheException相关异常处理代码
- 重写群组同步逻辑,支持创建新群组记录和删除已退出群组
- 添加定时清理已退出群组聊天记录的功能
- 优化日志输出格式和信息内容

* refactor(manager): 添加E501忽略注释以修复代码风格问题

在Manager类的方法中添加noqa: E501注释,解决docstring行长超过限制的代码检查警告

* feat(init): 添加自动清理聊天记录配置选项

- 引入Config配置模块
- 新增auto_clean.CLEAN_CHAT_HISTORY配置项,控制是否自动清理已退出群聊的聊天记录
- 根据配置决定是否添加定时清理任务,实现可配置的聊天历史清理功能
This commit is contained in:
molanp
2026-04-11 21:21:08 +08:00
committed by GitHub
parent c9efdaedcf
commit eab79bdb52
4 changed files with 134 additions and 312 deletions
+46 -29
View File
@@ -296,7 +296,7 @@ class Manager:
db_data.max_count = limit.max_count # type: ignore
return db_data, False
def __get_file_data(self, limit_type: PluginLimitType) -> dict:
def __get_file_data(self, limit_type: PluginLimitType):
"""获取文件数据
参数:
@@ -323,40 +323,57 @@ class Manager:
参数:
db_limits: 数据库limits
module2plugin: 模块:插件信息
limit_type: 插件限制类型
返回:
tuple[list[PluginLimit], list[PluginLimit]]: 创建列表,更新列表
"""
update_list = []
create_list = []
delete_list = []
tuple[list[PluginLimit], list[PluginLimit]], list[int]: 创建列表,更新列表,删除列表
""" # noqa: E501
update_list: list[PluginLimit] = []
create_list: list[PluginLimit] = []
delete_list: list[int] = []
# 过滤出当前类型的所有 limit
db_type_limits = [
limit for limit in db_limits if limit.limit_type == limit_type
]
if data := self.__get_file_data(limit_type):
db_type_limit_modules = [
(limit.module, limit.id) for limit in db_type_limits
]
delete_list.extend(
id for module, id in db_type_limit_modules if module not in data.keys()
)
for k, v in data.items():
if not module2plugin.get(k):
if k != "test":
logger.warning(
f"插件模块 {k} 未加载,已过滤当前 {v._type} 限制..."
)
continue
db_data = [limit for limit in db_type_limits if limit.module == k]
db_data, is_create = self.__set_data(
k, db_data[0] if db_data else None, v, limit_type, module2plugin
)
if is_create:
create_list.append(db_data)
else:
update_list.append(db_data)
else:
# module - PluginLimit 映射
module2limit: dict[str, PluginLimit] = {
limit.module: limit for limit in db_type_limits
}
# 如果没有任何文件数据,对应类型下的记录全部删掉
data = self.__get_file_data(limit_type)
if not data:
delete_list = [limit.id for limit in db_type_limits]
return create_list, update_list, delete_list
# 数据库中有,但文件里没有的模块,全部删掉
file_modules = set(data.keys())
for limit in db_type_limits:
if limit.module not in file_modules:
delete_list.append(limit.id)
# 遍历文件数据,生成 create / update / delete
for k, v in data.items():
db_data = module2limit.get(k)
# 插件未加载:删掉所有同模块的 limit
if k not in module2plugin:
if k != "test":
logger.warning(f"插件模块 {k} 未加载,已忽略当前 {v._type} 限制...")
if db_data:
delete_list.append(db_data.id)
continue
db_data, is_create = self.__set_data(
k, db_data, v, limit_type, module2plugin
)
if is_create:
create_list.append(db_data)
else:
update_list.append(db_data)
return create_list, update_list, delete_list
async def __set_all_limit(