diff --git a/LittlePaimon/database/models/abyss_info.py b/LittlePaimon/database/models/abyss_info.py index a54b65b..7fe5a32 100644 --- a/LittlePaimon/database/models/abyss_info.py +++ b/LittlePaimon/database/models/abyss_info.py @@ -6,7 +6,6 @@ from tortoise import fields from tortoise.models import Model from LittlePaimon.utils.alias import get_name_by_id -from LittlePaimon.utils.files import save_json from .player_info import PlayerInfo @@ -216,6 +215,8 @@ class AbyssInfo(Model): if 'floors' in data and data['floors']: info.total_star = 0 for floor in data['floors']: + if floor['index'] not in [9, 10, 11, 12]: + continue floor_info = FloorInfo(index=floor['index'], is_unlock=floor['is_unlock'], stars=[l['star'] for l in floor['levels']]) @@ -245,8 +246,7 @@ class AbyssInfo(Model): floor_info.end_times_up = end_times_up floor_info.end_times_down = end_times_down info.floors[floor['index']] = floor_info - if floor['index'] in [9, 10, 11, 12]: - info.total_star += sum(int(l['star']) for l in floor['levels']) + info.total_star += sum(int(l['star']) for l in floor['levels']) info.update_time = datetime.datetime.now() await info.save() diff --git a/LittlePaimon/plugins/Paimon_Wiki/__init__.py b/LittlePaimon/plugins/Paimon_Wiki/__init__.py index d0180cc..9998fa9 100644 --- a/LittlePaimon/plugins/Paimon_Wiki/__init__.py +++ b/LittlePaimon/plugins/Paimon_Wiki/__init__.py @@ -18,7 +18,6 @@ from LittlePaimon.config import RESOURCE_BASE_PATH from .draw_map import init_map, draw_map, get_full_map from .draw_daily_material import draw_material -# from .abyss_rate_draw import draw_rate_rank, draw_teams_rate __paimon_help__ = { 'type': '原神Wiki', @@ -71,20 +70,6 @@ generate_map = on_command('生成地图', priority=1, block=True, permission=SUP }) -# abyss_rate = on_command('syrate', aliases={'深渊登场率', '深境螺旋登场率', '深渊登场率排行', '深渊排行'}, priority=11, block=True, state={ -# 'pm_name': '深渊登场率排行', -# 'pm_description': '查看本期深渊的角色登场率排行', -# 'pm_usage': '深渊登场率', -# 'pm_priority': 9, -# }) -# abyss_team = on_regex(r'^(深渊|深境螺旋)(?P上半|下半)阵容(排行|出场率)?$', priority=11, block=True, state={ -# 'pm_name': '深渊阵容出场率排行', -# 'pm_description': '查看本期深渊的阵容出场率排行', -# 'pm_usage': '深渊<上半|下半>阵容排行', -# 'pm_priority': 10, -# }) - - @daily_material.handle() async def _(event: MessageEvent, regex_dict: dict = RegexDict()): await daily_material.send('开始获取每日材料,请稍候...') diff --git a/LittlePaimon/plugins/Paimon_Wiki/abyss_rate_data.py b/LittlePaimon/plugins/Paimon_Wiki/abyss_rate_data.py deleted file mode 100644 index 8a9cd27..0000000 --- a/LittlePaimon/plugins/Paimon_Wiki/abyss_rate_data.py +++ /dev/null @@ -1,49 +0,0 @@ -from LittlePaimon.utils import aiorequests - -# 数据源自微信公众号原神创意工坊 -headers = { - 'Host': 'www.youchuang.fun', - 'Referer': 'https://servicewechat.com/wxce4dbe0cb0f764b3/52/page-frame.html', - 'User-Agent': 'Mozilla/5.0 (iPad; CPU OS 15_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) ' - 'Mobile/15E148 MicroMessenger/8.0.20(0x1800142f) NetType/WIFI Language/zh_CN', - 'content-type': 'application/json' -} - - -async def get_rate(type: str = 'role'): - url = f'https://www.youchuang.fun/gamerole/{type}Rate' - json_data = { - "version": "3.0" - } - res = await aiorequests.post(url=url, headers=headers, json=json_data) - return res.json() - - -async def get_formation_rate(layer: int = 1): - url = 'https://www.youchuang.fun/gamerole/formationRate' - json_data = { - "version": "3.0", - "layer": layer - } - res = await aiorequests.post(url=url, headers=headers, json=json_data) - return res.json() - - -async def get_teammates_rate(name: str): - url = 'https://www.youchuang.fun/gamerole/teammatesRate' - json_data = { - "name": name, - "version": "3.0" - } - res = await aiorequests.post(url=url, headers=headers, json=json_data) - return res.json() - - -async def get_weapon_rate(name: str): - url = 'https://www.youchuang.fun/gamerole/getWeaponByName' - json_data = { - "name": name, - "version": "3.9" - } - res = await aiorequests.post(url=url, headers=headers, json=json_data) - return res.json() diff --git a/LittlePaimon/plugins/Paimon_Wiki/abyss_rate_draw.py b/LittlePaimon/plugins/Paimon_Wiki/abyss_rate_draw.py deleted file mode 100644 index d86e010..0000000 --- a/LittlePaimon/plugins/Paimon_Wiki/abyss_rate_draw.py +++ /dev/null @@ -1,79 +0,0 @@ -from PIL import Image, ImageDraw, ImageFont - -from LittlePaimon.utils.files import load_image -from LittlePaimon.utils.image import PMImage, font_manager as fm -from LittlePaimon.utils.alias import get_chara_icon -from LittlePaimon.utils.message import MessageBuild -from LittlePaimon.config import RESOURCE_BASE_PATH -from .abyss_rate_data import get_rate, get_formation_rate - - -async def draw_rate_rank(type: str = 'role'): - data = await get_rate(type) - if not data or data['code'] != '200': - return '获取工坊数据失败,请稍后再试' - col = len(data['result']['rateList']) // 5 if len(data['result']['rateList']) % 5 == 0 else len( - data['result']['rateList']) // 5 + 1 - - top_img = await load_image(RESOURCE_BASE_PATH / 'general' / '卡片顶部无字.png', size=(1080, 316)) - body_img = await load_image(RESOURCE_BASE_PATH / 'general' / '卡片身体.png', size=(1080, 226)) - bottom_img = await load_image(RESOURCE_BASE_PATH / 'general' / '卡片底部.png', size=(1080, 72)) - bg_img = PMImage(size=(1080, top_img.height + col * 220 + bottom_img.height + 50), mode='RGBA') - await bg_img.paste(top_img, (0, 0)) - await bg_img.text('3.0深境螺旋登场率排行榜', 70, 55, color='black', font=fm.get('msyhbd.ttc', 40)) - await bg_img.text(f'当前共{data["result"]["userCount"]}份样本数据', 70, 110, color='black', font=fm.get('msyh.ttc', 35)) - for i in range(col + 1): - await bg_img.paste(body_img, (0, top_img.height + i * body_img.height)) - await bg_img.paste(bottom_img, (0, top_img.height + col * 220 + 50)) - await bg_img.text('Created by LittlePaimon | Data from 原神创意工坊', 130, bg_img.height - 86, color='black', - font=fm.get('msyh.ttc', 35)) - for n, role in enumerate(data['result']['rateList']): - role_card = PMImage(size=(160, 200), color=(200, 200, 200, 255), mode='RGBA') - role_img = await load_image(RESOURCE_BASE_PATH / 'avatar_card' / f'{get_chara_icon(name=role["name"], icon_type="card")}.png', size=(160, 160)) - await role_card.paste(role_img, (0, 0)) - await role_card.text((28 if len(role['rate']) == 6 else 38, 158), role['rate'], font=fm.get('msyh.ttc', 30), - color='black') - await bg_img.paste(role_card, (50 + 204 * (n % 5), 180 + 240 * int(n / 5))) - return MessageBuild.Image(bg_img, quality=75) - - -# async def draw_teams_rate(floor='上半半'): -# data = await get_formation_rate(1 if floor == '上半' else 2) -# if not data or data['code'] != '200': -# return '获取工坊数据失败,请稍后再试' -# rateList = data['result']['rateList'][:10] -# top_img = Image.open(RESOURCE_BASE_PATH / 'general' / '卡片顶部无字.png').resize((1080, 316)) -# -# body_img = Image.open(RESOURCE_BASE_PATH / 'general' / '卡片身体.png').resize((1080, 240)) -# -# bottom_img = Image.open(RESOURCE_BASE_PATH / 'general' / '卡片底部.png').resize((1080, 72)) -# -# bg_img = Image.new('RGBA', (1080, top_img.height + 10 * body_img.height + bottom_img.height - 130)) -# -# bg_img.paste(top_img, (0, 0)) -# bg_draw = ImageDraw.Draw(bg_img) -# bg_draw.text((70, 55), f'3.0深境螺旋阵容出场率 | {floor}', fill='black', font=fm.get('msyhbd.ttc', 40)) -# -# bg_draw.text((70, 110), f'当前共{data["result"]["userCount"]}份样本数据', fill='black', font=fm.get('msyh.ttc', 35)) -# -# for i in range(10): -# bg_img.paste(body_img, (0, top_img.height + i * body_img.height)) -# bg_img.paste(bottom_img, (0, top_img.height + 10 * 240 - 130)) -# bg_draw.text((130, bg_img.height - 86), 'Created by LittlePaimon | Data from 原神创意工坊', fill='black', -# font=fm.get('msyh.ttc', 35)) -# -# for n, team in enumerate(rateList): -# bg_draw.text((48, 240 + 240 * n), '排名', fill='grey', font=get_font(30)) -# bg_draw.text((65 if n != 9 else 55, 275 + 240 * n), str(n + 1), fill='black', font=fm.get('msyh.ttc', 35)) -# -# bg_draw.text((934, 240 + 240 * n), '出场率', fill='grey', font=get_font(30)) -# bg_draw.text((930, 275 + 240 * n), team['rate'], fill='black', font=fm.get('msyh.ttc', 35)) -# -# for r, role in enumerate(team['formation']): -# role_img = Image.open(CARD / f'{get_icon(name=role["name"], icon_type="card")}.png').resize((160, 200)) -# -# role_draw = ImageDraw.Draw(role_img) -# role_draw.text((80 - 15 * len(role['name']), 158), role['name'], font=get_font(30), fill='black') -# -# bg_img.alpha_composite(role_img, (130 + 204 * r, 180 + 240 * n)) -# return MessageBuild.Image(bg_img, quality=75) diff --git a/LittlePaimon/utils/requests.py b/LittlePaimon/utils/requests.py index d62555a..b546d6d 100644 --- a/LittlePaimon/utils/requests.py +++ b/LittlePaimon/utils/requests.py @@ -127,14 +127,17 @@ class aiorequests: return img @staticmethod - async def download(url: str, save_path: Path): + async def download(url: str, save_path: Path, exclude_json: bool = False): """ 下载文件(带进度条) :param url: url :param save_path: 保存路径 + :param exclude_json: 是否排除json文件 """ save_path.parent.mkdir(parents=True, exist_ok=True) async with httpx.AsyncClient().stream(method='GET', url=url, follow_redirects=True) as datas: + if exclude_json and 'application/json' in str(datas.headers['Content-Type']): + raise Exception('file not match type') size = int(datas.headers['Content-Length']) f = save_path.open('wb') async for chunk in tqdm.asyncio.tqdm(iterable=datas.aiter_bytes(1), diff --git a/LittlePaimon/utils/tool.py b/LittlePaimon/utils/tool.py index 246e158..6f344cd 100644 --- a/LittlePaimon/utils/tool.py +++ b/LittlePaimon/utils/tool.py @@ -94,7 +94,7 @@ async def check_resource(): flag = True try: await aiorequests.download(url=f'http://img.genshin.cherishmoon.fun/resources/{resource["path"]}', - save_path=file_path) + save_path=file_path, exclude_json=resource['path'].split('.')[-1] != 'json') await asyncio.sleep(0.5) except Exception as e: logger.warning('资源检查', f'下载{resource["path"].split("/")[-1]}出错: {e}') diff --git a/LittlePaimon/web/pages/login.py b/LittlePaimon/web/pages/login.py index 1f44143..d9835db 100644 --- a/LittlePaimon/web/pages/login.py +++ b/LittlePaimon/web/pages/login.py @@ -1,5 +1,5 @@ from LittlePaimon import __version__ -from amis import Form, InputText, InputPassword, DisplayModeEnum, Horizontal, Remark, Html, Page, Container, AmisAPI +from amis import Form, InputText, InputPassword, DisplayModeEnum, Horizontal, Remark, Html, Page, AmisAPI, Wrapper logo = Html(html=f'''

@@ -34,5 +34,5 @@ login_form = Form(api=login_api, title='', body=[ InputPassword(name='password', label='密码', labelRemark=Remark(content='默认为admin,可以在paimon_config.json中修改')), # Switch(name='is_admin', label='身份组', onText='管理员', offText='用户', labelRemark=Remark(content='是否以管理员身份登录')) ], mode=DisplayModeEnum.horizontal, horizontal=Horizontal(left=3, right=9, offset=5), redirect='/LittlePaimon/admin') -body = Container(style={'width': '400px', 'margin': '0 auto'}, body=login_form) +body = Wrapper(className='w-2/5 mx-auto my-0 m:w-full', body=login_form) login_page = Page(title='', body=[logo, body])