zhenxun_bot/zhenxun/builtin_plugins/superuser/clear_data.py

97 lines
2.9 KiB
Python

import os
import time
from nonebot.permission import SUPERUSER
from nonebot.plugin import PluginMetadata
from nonebot.rule import to_me
from nonebot.utils import run_sync
from nonebot_plugin_alconna import Alconna, on_alconna
from nonebot_plugin_apscheduler import scheduler
from nonebot_plugin_session import EventSession
from zhenxun.configs.path_config import TEMP_PATH
from zhenxun.configs.utils import PluginExtraData
from zhenxun.services.log import logger
from zhenxun.utils.enum import PluginType
from zhenxun.utils.message import MessageUtils
from zhenxun.utils.utils import ResourceDirManager
__plugin_meta__ = PluginMetadata(
name="清理数据",
description="清理已添加的临时文件夹中的数据",
usage="""
清理临时数据
""".strip(),
extra=PluginExtraData(
author="HibiKier",
version="0.1",
plugin_type=PluginType.SUPERUSER,
).to_dict(),
)
_matcher = on_alconna(
Alconna("清理临时数据"),
rule=to_me(),
permission=SUPERUSER,
priority=5,
block=True,
)
ResourceDirManager.add_temp_dir(TEMP_PATH, True)
@_matcher.handle()
async def _(session: EventSession):
await MessageUtils.build_message("开始清理临时数据...").send()
size = await _clear_data()
await MessageUtils.build_message(
f"共清理了 {size / 1024 / 1024:.2f}MB 的数据..."
).send()
logger.info(
f"清理临时数据完成,共清理了 {size / 1024 / 1024:.2f}MB 的数据...",
session=session,
)
@run_sync
def _clear_data() -> float:
logger.debug("开始清理临时文件...")
size = 0
dir_list = [dir_ for dir_ in ResourceDirManager.temp_path if dir_.exists()]
for dir_ in dir_list:
logger.debug(f"尝试清理文件夹: {dir_.absolute()}", "清理临时数据")
dir_size = 0
for file in os.listdir(dir_):
file = dir_ / file
if file.is_file():
try:
if time.time() - os.path.getatime(file) > 10:
file_size = os.path.getsize(file)
file.unlink()
size += file_size
dir_size += file_size
logger.debug(f"移除临时文件: {file.absolute()}", "清理临时数据")
except Exception as e:
logger.error(
f"清理临时数据错误,临时文件夹: {dir_.absolute()}...",
"清理临时数据",
e=e,
)
logger.debug(f"清理临时文件夹大小: {size / 1024 / 1024:.2f}MB", "清理临时数据")
return float(size)
@scheduler.scheduled_job(
"cron",
hour=1,
minute=1,
)
async def _():
size = await _clear_data()
logger.info(
f"自动清理临时数据完成,共清理了 {size / 1024 / 1024:.2f}MB 的数据...",
"定时任务",
)