🍱 使用本地资源进行面板更新 (#658)

This commit is contained in:
KimigaiiWuyi 2024-11-21 12:02:20 +08:00
parent eeba0691b7
commit 17c0250356
9 changed files with 4797 additions and 78 deletions

View File

@ -6,11 +6,10 @@ from copy import deepcopy
from typing import Dict, List, Union, Literal, Optional
import aiofiles
from httpx import ReadTimeout, ConnectTimeout
from httpx import ReadTimeout
from gsuid_core.utils.error_reply import UID_HINT
from gsuid_core.utils.api.enka.models import EnkaData
from gsuid_core.utils.api.enka.request import get_enka_info
from gsuid_core.utils.api.minigg.request import get_weapon_info
from .mono.Character import Character
from ..utils.api.cv.request import _CvApi
@ -31,6 +30,9 @@ from ..utils.map.GS_MAP_PATH import (
avatarName2Element,
)
# from gsuid_core.utils.api.minigg.request import get_weapon_info
PROP_ATTR_MAP = {
'Anemo': '44',
'Cryo': '46',
@ -316,10 +318,12 @@ async def enka_to_dict(
weapon_info['weaponStats'].append(weapon_prop_temp)
# 武器特效须请求API
'''
try:
effect_raw = await get_weapon_info(weapon_info['weaponName'])
except ConnectTimeout:
effect_raw = await convert_ambr_to_weapon(weapon_info['itemId'])
except: # noqa
'''
effect_raw = await convert_ambr_to_weapon(weapon_info['itemId'])
if (
not isinstance(effect_raw, List)

View File

@ -39,11 +39,17 @@ from GenshinUID.utils.map.GS_MAP_PATH import ( # noqa: E402
)
from ..version import Genshin_version # noqa: E402
from ..utils.ambr_to_minigg import convert_ambr_to_minigg # noqa: E402
from ..utils.ambr_to_minigg import ( # noqa: E402
get_ambr_char_data,
get_ambr_weapon_data,
convert_ambr_to_minigg,
)
R_PATH = Path(__file__).parents[0]
MAP_PATH = Path(__file__).parents[1] / 'utils' / 'map' / 'data'
DATA_PATH = R_PATH / 'gs_data'
CHAR_PATH = DATA_PATH / 'char'
WEAPON_PATH = DATA_PATH / 'weapon'
WEAPON_TYPE = {
'WEAPON_POLE': '长柄武器',
'WEAPON_BOW': '',
@ -54,7 +60,7 @@ WEAPON_TYPE = {
version = Genshin_version
raw_data = {}
weaponList = {}
BETA_CHAR = {
'10000100': '卡齐娜',
@ -62,6 +68,9 @@ BETA_CHAR = {
'10000102': '玛拉妮',
}
CHAR_PATH.mkdir(exist_ok=True)
WEAPON_PATH.mkdir(exist_ok=True)
async def weaponId2Name():
result = {}
@ -318,6 +327,7 @@ async def avatarName2ElementJson() -> None:
data = await convert_ambr_to_minigg(_id)
except json.decoder.JSONDecodeError:
data = await convert_ambr_to_minigg(_id)
if data is not None and 'code' not in data:
temp[name] = elementMap[data['elementText']]
try:
@ -492,6 +502,7 @@ async def artifact2attrJson() -> None:
async def restore_hakush_data():
global weaponList
data = await get_hakush_char_list()
data2 = await get_hakush_weapon_list()
@ -501,6 +512,8 @@ async def restore_hakush_data():
with open(MAP_PATH / weaponList_fileName, 'w', encoding='UTF-8') as f:
json.dump(data2, f, ensure_ascii=False)
weaponList = data2
async def restore_mysData():
base_url = 'https://api-takumi.mihoyo.com'
@ -509,7 +522,33 @@ async def restore_mysData():
json.dump(resp.json(), f, ensure_ascii=False)
async def save_all_weapon_data():
global weaponList
if not weaponList:
with open(MAP_PATH / weaponList_fileName, 'r', encoding='UTF-8') as f:
weaponList = json.load(f)
for i in weaponList:
print(i)
data = await get_ambr_weapon_data(i)
if data:
with open(WEAPON_PATH / f'{i}.json', 'w', encoding='UTF-8') as f:
json.dump(data, f, ensure_ascii=False)
async def save_all_char_data():
with open(MAP_PATH / charList_fileName, 'r', encoding='UTF-8') as f:
charList = json.load(f)
for i in charList:
print(i)
rdata = await get_ambr_char_data(i)
with open(CHAR_PATH / f'{i}.json', 'w', encoding='UTF-8') as f:
json.dump(rdata, f, ensure_ascii=False)
async def main():
'''
await download_new_file()
await restore_mysData()
await restore_hakush_data()
@ -529,6 +568,9 @@ async def main():
await artifact2attrJson()
await weaponId2Name()
await avatarId2SkillGroupList()
'''
await save_all_weapon_data()
await save_all_char_data()
asyncio.run(main())

View File

@ -1,6 +1,8 @@
import re
import json
from typing import List, Union, Optional, TypedDict, cast
import aiofiles
from gsuid_core.utils.api.minigg.models import CharacterTalents
from gsuid_core.utils.api.ambr.request import (
get_ambr_char_data,
@ -8,6 +10,7 @@ from gsuid_core.utils.api.ambr.request import (
)
from .map.grow_curve import GROW_CURVE_LIST, WEAPON_GROW_CURVE
from ..utils.resource.RESOURCE_PATH import CHAR_DATA_PATH, WEAPON_DATA_PATH
PROP_MAP = {
'FIGHT_PROP_BASE_HP': '基础生命值',
@ -111,12 +114,73 @@ class ConvertCharacter(TypedDict):
defense: float
async def convert_exist_data_to_char(
char_id: Union[str, int]
) -> ConvertCharacter:
path = CHAR_DATA_PATH / f'{char_id}.json'
if path.exists():
async with aiofiles.open(path, 'r', encoding='utf-8') as f:
raw_data = json.loads(await f.read())
else:
raw_data = await get_ambr_char_data(char_id)
if raw_data is None:
raise Exception('[AmbrData] 未找到该角色/数据无法下载!')
# 保存
async with aiofiles.open(path, 'w', encoding='utf-8') as f:
await f.write(json.dumps(raw_data))
result = {
'name': raw_data['name'],
'title': raw_data['fetter']['title'],
'rarity': raw_data['rank'],
'weapontype': WEAPON_TYPE[raw_data['weaponType']],
'elementText': ELEMENT_MAP[raw_data['element']],
'element': ELEMENT_MAP[raw_data['element']],
'images': {'namesideicon': raw_data['icon']}, # 暂时适配
'substatText': PROP_MAP[
list(raw_data['upgrade']['promote'][-1]['addProps'].keys())[-1]
],
'hp': raw_data['upgrade']['prop'][0]['initValue']
* GROW_CURVE_LIST[89]['curveInfos'][
TYPE_TO_INT[raw_data['upgrade']['prop'][0]['type']]
]['value']
+ raw_data['upgrade']['promote'][-1]['addProps']['FIGHT_PROP_BASE_HP'],
'attack': raw_data['upgrade']['prop'][1]['initValue']
* GROW_CURVE_LIST[89]['curveInfos'][
TYPE_TO_INT[raw_data['upgrade']['prop'][1]['type']]
]['value']
+ raw_data['upgrade']['promote'][-1]['addProps'][
'FIGHT_PROP_BASE_ATTACK'
],
'defense': raw_data['upgrade']['prop'][2]['initValue']
* GROW_CURVE_LIST[89]['curveInfos'][
TYPE_TO_INT[raw_data['upgrade']['prop'][2]['type']]
]['value']
+ raw_data['upgrade']['promote'][-1]['addProps'][
'FIGHT_PROP_BASE_DEFENSE'
],
'specialized': raw_data['upgrade']['promote'][-1]['addProps'][
list(raw_data['upgrade']['promote'][-1]['addProps'].keys())[-1]
],
}
return cast(ConvertCharacter, result)
async def convert_ambr_to_weapon(
weapon_id: Union[int, str]
) -> Optional[ConvertWeapon]:
raw_data = await get_ambr_weapon_data(weapon_id)
if raw_data is None:
return None
path = WEAPON_DATA_PATH / f'{weapon_id}.json'
if path.exists():
async with aiofiles.open(path, 'r', encoding='utf-8') as f:
raw_data = json.loads(await f.read())
else:
raw_data = await get_ambr_weapon_data(weapon_id)
if raw_data is None:
raise Exception('[AmbrData] 未找到该武器/数据无法下载!')
# 保存
async with aiofiles.open(path, 'w', encoding='utf-8') as f:
await f.write(json.dumps(raw_data))
if raw_data['affix'] is None:
effect = {
'name': '无特效',
@ -176,44 +240,7 @@ async def convert_ambr_to_weapon(
async def convert_ambr_to_minigg(
char_id: Union[str, int]
) -> Optional[ConvertCharacter]:
raw_data = await get_ambr_char_data(char_id)
if raw_data is None:
return
result = {
'name': raw_data['name'],
'title': raw_data['fetter']['title'],
'rarity': raw_data['rank'],
'weapontype': WEAPON_TYPE[raw_data['weaponType']],
'elementText': ELEMENT_MAP[raw_data['element']],
'element': ELEMENT_MAP[raw_data['element']],
'images': {'namesideicon': raw_data['icon']}, # 暂时适配
'substatText': PROP_MAP[
list(raw_data['upgrade']['promote'][-1]['addProps'].keys())[-1]
],
'hp': raw_data['upgrade']['prop'][0]['initValue']
* GROW_CURVE_LIST[89]['curveInfos'][
TYPE_TO_INT[raw_data['upgrade']['prop'][0]['type']]
]['value']
+ raw_data['upgrade']['promote'][-1]['addProps']['FIGHT_PROP_BASE_HP'],
'attack': raw_data['upgrade']['prop'][1]['initValue']
* GROW_CURVE_LIST[89]['curveInfos'][
TYPE_TO_INT[raw_data['upgrade']['prop'][1]['type']]
]['value']
+ raw_data['upgrade']['promote'][-1]['addProps'][
'FIGHT_PROP_BASE_ATTACK'
],
'defense': raw_data['upgrade']['prop'][2]['initValue']
* GROW_CURVE_LIST[89]['curveInfos'][
TYPE_TO_INT[raw_data['upgrade']['prop'][2]['type']]
]['value']
+ raw_data['upgrade']['promote'][-1]['addProps'][
'FIGHT_PROP_BASE_DEFENSE'
],
'specialized': raw_data['upgrade']['promote'][-1]['addProps'][
list(raw_data['upgrade']['promote'][-1]['addProps'].keys())[-1]
],
}
return cast(ConvertCharacter, result)
return await convert_exist_data_to_char(char_id)
async def convert_ambr_to_talent(

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -25,6 +25,10 @@ ACHI_ICON_PATH = RESOURCE_PATH / 'achi_icon'
TEMP_PATH = RESOURCE_PATH / 'temp'
CARD_PATH = RESOURCE_PATH / 'card'
MONSTER_ICON_PATH = RESOURCE_PATH / 'monster_icon'
CHAR_DATA_PATH = RESOURCE_PATH / 'char_data'
WEAPON_DATA_PATH = RESOURCE_PATH / 'weapon_data'
ABYSS_PATH = WIKI_PATH / 'abyss_review'
GUIDE_PATH = WIKI_PATH / 'guide'
REF_PATH = WIKI_PATH / 'ref'
@ -79,6 +83,8 @@ def init_dir():
MONSTER_ICON_PATH,
ABYSS_PATH,
CHAR_NAMECARDPIC_PATH,
CHAR_DATA_PATH,
WEAPON_DATA_PATH,
]:
i.mkdir(parents=True, exist_ok=True)

View File

@ -7,9 +7,11 @@ from .RESOURCE_PATH import (
ICON_PATH,
GUIDE_PATH,
WEAPON_PATH,
CHAR_DATA_PATH,
CHAR_SIDE_PATH,
GACHA_IMG_PATH,
CHAR_STAND_PATH,
WEAPON_DATA_PATH,
CHAR_NAMECARD_PATH,
CHAR_NAMECARDPIC_PATH,
)
@ -27,12 +29,10 @@ async def download_all_file_from_miniggicu():
'resource/icon': ICON_PATH,
'resource/reliquaries': REL_PATH,
'resource/weapon': WEAPON_PATH,
'resource/char_data': CHAR_DATA_PATH,
'resource/weapon_data': WEAPON_DATA_PATH,
'wiki/guide': GUIDE_PATH,
'wiki/ref': REF_PATH,
'resource/char_namecard_pic': CHAR_NAMECARDPIC_PATH,
},
)
for d_files in ['100000067.png', '100000068.png']:
path = CHAR_PATH / d_files
if path.exists():
path.unlink()