mirror of
https://github.com/KimigaiiWuyi/GenshinUID.git
synced 2025-05-08 04:55:51 +08:00
🍱 使用本地资源进行面板更新 (#658)
This commit is contained in:
parent
eeba0691b7
commit
17c0250356
@ -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)
|
||||
|
@ -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())
|
||||
|
@ -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
@ -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)
|
||||
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user