🌠修复转换缓存功能的大问题

This commit is contained in:
EillesWan 2024-10-11 11:54:08 +08:00
parent 450d5b957d
commit 40607ed16b
3 changed files with 157 additions and 129 deletions

View File

@ -8,7 +8,7 @@ import asyncio
from io import StringIO from io import StringIO
from pathlib import Path from pathlib import Path
from typing import Annotated, Any, Union from typing import Annotated, Any, Union, Literal
from types import EllipsisType from types import EllipsisType
# from nonebot import require # from nonebot import require
@ -55,6 +55,7 @@ from src.utils.base.language import get_user_lang
# from src.utils.base.config import get_config # from src.utils.base.config import get_config
from src.utils.message.message import MarkdownMessage from src.utils.message.message import MarkdownMessage
from src.utils.message.html_tool import md_to_pic from src.utils.message.html_tool import md_to_pic
from src.utils.message.tools import random_hex_string
from .execute_auto_translator import auto_translate # type: ignore from .execute_auto_translator import auto_translate # type: ignore
from .utils import hanzi_timeid from .utils import hanzi_timeid
@ -152,39 +153,66 @@ save_filesaves()
enable_auto_exe_translate = {} enable_auto_exe_translate = {}
people_convert_point: dict[str, dict[str, dict[str, float | Any]]] = {} people_convert_point: dict[str, dict[str, float]] = {}
def query_convert_points( def query_convert_points(
usr_id: str, item: str, decline: float = 0, store: Any = None usr_id: str, item: str, decline: float = 0
) -> tuple[Any, float]: ) -> tuple[bool, float]:
"""
查询用户是否拥有足够的点数若拥有则消耗若不足则返回False
参数
usr_id: str
用户id
item: str
要消耗的点数类型
decline: float
消耗点数数量
store: Any
要储存的数据
返回
tuple[bool, float]
是否足够和剩余点数
"""
global people_convert_point global people_convert_point
if usr_id in people_convert_point: if usr_id not in people_convert_point:
if item in people_convert_point[usr_id]: people_convert_point[usr_id] = {item: configdict["maxPersonConvert"][item]}
if store: if item not in people_convert_point[usr_id]:
people_convert_point[usr_id][item][item] = store people_convert_point[usr_id][item] = configdict["maxPersonConvert"][item]
if people_convert_point[usr_id][item]["point"] >= decline:
people_convert_point[usr_id][item]["point"] -= decline if people_convert_point[usr_id][item] >= decline:
return ( people_convert_point[usr_id][item] -= decline
people_convert_point[usr_id][item].get(item, None), return True, people_convert_point[usr_id][item]
people_convert_point[usr_id][item]["point"],
)
else: else:
return False, people_convert_point[usr_id][item]["point"] return False, people_convert_point[usr_id][item]
else:
people_convert_point[usr_id][item] = {
"point": configdict["maxPersonConvert"][item] - decline, something_to_delete: dict[
item: store, str,
} dict[
return store, people_convert_point[usr_id][item]["point"] Literal["stuff", "time"],
people_convert_point[usr_id] = { Union[Path | os.PathLike[str] | str, tuple[Any, str]] | int,
item: {"point": configdict["maxPersonConvert"][item] - decline, item: store} ],
} ] = {}
return store, people_convert_point[usr_id][item]["point"]
def add_file_to_delete(file_: Path | os.PathLike[str] | str, wait_p30s: int = 0) -> str:
global something_to_delete
something_to_delete[rr := str(file_)] = {"stuff": file_, "time": wait_p30s}
return rr
def add_memory_to_delete(
index: str, memory_: Any, description: str = "一个内存", wait_p30s: int = 0
) -> None:
global something_to_delete
something_to_delete[index] = {"stuff": (memory_, description), "time": wait_p30s}
def get_stored_path( def get_stored_path(
user_id: str, item: Union[Path, os.PathLike], superuser: bool = False user_id: str, item: Union[Path, os.PathLike[str], str], superuser: bool = False
) -> Path: ) -> Path:
if not isinstance(item, Path): if not isinstance(item, Path):
@ -227,23 +255,46 @@ async def _():
nonebot.logger.success("删除临时文件目录完成") nonebot.logger.success("删除临时文件目录完成")
file_to_delete = []
@scheduler.scheduled_job("interval", seconds=30) @scheduler.scheduled_job("interval", seconds=30)
async def _(): async def _():
nonebot.logger.info( nonebot.logger.info(
"-删除文件检测-", "-删除临时内容-",
) )
global file_to_delete global something_to_delete
for path_d in file_to_delete.copy(): for index_, stuff_component in something_to_delete.items():
if stuff_component["time"] <= 0: # type: ignore
if isinstance(stuff_component["stuff"], (str, Path, os.PathLike)):
try: try:
if os.path.exists(path_d): if os.path.isfile(stuff_component["stuff"]):
os.remove(path_d) os.remove(stuff_component["stuff"])
file_to_delete.remove(path_d) nonebot.logger.success(
nonebot.logger.success("删除临时文件:{}".format(path_d)) "删除文件:{}".format(stuff_component["stuff"])
)
elif os.path.isdir(stuff_component["stuff"]):
shutil.rmtree(stuff_component["stuff"])
nonebot.logger.success(
"删除目录:{}".format(stuff_component["stuff"])
)
else:
nonebot.logger.warning(
"路径不存在或未知类型:{}".format(stuff_component["stuff"])
)
del something_to_delete[index_]
except: except:
nonebot.logger.warning("跳过临时文件删除:{}".format(path_d)) nonebot.logger.warning(
"跳过删除:{}".format(stuff_component["stuff"])
)
else:
try:
nonebot.logger.info(
"清理内存:{}".format(stuff_component["stuff"][-1]) # type: ignore
)
del something_to_delete[index_]
except:
nonebot.logger.warning(
"无法删除:{}".format(stuff_component["stuff"][-1]) # type: ignore
)
something_to_delete[index]["time"] -= 1 # type: ignore
global filesaves global filesaves
qqidlist = list(filesaves.keys()).copy() qqidlist = list(filesaves.keys()).copy()
save_file = False save_file = False
@ -261,7 +312,6 @@ async def _():
except: except:
pass pass
query_convert_points(qqid, "music", 0, False)
filesaves[qqid]["totalSize"] -= filesaves[qqid][name]["size"] filesaves[qqid]["totalSize"] -= filesaves[qqid][name]["size"]
nonebot.logger.info( nonebot.logger.info(
"\t删除{}".format(name), "\t删除{}".format(name),
@ -655,7 +705,10 @@ async def _(
if arg in result.options[arg].args.keys() if arg in result.options[arg].args.keys()
else result.options[arg].args else result.options[arg].args
) )
if ((_vlu := result.options[arg].value) is None or isinstance(_vlu, EllipsisType) ) if (
(_vlu := result.options[arg].value) is None
or isinstance(_vlu, EllipsisType)
)
else _vlu else _vlu
) )
# await musicreater_convert.finish( # await musicreater_convert.finish(
@ -663,8 +716,6 @@ async def _(
# ) # )
nonebot.logger.info(_args) nonebot.logger.info(_args)
if ((not superuser_permission) and (usr_id not in filesaves.keys())) or ( if ((not superuser_permission) and (usr_id not in filesaves.keys())) or (
superuser_permission superuser_permission
and ( and (
@ -777,12 +828,9 @@ async def _(
"music", "music",
random.random() % 0.5 + 0.3, random.random() % 0.5 + 0.3,
) )
if res is False: if not res:
buffer.write("中途退出,转换点不足:{}\n".format(pnt)) buffer.write("中途退出,转换点不足:{}\n".format(pnt))
return False return res
else:
return True
# return res, pnt
await linglun_convert.send(UniMessage.text("转换开始……")) await linglun_convert.send(UniMessage.text("转换开始……"))
@ -813,26 +861,25 @@ async def _(
else: else:
continue continue
if isinstance( identify_cmp = str(
msct_obj := query_convert_points(usr_id, "music", 0)[0], tuple (
) and ( os.path.splitext(to_convert_path.name)[0].replace(" ", "_"),
isinstance(msct_obj[0], Musicreater.MidiConvert)
and msct_obj[1]
== (
not _args["enable-mismatch-error"], not _args["enable-mismatch-error"],
_args["play-speed"], _args["play-speed"],
_args["default-tempo"], _args["default-tempo"],
pitched_notechart, pitched_notechart,
percussion_notechart, percussion_notechart,
volume_curve, volume_curve,
).__hash__()
) )
and (
msct_obj[0].music_name if identify_cmp in something_to_delete.keys():
== os.path.splitext(to_convert_path.name)[0].replace(" ", "_")
)
):
nonebot.logger.info("载入已有缓存。") nonebot.logger.info("载入已有缓存。")
msct_obj = msct_obj[0] msct_obj: Musicreater.MidiConvert = something_to_delete[
identify_cmp
][
"stuff"
] # type: ignore
msct_obj.redefine_execute_format(_args["old-execute-format"]) msct_obj.redefine_execute_format(_args["old-execute-format"])
msct_obj.set_min_volume(_args["minimal-volume"]) msct_obj.set_min_volume(_args["minimal-volume"])
# msct_obj.set_deviation() # msct_obj.set_deviation()
@ -849,21 +896,11 @@ async def _(
min_volume=_args["minimal-volume"], min_volume=_args["minimal-volume"],
vol_processing_func=volume_curve, vol_processing_func=volume_curve,
) )
query_convert_points( add_memory_to_delete(
usr_id, identify_cmp,
"music",
0,
(
msct_obj, msct_obj,
( "音乐转换类{}".format(msct_obj.music_name),
not _args["enable-mismatch-error"], 7,
_args["play-speed"],
_args["default-tempo"],
pitched_notechart,
percussion_notechart,
volume_curve,
),
),
) )
else: else:
buffer.write( buffer.write(
@ -1080,14 +1117,16 @@ async def _(
) )
await UniMessage.send(UniMessage.image(raw=img_bytes)) await UniMessage.send(UniMessage.image(raw=img_bytes))
global file_to_delete add_file_to_delete(fp, 1)
file_to_delete.append(fp)
# os.remove(fp)
await linglun_convert.finish( await linglun_convert.finish(
UniMessage.text( UniMessage.text(
"转换结束当前剩余转换点数⌊p⌋≈{:.2f}|{}".format( "转换结束当前剩余转换点数⌊p⌋≈{:.2f}|{}".format(
query_convert_points(usr_id, "music", 0, None)[1], query_convert_points(
usr_id,
"music",
0,
)[1],
configdict["maxPersonConvert"]["music"], configdict["maxPersonConvert"]["music"],
) )
), ),
@ -1164,7 +1203,11 @@ async def _(
"重置转换状况并修改点数成功!当前{}{}点数为⌊p⌋≈{:.2f}|{}".format( "重置转换状况并修改点数成功!当前{}{}点数为⌊p⌋≈{:.2f}|{}".format(
to_change, to_change,
v_item, v_item,
query_convert_points(to_change, v_item, -cd_value, None)[1], query_convert_points(
to_change,
v_item,
-cd_value,
)[1],
configdict["maxPersonConvert"][v_item], configdict["maxPersonConvert"][v_item],
) )
), ),

View File

@ -44,12 +44,13 @@ from src.utils.message.message import MarkdownMessage
from src.utils.message.html_tool import md_to_pic from src.utils.message.html_tool import md_to_pic
from .msctexec import ( from .msctexec import (
# people_convert_point, something_to_delete,
query_convert_points, query_convert_points,
filesaves, filesaves,
configdict, configdict,
temporary_dir, temporary_dir,
file_to_delete, add_file_to_delete,
add_memory_to_delete,
get_stored_path, get_stored_path,
) )
from .utils import hanzi_timeid from .utils import hanzi_timeid
@ -269,11 +270,9 @@ async def _(
"music", "music",
random.random() % 1.6 + 1.3, random.random() % 1.6 + 1.3,
) )
if res is False: if not res:
buffer.write("中途退出,转换点不足:{}\n".format(pnt)) buffer.write("中途退出,转换点不足:{}\n".format(pnt))
return False return res
else:
return True
await mspv_sync.send(UniMessage.text("转换开始……")) await mspv_sync.send(UniMessage.text("转换开始……"))
@ -299,28 +298,25 @@ async def _(
else: else:
continue continue
if isinstance( identify_cmp = str(
msct_obj := query_convert_points(usr_id, "music", 0)[0], tuple (
) and ( os.path.splitext(to_convert_path.name)[0].replace(" ", "_"),
isinstance(msct_obj[0], Musicreater.MidiConvert)
and (
msct_obj[1]
== (
not _args["enable-mismatch-error"], not _args["enable-mismatch-error"],
_args["play-speed"], _args["play-speed"],
_args["default-tempo"], _args["default-tempo"],
pitched_notechart, pitched_notechart,
percussion_notechart, percussion_notechart,
volume_curve, volume_curve,
).__hash__()
) )
)
and ( if identify_cmp in something_to_delete.keys():
msct_obj[0].music_name
== os.path.splitext(to_convert_path.name)[0].replace(" ", "_")
)
):
nonebot.logger.info("载入已有缓存。") nonebot.logger.info("载入已有缓存。")
msct_obj = msct_obj[0] msct_obj: Musicreater.MidiConvert = something_to_delete[
identify_cmp
][
"stuff"
] # type: ignore
else: else:
if go_chk_point(): if go_chk_point():
@ -333,21 +329,11 @@ async def _(
percussion_note_table=percussion_notechart, percussion_note_table=percussion_notechart,
vol_processing_func=volume_curve, vol_processing_func=volume_curve,
) )
query_convert_points( add_memory_to_delete(
usr_id, identify_cmp,
"music",
0,
(
msct_obj, msct_obj,
( "音乐转换类{}".format(msct_obj.music_name),
not _args["enable-mismatch-error"], 7,
_args["play-speed"],
_args["default-tempo"],
pitched_notechart,
percussion_notechart,
volume_curve,
),
),
) )
else: else:
buffer.write( buffer.write(
@ -440,8 +426,7 @@ async def _(
except nonebot.adapters.onebot.v11.exception.NetworkError as E: except nonebot.adapters.onebot.v11.exception.NetworkError as E:
buffer.write("文件上传发生网络错误:\n{}".format(E)) buffer.write("文件上传发生网络错误:\n{}".format(E))
global file_to_delete add_file_to_delete(fp, 1)
file_to_delete.append(fp)
img_bytes = await md_to_pic( img_bytes = await md_to_pic(
"##{}\n\n```\n{}\n```".format( "##{}\n\n```\n{}\n```".format(
@ -459,7 +444,7 @@ async def _(
UniMessage.text( UniMessage.text(
"成功转换:{}\n当前剩余转换点数⌊p⌋≈{:.2f}|{}".format( "成功转换:{}\n当前剩余转换点数⌊p⌋≈{:.2f}|{}".format(
"".join(all_files), "".join(all_files),
query_convert_points(usr_id, "music", 0, None)[1], query_convert_points(usr_id, "music", 0)[1],
configdict["maxPersonConvert"]["music"], configdict["maxPersonConvert"]["music"],
) )
), ),

View File

@ -16,7 +16,7 @@ def clamp(value: float, min_value: float, max_value: float) -> float | int:
return max(min(value, max_value), min_value) return max(min(value, max_value), min_value)
def convert_size(size: int, precision: int = 2, add_unit: bool = True, suffix: str = " XiB") -> str | float: def convert_size(size: int | float, precision: int = 2, add_unit: bool = True, suffix: str = " XiB") -> str | float:
"""把字节数转换为人类可读的字符串,计算正负 """把字节数转换为人类可读的字符串,计算正负
Args: Args: