mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-06 04:10:02 +08:00
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:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user