😴优化协程,减少requests使用,另外,转换音乐时管理员可用全局之资源

This commit is contained in:
EillesWan 2024-08-22 01:56:58 +08:00
parent 3294c821f4
commit 31dfcb98f7
4 changed files with 159 additions and 142 deletions

View File

@ -1,7 +1,8 @@
import zhDateTime
import requests
import random
import aiohttp
import zhDateTime
from src.utils import event as event_utils
from src.utils.base.language import get_user_lang, get_default_lang_code, Language
from src.utils.base.ly_typing import T_Bot, T_MessageEvent
@ -65,9 +66,7 @@ yanlun = on_alconna(
)
yanlun_path = (
"https://nd.liteyuki.icu/api/v3/share/content/Xpue?path=null"
)
yanlun_path = "https://nd.liteyuki.icu/api/v3/share/content/Xpue?path=null"
# 每天4点更新
@ -77,7 +76,31 @@ async def every_day_update():
nonebot.logger.success(ulang.get("yanlun.refresh.success", COUNT=update_yanlun()))
def update_yanlun():
async def update_yanlun():
global yanlun_texts, yanlun_seqs
try:
async with aiohttp.ClientSession() as client:
resp = await client.get(yanlun_path)
yanlun_texts = (await resp.text()).strip("\n").split("\n")
except (ConnectionError, aiohttp.ClientError, aiohttp.WebSocketError) as E:
nonebot.logger.warning(f"读取言·论信息发生 客户端或通道 错误:\n{E}")
yanlun_texts = ["以梦想为驱使 创造属于自己的未来"]
# noinspection PyBroadException
except BaseException as E:
nonebot.logger.warning(f"读取言·论信息发生 未知 错误:\n{E}")
yanlun_texts = ["灵光焕发 深艺献心"]
yanlun_seqs = yanlun_texts.copy()
random.shuffle(yanlun_seqs)
return len(yanlun_texts)
@nonebot.get_driver().on_startup
async def _():
global yanlun_texts, yanlun_seqs
solar_datetime = zhDateTime.DateTime.now()
@ -86,37 +109,21 @@ def update_yanlun():
lunar_date = (lunar_datetime.lunar_month, lunar_datetime.lunar_day)
if solar_date == (4, 3):
yanlun_texts = ["金羿ELS 生日快乐~", "Happy Birthday, Eilles!"]
yanlun_seqs = yanlun_texts = ["金羿ELS 生日快乐~", "Happy Birthday, Eilles!"]
elif solar_date == (8, 6):
yanlun_texts = ["诸葛亮与八卦阵 生日快乐~", "Happy Birthday, bgArray~!"]
yanlun_seqs = yanlun_texts = [
"诸葛亮与八卦阵 生日快乐~",
"Happy Birthday, bgArray~!",
]
elif solar_date == (8, 16):
yanlun_texts = ["鱼旧梦 生日快乐~", "Happy Birthday, ElapsingDreams~!"]
yanlun_seqs = yanlun_texts = [
"鱼旧梦 生日快乐~",
"Happy Birthday, ElapsingDreams~!",
]
else:
try:
yanlun_texts = (
requests.get(
yanlun_path,
)
.text.strip("\n")
.split("\n")
)
except (ConnectionError, requests.HTTPError, requests.RequestException) as E:
nonebot.logger.warning(f"读取言·论信息发生 互联网连接 错误:\n{E}")
yanlun_texts = ["以梦想为驱使 创造属于自己的未来"]
# noinspection PyBroadException
except BaseException as E:
nonebot.logger.warning(f"读取言·论信息发生 未知 错误:\n{E}")
yanlun_texts = ["灵光焕发 深艺献心"]
yanlun_seqs = yanlun_texts.copy()
random.shuffle(yanlun_seqs)
return len(yanlun_texts)
yanlun_seqs = []
update_yanlun()
nonebot.logger.info("正在获取言·论信息")
nonebot.logger.success("成功取得 言·论 {}".format(await update_yanlun()))
def random_yanlun_text() -> str:
@ -188,46 +195,7 @@ async def _(
# print(result.options)
ulang = get_user_lang(event_utils.get_user_id(event)) # type: ignore
if result.options["refresh"].value:
global yanlun_texts
try:
yanlun_texts = (
requests.get(
yanlun_path,
)
.text.strip("\n")
.split("\n")
)
await yanlun.send(
UniMessage.text(
ulang.get("yanlun.refresh.success", COUNT=len(yanlun_texts))
)
)
except (ConnectionError, requests.HTTPError, requests.RequestException) as E:
await yanlun.send(
UniMessage.text(
ulang.get(
"yanlun.refresh.failed",
ERR=ulang.get("yanlun.errtype.net"),
ERRCODE=f"\n{E}",
)
)
)
yanlun_texts = ["以梦想为驱使 创造属于自己的未来"]
# noinspection PyBroadException
except BaseException as E:
await yanlun.send(
UniMessage.text(
ulang.get(
"yanlun.refresh.failed",
ERR=ulang.get("yanlun.errtype.unknown"),
ERRCODE=f"\n{E}",
)
)
)
yanlun_texts = ["灵光焕发 深艺献心"]
yanlun_seqs = yanlun_texts.copy()
random.shuffle(yanlun_seqs)
await update_yanlun()
if result.options["count"].value:
authors = [
(

View File

@ -1,19 +1,18 @@
import os
import sys
import time
import json
import random
# import uuid
import shutil
import asyncio
from io import StringIO
from pathlib import Path
from typing import Annotated, Any
from typing import Annotated, Any, Union
# from nonebot import require
import requests
import aiohttp
import zhDateTime
import Musicreater
@ -39,8 +38,8 @@ import nonebot.adapters
import nonebot.drivers
import nonebot.rule
from nonebot.params import CommandArg
from nonebot.permission import SUPERUSER
# from nonebot.params import CommandArg
from nonebot.permission import SUPERUSER, SuperUser
from nonebot.adapters.onebot.v11.event import (
GroupUploadNoticeEvent,
GroupMessageEvent,
@ -56,7 +55,7 @@ from src.utils.base.language import get_user_lang
from src.utils.message.message import MarkdownMessage
from .execute_auto_translator import auto_translate # type: ignore
from .utils import utime_hanzify
from .utils import hanzi_timeid
nonebot.require("nonebot_plugin_alconna")
nonebot.require("nonebot_plugin_apscheduler")
@ -182,6 +181,26 @@ def query_convert_points(
return store, people_convert_point[usr_id][item]["point"]
def get_stored_path(
user_id: str, item: Union[Path, os.PathLike], superuser: bool = False
) -> Path:
if not isinstance(item, Path):
item_ = Path(item).name
else:
item_ = item.name
result_dest = database_dir / user_id / item_
if not result_dest.exists() and superuser:
for usr_id_ in filesaves.keys():
if (result_dest_ := database_dir / usr_id_ / item_).exists():
result_dest = result_dest_
break
return result_dest
# 每天4点更新
@scheduler.scheduled_job("cron", hour=4)
async def every_day_update():
@ -195,7 +214,7 @@ async def every_day_update():
async def _():
nonebot.logger.info("正在删除临时文件目录")
while temporary_dir.exists():
time.sleep(1)
await asyncio.sleep(1)
try:
shutil.rmtree(temporary_dir)
except Exception as E:
@ -331,12 +350,12 @@ async def _(
os.makedirs(savepath, exist_ok=True)
(savepath / file_infomation["name"]).open("wb").write(
requests.get(
file_infomation["url"],
verify=False,
).content
)
async with aiohttp.ClientSession() as client:
resp = await client.get(file_infomation["url"], verify_ssl=False)
(savepath / file_infomation["name"]).open("wb").write(
await resp.content.read()
)
now = zhDateTime.DateTime.now()
try:
filesaves[usr_id][file_infomation["name"]] = {
@ -586,9 +605,13 @@ async def _(
nonebot.logger.info(result.options)
usr_id = str(event.user_id)
usr_id = event.get_user_id()
if (qres := query_convert_points(usr_id, "music"))[0] is False:
superuser_permission = await SUPERUSER(bot, event)
if ((qres := query_convert_points(usr_id, "music"))[0] is False) and (
not superuser_permission
):
await linglun_convert.finish(
UniMessage.text(
"转换点数不足当前剩余⌊p⌋≈{:.2f}|{}".format(
@ -599,7 +622,9 @@ async def _(
at_sender=True,
)
if usr_id not in filesaves.keys():
if (usr_id not in filesaves.keys()) and (
superuser_permission and not len(filesaves)
):
await linglun_convert.finish(
UniMessage.text("服务器内未存入你的任何文件请先使用上传midi文件吧")
)
@ -643,7 +668,7 @@ async def _(
# )
nonebot.logger.info(_args)
usr_data_path = database_dir / usr_id
# usr_data_path = database_dir / usr_id
(usr_temp_path := temporary_dir / usr_id).mkdir(exist_ok=True)
if (_ppnt := _args["pitched-note-table"].lower()) in [
@ -660,7 +685,11 @@ async def _(
else Musicreater.MM_TOUCH_PITCHED_INSTRUMENT_TABLE
)
)
elif (_ppnt := (usr_data_path / _args["pitched-note-table"])).exists():
elif (
_ppnt := get_stored_path(
usr_id, _args["pitched-note-table"], superuser_permission
)
).exists():
pitched_notechart = Musicreater.MM_TOUCH_PITCHED_INSTRUMENT_TABLE.copy()
pitched_notechart.update(json.load(_ppnt.open("r")))
else:
@ -683,7 +712,11 @@ async def _(
else Musicreater.MM_TOUCH_PERCUSSION_INSTRUMENT_TABLE
)
)
elif (_ppnt := (usr_data_path / _args["percussion-note-table"])).exists():
elif (
_ppnt := get_stored_path(
usr_id, _args["percussion-note-table"], superuser_permission
)
).exists():
percussion_notechart = Musicreater.MM_TOUCH_PERCUSSION_INSTRUMENT_TABLE.copy()
percussion_notechart.update(json.load(_ppnt.open("r")))
else:
@ -762,7 +795,14 @@ async def _(
if file_to_convert.endswith(".mid") or file_to_convert.endswith(".midi"):
nonebot.logger.info("载入转换文件:{}".format(file_to_convert))
all_files[file_to_convert] = {}
to_convert_path = get_stored_path(
usr_id, file_to_convert, superuser_permission
)
if to_convert_path.is_file():
all_files[to_convert_path.name] = {}
else:
continue
if isinstance(
msct_obj := query_convert_points(usr_id, "music", 0)[0], tuple
@ -779,9 +819,7 @@ async def _(
)
and (
msct_obj[0].music_name
== os.path.splitext(
os.path.basename(usr_data_path / file_to_convert)
)[0].replace(" ", "_")
== os.path.splitext(to_convert_path.name)[0].replace(" ", "_")
)
):
nonebot.logger.info("载入已有缓存。")
@ -792,7 +830,7 @@ async def _(
else:
if go_chk_point():
msct_obj = Musicreater.MidiConvert.from_midi_file(
midi_file_path=usr_data_path / file_to_convert,
midi_file_path=str(to_convert_path),
mismatch_error_ignorance=not _args["enable-mismatch-error"],
play_speed=_args["play-speed"],
default_tempo=_args["default-tempo"],
@ -821,10 +859,10 @@ async def _(
else:
buffer.write(
"点数不足或出现错误:{}".format(
_args,
to_convert_path.name,
)
)
break
continue
# people_convert_point[usr_id] += 0.5
@ -956,15 +994,15 @@ async def _(
"无可供转换的文件",
)
await linglun_convert.finish(
UniMessage("不是哥们,二氧化碳咱这转不成面包,那是中科院的事。")
UniMessage(
"不是哥/姐/Any们二氧化碳咱这转不成面包那是中科院的事。\n*所指向之文件皆不存在"
)
)
except Exception as e:
nonebot.logger.error("转换存在错误:{}".format(e))
buffer.write(
"[ERROR] {}\n".format(e).replace(
"C:\\Users\\Administrator\\Desktop\\RyBot\\", "[]"
)
"[ERROR] {}\n".format(e).replace(str(Path(__file__).parent.resolve()), "[]")
)
sys.stdout = sys.__stdout__
@ -975,11 +1013,7 @@ async def _(
fp := str(
(
temporary_dir
/ (
fn := "msctr[{}]-{}.zip".format(
utime_hanzify(zhDateTime.DateTime.now().to_lunar()), usr_id
)
)
/ (fn := "msctr[{}]-{}.zip".format(hanzi_timeid(), usr_id))
).resolve()
),
)

View File

@ -5,20 +5,19 @@ import shutil
import random
from io import StringIO
# from pathlib import Path
from pathlib import Path
# import nonebot.rule
import nonebot
import soundfile
import zhDateTime
import Musicreater
import Musicreater.plugin
import nonebot.adapters.onebot.v11.exception
from .MusicPreview.main import PreviewMusic
from nonebot.permission import SUPERUSER
from nonebot.adapters.onebot.v11.event import (
GroupMessageEvent,
PrivateMessageEvent,
@ -48,11 +47,11 @@ from .msctexec import (
query_convert_points,
filesaves,
configdict,
database_dir,
temporary_dir,
file_to_delete,
get_stored_path,
)
from .utils import utime_hanzify
from .utils import hanzi_timeid
mspv_sync = on_alconna(
Alconna(
@ -109,13 +108,16 @@ async def _(
event: GroupMessageEvent | PrivateMessageEvent,
bot: T_Bot,
):
# print("E:\\Work2024\\test-midi\\" + name.result)
nonebot.logger.info(result.options)
usr_id = str(event.user_id)
usr_id = event.get_user_id()
if (qres := query_convert_points(usr_id, "music"))[0] is False:
superuser_permission = await SUPERUSER(bot, event)
if ((qres := query_convert_points(usr_id, "music"))[0] is False) and (
not superuser_permission
):
await mspv_sync.finish(
UniMessage.text(
"转换点数不足当前剩余⌊p⌋≈{:.2f}|{}".format(
@ -126,7 +128,9 @@ async def _(
at_sender=True,
)
if usr_id not in filesaves.keys():
if (usr_id not in filesaves.keys()) and (
superuser_permission and not len(filesaves)
):
await mspv_sync.finish(
UniMessage.text("服务器内未存入你的任何文件请先使用上传midi文件吧")
)
@ -173,7 +177,7 @@ async def _(
)
)
usr_data_path = database_dir / usr_id
# usr_data_path = database_dir / usr_id
(usr_temp_path := temporary_dir / usr_id).mkdir(exist_ok=True)
if (_ppnt := _args["pitched-note-table"].lower()) in [
@ -190,7 +194,11 @@ async def _(
else Musicreater.MM_TOUCH_PITCHED_INSTRUMENT_TABLE
)
)
elif (_ppnt := (usr_data_path / _args["pitched-note-table"])).exists():
elif (
_ppnt := get_stored_path(
usr_id, _args["pitched-note-table"], superuser_permission
)
).exists():
pitched_notechart = Musicreater.MM_TOUCH_PITCHED_INSTRUMENT_TABLE.copy()
pitched_notechart.update(json.load(_ppnt.open("r")))
else:
@ -213,7 +221,11 @@ async def _(
else Musicreater.MM_TOUCH_PERCUSSION_INSTRUMENT_TABLE
)
)
elif (_ppnt := (usr_data_path / _args["percussion-note-table"])).exists():
elif (
_ppnt := get_stored_path(
usr_id, _args["percussion-note-table"], superuser_permission
)
).exists():
percussion_notechart = Musicreater.MM_TOUCH_PERCUSSION_INSTRUMENT_TABLE.copy()
percussion_notechart.update(json.load(_ppnt.open("r")))
else:
@ -274,6 +286,14 @@ async def _(
# print("1")
# await mspv_sync.finish("处理中")
to_convert_path = get_stored_path(
usr_id, file_to_convert, superuser_permission
)
if to_convert_path.is_file():
all_files.append(to_convert_path.name)
else:
continue
if isinstance(
msct_obj := query_convert_points(usr_id, "music", 0)[0], tuple
) and (
@ -291,9 +311,7 @@ async def _(
)
and (
msct_obj[0].music_name
== os.path.splitext(
os.path.basename(usr_data_path / file_to_convert)
)[0].replace(" ", "_")
== os.path.splitext(to_convert_path.name)[0].replace(" ", "_")
)
):
nonebot.logger.info("载入已有缓存。")
@ -302,7 +320,7 @@ async def _(
if go_chk_point():
msct_obj = Musicreater.MidiConvert.from_midi_file(
midi_file_path=usr_data_path / file_to_convert,
midi_file_path=str(to_convert_path),
mismatch_error_ignorance=not _args["enable-mismatch-error"],
play_speed=_args["play-speed"],
default_tempo=_args["default-tempo"],
@ -329,12 +347,10 @@ async def _(
else:
buffer.write(
"点数不足或出现错误:\n{}".format(
_args,
to_convert_path.name,
)
)
break
all_files.append(file_to_convert)
continue
music_temp = PreviewMusic(
msct_obj,
@ -379,15 +395,15 @@ async def _(
"无可供转换的文件",
)
await mspv_sync.finish(
UniMessage("我服了老弟,这机器人也不能给路易十六理发啊。")
UniMessage(
"我服了老弟,这机器人也不能给路易十六理发啊。\n*所指向之文件皆不存在"
)
)
except Exception as e:
nonebot.logger.error("合成存在错误:{}".format(e))
buffer.write(
"[ERROR] {}\n".format(e).replace(
"C:\\Users\\Administrator\\Desktop\\RyBot\\", "[]"
)
"[ERROR] {}\n".format(e).replace(str(Path(__file__).parent.resolve()), "[]")
)
sys.stdout = sys.__stdout__
@ -398,11 +414,7 @@ async def _(
usr_temp_path,
fp := str(
temporary_dir
/ (
fn := "mprwav[{}]{}.zip".format(
utime_hanzify(zhDateTime.DateTime.now().to_lunar()), usr_id
)
)
/ (fn := "mprwav[{}]{}.zip".format(hanzi_timeid(), usr_id))
),
)

View File

@ -1,9 +1,12 @@
import zhDateTime
from typing import Optional
def utime_hanzify(
zhd: zhDateTime.zhDateTime = zhDateTime.DateTime.now().to_lunar(),
def hanzi_timeid(
zhd: Optional[zhDateTime.zhDateTime] = None,
) -> str:
if not zhd:
zhd = zhDateTime.DateTime.now().to_lunar()
return "{地支时}{刻}{分}{秒}".format(
地支时=zhDateTime.DÌZHĪ[zhd.shichen]
+ (