新增我的背包

This commit is contained in:
KimigaiiWuyi 2024-06-11 00:22:46 +08:00
parent f079984fca
commit 4c3f74c4e7
13 changed files with 6005 additions and 4 deletions

View File

@ -0,0 +1,19 @@
from gsuid_core.sv import SV
from gsuid_core.bot import Bot
from gsuid_core.models import Event
from gsuid_core.utils.error_reply import UID_HINT
from ..utils.convert import get_uid
from .get_my_pack import draw_my_pack
sv_pack = SV('查询背包')
@sv_pack.on_command(('我的背包'))
async def my_bag(bot: Bot, ev: Event):
uid, user_id = await get_uid(bot, ev, True)
if not uid:
return await bot.send(UID_HINT)
im = await draw_my_pack(uid, ev)
await bot.send(im)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,82 @@
from pathlib import Path
from typing import Union
from PIL import Image, ImageDraw
from gsuid_core.models import Event
from gsuid_core.utils.cache import gs_cache
from gsuid_core.utils.error_reply import get_error
from gsuid_core.utils.image.convert import convert_img
from .utils import get_all_char_dict
from ..utils.fonts.genshin_fonts import gs_font_20
from ..utils.mys_api import mys_api, get_base_data
from ..utils.resource.download_url import download
from ..utils.resource.RESOURCE_PATH import ICON_PATH
from ..utils.image.image_tools import (
get_v4_bg,
add_footer,
get_avatar,
get_v4_title,
)
TEXT_PATH = Path(__file__).parent / 'texture2d'
@gs_cache(1800)
async def draw_my_pack(uid: str, ev: Event) -> Union[str, bytes]:
raw = await get_all_char_dict()
data = await mys_api.get_batch_compute_info(uid, raw)
if isinstance(data, int):
return get_error(data)
raw_data = await get_base_data(uid)
if isinstance(raw_data, (str, bytes)):
return raw_data
elif isinstance(raw_data, (bytearray, memoryview)):
return bytes(raw_data)
char_pic = await get_avatar(ev, 377, False)
title_img = get_v4_title(char_pic, uid, raw_data)
# title_img = title_img.resize((int(1680 * 0.6), int(700 * 0.6)))
overall_consume = data['overall_consume']
bag_len = len(overall_consume)
w = 1680
n = 14
up = 713
h = (((bag_len - 1) // n) + 1) * 145 + up + 92
ox, oy = 110, 145
img = get_v4_bg(w, h)
img.paste(title_img, (0, 0), title_img)
for index, item in enumerate(overall_consume):
item_bg = Image.open(TEXT_PATH / 'one.png')
item_name = f'UI_ItemIcon_{item["id"]}.png'
item_path = ICON_PATH / item_name
if not item_path.exists():
await download(item['icon'], 8, item_name)
item_img = Image.open(item_path)
item_img = item_img.resize((80, 80)).convert('RGBA')
item_bg.paste(item_img, (15, 20), item_img)
item_draw = ImageDraw.Draw(item_bg)
bag_num = item['num'] - item['lack_num']
item_draw.text(
(55, 125),
f'{bag_num}',
font=gs_font_20,
fill='white',
anchor='mm',
)
img.paste(
item_bg,
(65 + (index % n) * ox, up + (index // n) * oy),
item_bg,
)
img = add_footer(img)
return await convert_img(img)

Binary file not shown.

After

Width:  |  Height:  |  Size: 823 B

View File

@ -0,0 +1,157 @@
from typing import Dict, List, Union
from gsuid_core.logger import logger
from ..utils.map.GS_MAP_PATH import (
avatarId2Name,
avatarName2Weapon,
weaponId2Name_data,
)
from ..utils.map.name_covert import (
name_to_element,
avatar_id_to_name,
weapon_id_to_name,
avatar_id_to_skill_groupId,
)
ELEMENT_MAP = {
"Pyro": 1,
"Anemo": 2,
"Geo": 3,
"Dendro": 4,
"Electro": 5,
"Hydro": 6,
"Cryo": 7,
}
async def get_all_char_dict() -> List[Dict]:
result = []
weapon_list: Dict[str, List[str]] = {
'单手剑': [],
'双手剑': [],
'': [],
'法器': [],
'长柄武器': [],
}
for weapon_id in weaponId2Name_data:
if int(weapon_id[2]) <= 3:
continue
if weapon_id in ['11419', '11420', '11421', '11429', '15513']:
continue
if weapon_id.startswith('11'):
weapon_list['单手剑'].append(weapon_id)
elif weapon_id.startswith('12'):
weapon_list['双手剑'].append(weapon_id)
elif weapon_id.startswith('13'):
weapon_list['长柄武器'].append(weapon_id)
elif weapon_id.startswith('14'):
weapon_list['法器'].append(weapon_id)
elif weapon_id.startswith('15'):
weapon_list[''].append(weapon_id)
for char_id in avatarId2Name:
if char_id in ['10000095']:
continue
char_name = await avatar_id_to_name(char_id)
if char_name not in avatarName2Weapon:
continue
char_weapon_type = avatarName2Weapon[char_name]
if weapon_list[char_weapon_type]:
weapon = weapon_list[char_weapon_type].pop()
else:
weapon = 0
d = await char_id_to_compute_dict(
char_id,
weapon_id=weapon,
)
if d is not None:
result.append(d)
import json
from pathlib import Path
with open(Path(__file__).parent / 'aa.json', 'w', encoding='utf-8') as f:
json.dump(result, f, ensure_ascii=False, indent=4)
return result
async def char_id_to_compute_dict(
char_id: Union[str, int],
current_level: int = 1,
target_level: int = 90,
skill1_current_level: int = 1,
skill1_target_level: int = 10,
skill2_current_level: int = 1,
skill2_target_level: int = 10,
skill3_current_level: int = 1,
skill3_target_level: int = 10,
weapon_id: Union[str, int] = 0,
weapon_current_level: int = 1,
weapon_target_level: int = 90,
):
char_id = str(char_id)
char_name = await avatar_id_to_name(char_id)
element = await name_to_element(char_name)
element_id = ELEMENT_MAP[element]
if char_id in ['10000005', '10000001', '10000007']:
return None
skill_list = await avatar_id_to_skill_groupId(char_id)
if not skill_list:
logger.debug(f'[char_id_to_compute_dict] {char_id}')
raise ValueError("[char_id_to_compute_dict] 未找到该角色技能")
skill_data = []
skill_level = [
[skill1_current_level, skill1_target_level],
[skill2_current_level, skill2_target_level],
[skill3_current_level, skill3_target_level],
]
n = 0
for skill_id in skill_list:
if skill_id.endswith(('1', '2', '9')):
skill_data.append(
{
"id": skill_id,
"group_id": skill_id,
"name": skill_list[skill_id],
"max_level": 10,
"levelRange": skill_level[n],
"level_current": skill_level[n][0],
"level_target": skill_level[n][1],
}
)
n += 1
data = {
"avatar_id": int(char_id),
"avatar_level_current": current_level,
"avatar_level_target": target_level,
"element_attr_id": element_id,
"level": 5,
"name": char_name,
"skill_list": skill_data,
}
if weapon_id != 0:
data['weapon'] = {
"id": int(weapon_id),
"name": await weapon_id_to_name(str(weapon_id)),
"weapon_cat_id": 1,
"weapon_level": 5,
"max_level": 90,
"is_recommend": False,
"levelRange": [weapon_current_level, weapon_target_level],
"level_current": weapon_current_level,
"level_target": weapon_target_level,
}
return data

View File

@ -40,6 +40,8 @@ avatarId2Name_fileName = f'avatarId2Name_mapping_{version}.json'
enName2Id_fileName = f'enName2AvatarID_mapping_{version}.json'
avatarId2Star_fileName = f'avatarId2Star_mapping_{version}.json'
avatarName2Weapon_fileName = f'avatarName2Weapon_mapping_{version}.json'
avatarId2SkillList_fileName = f'avatarId2SkillList_mapping_{version}.json'
weaponId2Name_fileName = f'weaponId2Name_mapping_{version}.json'
monster2entry_fileName = f'monster2entry_mapping_{version}.json'
@ -72,6 +74,149 @@ BETA_CHAR = {
}
async def weaponId2Name():
result = {}
print('正在执行weaponId2Name')
with open(
DATA_PATH / 'WeaponExcelConfigData.json',
'r',
encoding='UTF-8',
) as f:
weapon_data = json.load(f)
for weapon in weapon_data:
if str(weapon['nameTextMapHash']) in raw_data:
result[weapon['id']] = raw_data[str(weapon['nameTextMapHash'])]
with open(
MAP_PATH / weaponId2Name_fileName,
'w',
encoding='UTF-8',
) as f:
json.dump(result, f, ensure_ascii=False, indent=4)
async def avatarId2SkillGroupList():
result = {}
print('正在执行avatarId2SkillList')
with open(
MAP_PATH / f'enName2AvatarID_mapping_{version}.json',
'r',
encoding='UTF-8',
) as f:
en_name = json.load(f)
with open(
DATA_PATH / 'AvatarSkillExcelConfigData.json',
'r',
encoding='UTF-8',
) as f:
skill_data = json.load(f)
for skill in skill_data:
if 'proudSkillGroupId' in skill:
if skill['abilityName']:
_name = skill['skillIcon'].split('_')[2]
count = skill['abilityName'].count('_')
if 'Diluc' in skill['abilityName']:
name = 'Diluc'
elif count <= 1:
name = skill['abilityName'].split('_')[0]
elif count >= 3:
if skill['abilityName'].split('_')[1] == _name:
name = skill['abilityName'].split('_')[1]
else:
continue
else:
name = skill['abilityName'].split('_')[1]
if (
_name != name
and skill['skillIcon'].count('_') > 2
and 'Catalyst' not in skill['skillIcon']
):
print(_name)
print(name)
continue
else:
name = skill['skillIcon'].split('_')[2]
if not skill['skillIcon'].startswith(
('Skill_A', 'Skill_S', 'Skill_E')
):
continue
if name not in en_name:
name = name.split(' ')[-1]
for _en in en_name:
en = _en.split(' ')[-1]
if en == 'Jean':
en = 'Qin'
elif en == 'Baizhu':
en = 'Baizhuer'
elif en == 'Alhaitham':
en = 'Alhatham'
elif en == 'Jin':
en = 'Yunjin'
elif en == 'Miko':
en = 'Yae'
elif en == 'Heizou':
en = 'Heizo'
elif en == 'Amber':
en = 'Ambor'
elif en == 'Noelle':
en = 'Noel'
elif en == 'Yanfei':
en = 'Feiyan'
elif en == 'Shogun':
en = 'Shougun'
elif en == 'Lynette':
en = 'Linette'
elif en == 'Lyney':
en = 'Liney'
elif en == 'Tao':
en = 'Hutao'
elif en == 'Thoma':
en = 'Tohma'
elif en == 'Kirara':
en = 'Momoka'
elif en == 'Xianyun':
en = 'Liuyun'
if name == en:
avatar_id = en_name[_en]
break
else:
if not name.startswith('Player'):
print(name)
continue
else:
avatar_id = en_name[name]
if str(skill["nameTextMapHash"]) in raw_data:
skill_name = raw_data[str(skill["nameTextMapHash"])]
else:
skill_name = ''
if avatar_id not in result:
result[avatar_id] = {}
result[avatar_id][skill['proudSkillGroupId']] = skill_name
result['10000036'] = {
"3631": "普通攻击·灭邪四式",
"3632": "灵刃·重华叠霜",
"3639": "灵刃·云开星落",
}
with open(
MAP_PATH / f'avatarId2SkillList_mapping_{version}.json',
'w',
encoding='UTF-8',
) as f:
json.dump(result, f, indent=4, ensure_ascii=False)
async def monster2map():
print('正在执行monster2map')
monster_list = await get_ambr_monster_list()
@ -335,14 +480,14 @@ async def artifact2attrJson() -> None:
async def main():
await monster2map()
await download_new_file()
global raw_data
try:
with open(DATA_PATH / 'TextMapCHS.json', 'r', encoding='UTF-8') as f:
raw_data = json.load(f)
except FileNotFoundError:
pass
await monster2map()
await download_new_file()
await avatarId2NameJson()
await avatarName2ElementJson()
await weaponHash2NameJson()
@ -350,6 +495,8 @@ async def main():
await talentId2NameJson()
await weaponHash2TypeJson()
await artifact2attrJson()
await weaponId2Name()
await avatarId2SkillGroupList()
asyncio.run(main())

View File

@ -99,7 +99,7 @@ def download_namecard_pic():
elif en == 'Jin':
en = 'Yunjin'
elif en == 'Miko':
en = 'Yae1'
en = 'Yae'
elif en == 'Heizou':
en = 'Heizo'
elif en == 'Amber':

View File

@ -62,8 +62,14 @@ def get_v4_title(avatar: Image.Image, uid: str, title_data: IndexData):
return title
def add_footer(img: Image.Image):
def add_footer(img: Image.Image, w: int = 0):
footer = Image.open(TEXT_PATH / 'footer.png')
if w != 0:
footer = footer.resize(
(w, int(footer.size[1] * w / footer.size[0])),
)
x, y = (
int((img.size[0] - footer.size[0]) / 2),
img.size[1] - footer.size[1] - 20,

View File

@ -21,6 +21,8 @@ enName2Id_fileName = f'enName2AvatarID_mapping_{version}.json'
icon2Name_fileName = f'icon2Name_mapping_{version}.json'
avatarName2Weapon_fileName = f'avatarName2Weapon_mapping_{version}.json'
monster2entry_fileName = f'monster2entry_mapping_{version}.json'
avatarId2SkillList_fileName = f'avatarId2SkillList_mapping_{version}.json'
weaponId2Name_fileName = f'weaponId2Name_mapping_{version}.json'
EXMonster_fileName = 'ExtraMonster.json'
@ -79,3 +81,11 @@ with open(MAP / EXMonster_fileName, 'r', encoding='utf8') as f:
with open(MAP / monster2entry_fileName, 'r', encoding='utf8') as f:
monster2entry_data = msgjson.decode(f.read(), type=Dict[str, Dict])
with open(MAP / avatarId2SkillList_fileName, 'r', encoding='utf8') as f:
avatarId2SkillList_data = msgjson.decode(
f.read(), type=Dict[str, Dict[str, str]]
)
with open(MAP / weaponId2Name_fileName, 'r', encoding='utf8') as f:
weaponId2Name_data = msgjson.decode(f.read(), type=Dict[str, str])

View File

@ -0,0 +1,419 @@
{
"10000002": {
"233": "神里流·霰步",
"232": "神里流·冰华",
"239": "神里流·霜灭",
"231": "普通攻击·神里流·倾"
},
"10000021": {
"2139": "箭雨",
"2132": "爆弹玩偶",
"2131": "普通攻击·神射手"
},
"10000003": {
"331": "普通攻击·西风剑术",
"332": "风压剑",
"339": "蒲公英之风"
},
"10000006": {
"431": "普通攻击·指尖雷暴",
"432": "苍雷",
"439": "蔷薇的雷光"
},
"10000014": {
"1431": "普通攻击·水之浅唱",
"1432": "演唱,开始♪",
"1439": "闪耀奇迹♪"
},
"10000015": {
"1531": "普通攻击·仪典剑术",
"1532": "霜袭",
"1539": "凛冽轮舞"
},
"10000016": {
"1631": "普通攻击·淬炼之剑",
"1632": "逆焰之刃",
"1639": "黎明"
},
"10000020": {
"2031": "普通攻击·钢脊",
"2032": "利爪与苍雷",
"2039": "雷牙"
},
"10000022": {
"2231": "普通攻击·神代射术",
"2232": "高天之歌",
"2239": "风神之诗"
},
"10000023": {
"2331": "普通攻击·白案功夫",
"2332": "锅巴出击",
"2339": "旋火轮"
},
"10000024": {
"2431": "普通攻击·征涛",
"2432": "捉浪",
"2439": "斫雷"
},
"10000026": {
"2631": "普通攻击·卷积微尘",
"2632": "风轮两立",
"2639": "靖妖傩舞"
},
"10000027": {
"2731": "普通攻击·千金掷",
"2732": "璇玑屏",
"2739": "天权崩玉"
},
"10000029": {
"2931": "普通攻击·砰砰",
"2932": "蹦蹦炸弹",
"2939": "轰轰火花"
},
"10000030": {
"3031": "普通攻击·岩雨",
"3032": "地心",
"3039": "天星"
},
"10000031": {
"3131": "普通攻击·罪灭之矢",
"3132": "夜巡影翼",
"3139": "至夜幻现"
},
"10000032": {
"3231": "普通攻击·好运剑",
"3232": "热情过载",
"3239": "美妙旅程"
},
"10000033": {
"3331": "普通攻击·断雨",
"3332": "魔王武装·狂澜",
"3339": "极恶技·尽灭闪"
},
"10000034": {
"3431": "普通攻击·西风剑术·女仆",
"3432": "护心铠",
"3439": "大扫除"
},
"10000035": {
"3531": "普通攻击·云来古剑法",
"3532": "仙法·寒病鬼差",
"3539": "仙法·救苦度厄"
},
"10000037": {
"3731": "普通攻击·流天射术",
"3732": "山泽麟迹",
"3739": "降众天华"
},
"10000025": {
"2531": "普通攻击·古华剑法",
"2532": "古华剑·画雨笼山",
"2539": "古华剑·裁雨留虹"
},
"10000038": {
"3831": "普通攻击·西风剑术·白",
"3832": "创生法·拟造阳华",
"3839": "诞生式·大地之潮"
},
"10000039": {
"3931": "普通攻击·猎人射术",
"3932": "猫爪冻冻",
"3939": "最烈特调"
},
"10000041": {
"4131": "普通攻击·因果点破",
"4132": "水中幻愿",
"4133": "虚实流动",
"4139": "星命定轨"
},
"10000042": {
"4231": "普通攻击·云来剑法",
"4232": "星斗归位",
"4239": "天街巡游"
},
"10000043": {
"4331": "普通攻击·简式风灵作成",
"4332": "风灵作成·陆叁零捌",
"4339": "禁·风灵作成·柒伍同构贰型"
},
"10000044": {
"4431": "普通攻击·炎舞",
"4432": "热情拂扫",
"4439": "叛逆刮弦"
},
"10000045": {
"4531": "普通攻击·教会枪术",
"4532": "噬罪的告解",
"4539": "终命的圣礼"
},
"10000046": {
"4631": "普通攻击·往生秘传枪法",
"4632": "蝶引来生",
"4639": "安神秘法"
},
"10000047": {
"4731": "普通攻击·我流剑术",
"4732": "千早振",
"4739": "万叶之一刀"
},
"10000048": {
"4831": "普通攻击·火漆制印",
"4832": "丹书立约",
"4839": "凭此结契"
},
"10000049": {
"4931": "普通攻击·烟火打扬",
"4932": "焰硝庭火舞",
"4939": "琉金云间草"
},
"10000050": {
"5031": "普通攻击·迅破枪势",
"5032": "烈烧佑命之侍护",
"5039": "真红炽火之大铠"
},
"10000051": {
"5131": "普通攻击·西风剑术·宗室",
"5132": "冰潮的涡旋",
"5139": "凝浪之光剑"
},
"10000052": {
"5231": "普通攻击·源流",
"5232": "神变·恶曜开眼",
"5239": "奥义·梦想真说"
},
"10000053": {
"5331": "普通攻击·忍刀·终末番",
"5332": "呜呼流·风隐急进",
"5339": "呜呼流·影貉缭乱"
},
"10000054": {
"5431": "普通攻击·水有常形",
"5432": "海月之誓",
"5439": "海人化羽"
},
"10000055": {
"5531": "普通攻击·呲牙裂扇箭",
"5532": "犬坂吠吠方圆阵",
"5539": "兽牙逐突形胜战法"
},
"10000056": {
"5631": "普通攻击·天狗传弓术",
"5632": "鸦羽天狗霆雷召咒",
"5639": "煌煌千道镇式"
},
"10000057": {
"5731": "普通攻击· 喧哗屋传说",
"5732": "魔杀绝技·赤牛发破!",
"5739": "最恶鬼王·一斗轰临!!"
},
"10000058": {
"5831": "普通攻击·狐灵食罪式",
"5832": "野干役咒·杀生樱",
"5839": "大密法·天狐显真"
},
"10000059": {
"5931": "普通攻击·不动流格斗术",
"5932": "勠心拳",
"5939": "聚风蹴"
},
"10000060": {
"6031": "普通攻击·潜形隐曜弓",
"6032": "萦络纵命索",
"6039": "渊图玲珑骰"
},
"10000061": {
"6131": "普通攻击·箱纸切削术",
"6132": "呜喵町飞足",
"6139": "秘法·惊喜特派"
},
"10000062": {
"6231": "普通攻击·快速射击",
"6232": "冰尘雪野",
"6239": "曙光预言"
},
"10000063": {
"6331": "普通攻击·踏辰摄斗",
"6332": "仰灵威召将役咒",
"6339": "神女遣灵真诀"
},
"10000064": {
"6431": "普通攻击·拂云出手",
"6432": "旋云开相",
"6439": "破嶂见旌仪"
},
"10000065": {
"6531": "普通攻击·忍流飞刃斩",
"6532": "越祓雷草之轮",
"6539": "御咏鸣神刈山祭"
},
"10000066": {
"6631": "普通攻击·神里流·转",
"6632": "神里流·镜花",
"6639": "神里流·水囿"
},
"10000067": {
"6731": "普通攻击·祈颂射艺",
"6732": "拂花偈叶",
"6739": "猫猫秘宝"
},
"10000068": {
"6831": "普通攻击·妙显剑舞·改",
"6832": "镇灵之灯·烦恼解决炮",
"6839": "卡萨扎莱宫的无微不至"
},
"10000069": {
"6931": "普通攻击·藏蕴破障",
"6932": "识果种雷",
"6939": "造生缠藤箭"
},
"10000070": {
"7031": "普通攻击·弦月舞步",
"7032": "七域舞步",
"7039": "浮莲舞步·远梦聆泉"
},
"10000071": {
"7131": "普通攻击·七圣枪术",
"7132": "秘仪·律渊渡魂",
"7139": "圣仪·煟煌随狼行"
},
"10000072": {
"7231": "普通攻击·流耀枪术·守势",
"7232": "圣仪·苍鹭庇卫",
"7239": "圣仪·灰鸰衒潮"
},
"10000073": {
"7331": "普通攻击·行相",
"7332": "所闻遍计",
"7339": "心景幻成"
},
"10000074": {
"7431": "普通攻击·熠辉轨度剑",
"7432": "垂裳端凝之夜",
"7439": "星流摇床之梦"
},
"10000075": {
"7531": "普通攻击·行幡鸣弦",
"7532": "羽画·风姿华歌",
"7539": "狂言·式乐五番"
},
"10000076": {
"7631": "普通攻击·迴身箭术",
"7632": "非想风天",
"7639": "抟风秘道"
},
"10000077": {
"7731": "普通攻击·颠扑连环枪",
"7732": "云台团团降芦菔",
"7739": "玉颗珊珊月中落"
},
"10000078": {
"7831": "普通攻击·溯因反绎法",
"7832": "共相·理式摹写",
"7839": "殊境·显象缚结"
},
"10000079": {
"7931": "普通攻击·拂金剑斗术",
"7932": "熔铁流狱",
"7939": "炎啸狮子咬"
},
"10000080": {
"8031": "普通攻击·西风枪术·镝传",
"8032": "星霜的流旋",
"8039": "苍翎的颂愿"
},
"10000081": {
"8131": "普通攻击·旋规设矩",
"8132": "画则巧施",
"8139": "繁绘隅穹"
},
"10000082": {
"8231": "普通攻击·金匮针解",
"8232": "太素诊要",
"8239": "愈气全形论"
},
"10000083": {
"8331": "普通攻击·迅捷礼刺剑",
"8332": "谜影障身法",
"8339": "魔术·运变惊奇"
},
"10000084": {
"8431": "普通攻击·迫牌易位式",
"8432": "眩惑光戏法",
"8439": "大魔术·灵迹巡游"
},
"10000085": {
"8531": "普通攻击·洑流剑",
"8532": "浮冰增压",
"8539": "猎影潜袭"
},
"10000086": {
"8631": "普通攻击·迅烈倾霜拳",
"8632": "冰牙突驰",
"8639": "黑金狼噬"
},
"10000087": {
"8731": "普通攻击·如水从平",
"8732": "泪水啊,我必偿还",
"8739": "潮水啊,我已归来"
},
"10000088": {
"8831": "普通攻击·冷色摄影律",
"8832": "取景·冰点构图法",
"8839": "定格·全方位确证"
},
"10000089": {
"8931": "普通攻击·独舞之邀",
"8932": "孤心沙龙",
"8939": "万众狂欢"
},
"10000090": {
"9031": "普通攻击·线列枪刺·改",
"9032": "近迫式急促拦射",
"9039": "圆阵掷弹爆轰术"
},
"10000091": {
"9131": "普通攻击·直率的辞绝",
"9132": "典仪式晶火",
"9139": "如霰澄天的鸣礼"
},
"10000092": {
"9231": "普通攻击·刃爪悬星",
"9232": "瑞兽登高楼",
"9239": "璨焰金猊舞"
},
"10000093": {
"9331": "普通攻击·清风散花词",
"9332": "朝起鹤云",
"9339": "暮集竹星"
},
"10000094": {
"9431": "普通攻击·心织刀流",
"9432": "羽袖一触",
"9439": "二刀之形·比翼"
},
"10000095": {
"9531": "普通攻击·靶向治疗",
"9532": "弹跳水疗法",
"9539": "过饱和心意注射"
},
"10000096": {
"9631": "普通攻击·斩首之邀",
"9632": "万相化灰",
"9639": "厄月将升"
},
"10000097": {
"9731": "普通攻击·王家苇箭术",
"9732": "古仪·鸣砂掣雷",
"9739": "秘仪·瞑光贯影"
},
"10000098": {
"9831": "普通攻击·逐影之誓",
"9832": "狩夜之巡",
"9839": "残光将终"
},
"10000036": {
"3631": "普通攻击·灭邪四式",
"3632": "灵刃·重华叠霜",
"3639": "灵刃·云开星落"
}
}

View File

@ -0,0 +1,202 @@
{
"11101": "无锋剑",
"11201": "银剑",
"11301": "冷刃",
"11302": "黎明神剑",
"11303": "旅行剑",
"11304": "暗铁剑",
"11305": "吃虎鱼刀",
"11306": "飞天御剑",
"11401": "西风剑",
"11402": "笛剑",
"11403": "祭礼剑",
"11404": "宗室长剑",
"11405": "匣里龙吟",
"11406": "试作斩岩",
"11407": "铁蜂刺",
"11408": "黑岩长剑",
"11409": "黑剑",
"11410": "暗巷闪光",
"11412": "降临之剑",
"11413": "腐殖之剑",
"11414": "天目影打刀",
"11415": "辰砂之纺锤",
"11416": "笼钓瓶一心",
"11417": "原木刀",
"11418": "西福斯的月光",
"11419": "「一心传」名刀",
"11420": "「一心传」名刀",
"11421": "「一心传」名刀",
"11422": "东花坊时雨",
"11424": "狼牙",
"11425": "海渊终曲",
"11426": "灰河渡手",
"11427": "船坞长剑",
"11428": "水仙十字之剑",
"11429": "水仙十字之剑",
"11501": "风鹰剑",
"11502": "天空之刃",
"11503": "苍古自由之誓",
"11504": "斫峰之刃",
"11505": "磐岩结绿",
"11509": "雾切之回光",
"11510": "波乱月白经津",
"11511": "圣显之钥",
"11512": "裁叶萃光",
"11513": "静水流涌之辉",
"11514": "有乐御簾切",
"11515": "赦罪",
"12101": "训练大剑",
"12201": "佣兵重剑",
"12301": "铁影阔剑",
"12302": "沐浴龙血的剑",
"12303": "白铁大剑",
"12304": "石英大剑",
"12305": "以理服人",
"12306": "飞天大御剑",
"12401": "西风大剑",
"12402": "钟剑",
"12403": "祭礼大剑",
"12404": "宗室大剑",
"12405": "雨裁",
"12406": "试作古华",
"12407": "白影剑",
"12408": "黑岩斩刀",
"12409": "螭骨剑",
"12410": "千岩古剑",
"12411": "雪葬的星银",
"12412": "衔珠海皇",
"12414": "桂木斩长正",
"12415": "玛海菈的水色",
"12416": "恶王丸",
"12417": "森林王器",
"12418": "饰铁之花",
"12424": "聊聊棒",
"12425": "浪影阔剑",
"12426": "「究极霸王超级魔剑」",
"12427": "便携动力锯",
"12501": "天空之傲",
"12502": "狼的末路",
"12503": "松籁响起之时",
"12504": "无工之剑",
"12510": "赤角石溃杵",
"12511": "苇海信标",
"12512": "裁断",
"13101": "新手长枪",
"13201": "铁尖枪",
"13301": "白缨枪",
"13302": "钺矛",
"13303": "黑缨枪",
"13304": "「旗杆」",
"13401": "匣里灭辰",
"13402": "试作星镰",
"13403": "流月针",
"13404": "黑岩刺枪",
"13405": "决斗之枪",
"13406": "千岩长枪",
"13407": "西风长枪",
"13408": "宗室猎枪",
"13409": "龙脊长枪",
"13414": "喜多院十文字",
"13415": "「渔获」",
"13416": "断浪长鳍",
"13417": "贯月矢",
"13419": "风信之锋",
"13424": "峡湾长歌",
"13425": "公义的酬报",
"13426": "沙中伟贤的对答",
"13427": "勘探钻机",
"13501": "护摩之杖",
"13502": "天空之脊",
"13504": "贯虹之槊",
"13505": "和璞鸢",
"13507": "息灾",
"13509": "薙草之稻光",
"13511": "赤沙之杖",
"13512": "赤月之形",
"14101": "学徒笔记",
"14201": "口袋魔导书",
"14301": "魔导绪论",
"14302": "讨龙英杰谭",
"14303": "异世界行记",
"14304": "翡玉法球",
"14305": "甲级宝珏",
"14306": "琥珀玥",
"14401": "西风秘典",
"14402": "流浪乐章",
"14403": "祭礼残章",
"14404": "宗室秘法录",
"14405": "匣里日月",
"14406": "试作金珀",
"14407": "万国诸海图谱",
"14408": "黑岩绯玉",
"14409": "昭心",
"14410": "暗巷的酒与诗",
"14412": "忍冬之果",
"14413": "嘟嘟可故事集",
"14414": "白辰之环",
"14415": "证誓之明瞳",
"14416": "流浪的晚星",
"14417": "盈满之实",
"14424": "遗祀玉珑",
"14425": "纯水流华",
"14426": "无垠蔚蓝之歌",
"14501": "天空之卷",
"14502": "四风原典",
"14504": "尘世之锁",
"14505": "碧落之珑",
"14506": "不灭月华",
"14509": "神乐之真意",
"14511": "千夜浮梦",
"14512": "图莱杜拉的回忆",
"14513": "金流监督",
"14514": "万世流涌大典",
"14515": "鹤鸣余音",
"15101": "猎弓",
"15201": "历练的猎弓",
"15301": "鸦羽弓",
"15302": "神射手之誓",
"15303": "反曲弓",
"15304": "弹弓",
"15305": "信使",
"15306": "黑檀弓",
"15401": "西风猎弓",
"15402": "绝弦",
"15403": "祭礼弓",
"15404": "宗室长弓",
"15405": "弓藏",
"15406": "试作澹月",
"15407": "钢轮弓",
"15408": "黑岩战弓",
"15409": "苍翠猎弓",
"15410": "暗巷猎手",
"15411": "落霞",
"15412": "幽夜华尔兹",
"15413": "风花之颂",
"15414": "破魔之弓",
"15415": "掠食者",
"15416": "曚云之月",
"15417": "王下近侍",
"15418": "竭泽",
"15419": "鹮穿之喙",
"15424": "烈阳之嗣",
"15425": "静谧之曲",
"15426": "筑云",
"15427": "测距规",
"15501": "天空之翼",
"15502": "阿莫斯之弓",
"15503": "终末嗟叹之诗",
"15507": "冬极白星",
"15508": "若水",
"15509": "飞雷之弦振",
"15511": "猎人之径",
"15512": "最初的大魔术",
"15513": "白雨心弦",
"20001": "(test)竿测试",
"10002": "(test)穿模测试",
"10003": "(test)穿模测试",
"10004": "(test)穿模测试",
"10005": "(test)穿模测试",
"10006": "(test)穿模测试",
"10008": "(test)穿模测试"
}

View File

@ -1,11 +1,47 @@
from typing import Dict, Optional
from .GS_MAP_PATH import (
alias_data,
avatarId2Name,
avatarId2Star_data,
avatarName2Element,
weaponId2Name_data,
avatarId2SkillList_data,
enName_to_avatarId_data,
)
async def weapon_id_to_name(weapon_id: str) -> str:
if weapon_id in weaponId2Name_data:
return weaponId2Name_data[weapon_id]
else:
return '未知'
async def name_to_weapon_id(weapon_name: str) -> str:
for _id in weaponId2Name_data:
if weapon_name == weaponId2Name_data[_id]:
return _id
else:
return '11509'
async def avatar_id_to_skill_groupId(
avatar_id: str,
) -> Optional[Dict[str, str]]:
if avatar_id in avatarId2SkillList_data:
return avatarId2SkillList_data[avatar_id]
else:
return None
async def name_to_element(name: str) -> str:
if name in avatarName2Element:
return avatarName2Element[name]
else:
return 'Cryo'
async def avatar_id_to_name(avatar_id: str) -> str:
char_name = avatarId2Name[avatar_id]
return char_name

View File

@ -83,6 +83,7 @@ async def download_file(
name: str,
sess: Optional[ClientSession] = None,
) -> Optional[Tuple[str, int, str]]:
logger.info(f"开始下载: [{name}] - {url}")
if sess is None:
sess = ClientSession()
try: