From 31dfcb98f7c188ea5d290d5ab90486ca43ee4ad4 Mon Sep 17 00:00:00 2001 From: EillesWan Date: Thu, 22 Aug 2024 01:56:58 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=98=B4=E4=BC=98=E5=8C=96=E5=8D=8F?= =?UTF-8?q?=E7=A8=8B=EF=BC=8C=E5=87=8F=E5=B0=91requests=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=EF=BC=8C=E5=8F=A6=E5=A4=96=EF=BC=8C=E8=BD=AC=E6=8D=A2=E9=9F=B3?= =?UTF-8?q?=E4=B9=90=E6=97=B6=E7=AE=A1=E7=90=86=E5=91=98=E5=8F=AF=E7=94=A8?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E4=B9=8B=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/nonebot_plugins/liteyuki_status/status.py | 114 +++++++----------- .../trimo_plugin_msctconverter/msctexec.py | 108 +++++++++++------ .../trimo_plugin_msctconverter/mspvexec.py | 70 ++++++----- .../trimo_plugin_msctconverter/utils.py | 9 +- 4 files changed, 159 insertions(+), 142 deletions(-) diff --git a/src/nonebot_plugins/liteyuki_status/status.py b/src/nonebot_plugins/liteyuki_status/status.py index 2ff5a87..bcf0b89 100644 --- a/src/nonebot_plugins/liteyuki_status/status.py +++ b/src/nonebot_plugins/liteyuki_status/status.py @@ -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 = [ ( diff --git a/src/nonebot_plugins/trimo_plugin_msctconverter/msctexec.py b/src/nonebot_plugins/trimo_plugin_msctconverter/msctexec.py index bf6eccc..86470ff 100644 --- a/src/nonebot_plugins/trimo_plugin_msctconverter/msctexec.py +++ b/src/nonebot_plugins/trimo_plugin_msctconverter/msctexec.py @@ -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() ), ) diff --git a/src/nonebot_plugins/trimo_plugin_msctconverter/mspvexec.py b/src/nonebot_plugins/trimo_plugin_msctconverter/mspvexec.py index cbfa26e..fe78b71 100644 --- a/src/nonebot_plugins/trimo_plugin_msctconverter/mspvexec.py +++ b/src/nonebot_plugins/trimo_plugin_msctconverter/mspvexec.py @@ -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)) ), ) diff --git a/src/nonebot_plugins/trimo_plugin_msctconverter/utils.py b/src/nonebot_plugins/trimo_plugin_msctconverter/utils.py index f3bea81..c2103de 100644 --- a/src/nonebot_plugins/trimo_plugin_msctconverter/utils.py +++ b/src/nonebot_plugins/trimo_plugin_msctconverter/utils.py @@ -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] + (