迁移到独立的 torappu-excel 包

This commit is contained in:
baiqwerdvd 2025-03-05 18:15:05 +08:00
parent e697284b56
commit 99341bc034
No known key found for this signature in database
GPG Key ID: 103223964DCA2FF3
85 changed files with 460 additions and 11228 deletions

View File

@ -2,8 +2,6 @@ import asyncio
import random import random
import aiohttp import aiohttp
from msgspec import convert
from gsuid_core.aps import scheduler from gsuid_core.aps import scheduler
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.logger import logger from gsuid_core.logger import logger
@ -11,6 +9,7 @@ from gsuid_core.models import Event
from gsuid_core.segment import MessageSegment from gsuid_core.segment import MessageSegment
from gsuid_core.subscribe import gs_subscribe from gsuid_core.subscribe import gs_subscribe
from gsuid_core.sv import SV from gsuid_core.sv import SV
from msgspec import convert
from ..arknightsuid_config import PREFIX, ArkConfig from ..arknightsuid_config import PREFIX, ArkConfig
from .draw_img import get_ann_img from .draw_img import get_ann_img
@ -50,9 +49,7 @@ async def force_ann_(bot: Bot, ev: Event):
@sv_ann.on_command(f"{PREFIX}获取当前Android公告列表") @sv_ann.on_command(f"{PREFIX}获取当前Android公告列表")
async def get_ann_list_(bot: Bot, ev: Event): async def get_ann_list_(bot: Bot, ev: Event):
async with aiohttp.ClientSession() as session: async with aiohttp.ClientSession() as session:
async with session.get( async with session.get("https://ak-webview.hypergryph.com/api/game/bulletinList?target=Android") as response:
"https://ak-webview.hypergryph.com/api/game/bulletinList?target=Android"
) as response:
data = await response.json() data = await response.json()
data = convert(data.get("data", {}), BulletinTargetData) data = convert(data.get("data", {}), BulletinTargetData)
@ -85,9 +82,7 @@ async def sub_ann_(bot: Bot, ev: Event):
await bot.send("成功订阅明日方舟公告!") await bot.send("成功订阅明日方舟公告!")
@sv_ann_sub.on_fullmatch( @sv_ann_sub.on_fullmatch((f"{PREFIX}取消订阅公告", f"{PREFIX}取消公告", f"{PREFIX}退订公告"))
(f"{PREFIX}取消订阅公告", f"{PREFIX}取消公告", f"{PREFIX}退订公告")
)
async def unsub_ann_(bot: Bot, ev: Event): async def unsub_ann_(bot: Bot, ev: Event):
if ev.group_id is None: if ev.group_id is None:
return await bot.send("请在群聊中取消订阅") return await bot.send("请在群聊中取消订阅")

View File

@ -2,13 +2,12 @@ import textwrap
from typing import Any from typing import Any
from bs4 import BeautifulSoup, element from bs4 import BeautifulSoup, element
from PIL import Image, ImageDraw
from gsuid_core.logger import logger from gsuid_core.logger import logger
from gsuid_core.utils.fonts.fonts import core_font as cf from gsuid_core.utils.fonts.fonts import core_font as cf
from gsuid_core.utils.image.convert import convert_img from gsuid_core.utils.image.convert import convert_img
from gsuid_core.utils.image.image_tools import get_div from gsuid_core.utils.image.image_tools import get_div
from gsuid_core.utils.image.utils import download_pic_to_image from gsuid_core.utils.image.utils import download_pic_to_image
from PIL import Image, ImageDraw
from .model import BulletinData from .model import BulletinData

View File

@ -3,11 +3,10 @@ from pathlib import Path
import aiohttp import aiohttp
import msgspec import msgspec
from msgspec import convert
from msgspec import json as msgjson
from gsuid_core.data_store import get_res_path from gsuid_core.data_store import get_res_path
from gsuid_core.logger import logger from gsuid_core.logger import logger
from msgspec import convert
from msgspec import json as msgjson
from .model import ( from .model import (
BulletinData, BulletinData,
@ -57,19 +56,13 @@ async def check_bulletin_update() -> dict[str, BulletinData]:
if cur_meta.get("code") == 0: if cur_meta.get("code") == 0:
match target: match target:
case "Android": case "Android":
android_data = convert( android_data = convert(cur_meta.get("data", {}), BulletinTargetData)
cur_meta.get("data", {}), BulletinTargetData
)
bulletin_meta.target.Android = android_data bulletin_meta.target.Android = android_data
case "Bilibili": case "Bilibili":
bilibili_data = convert( bilibili_data = convert(cur_meta.get("data", {}), BulletinTargetData)
cur_meta.get("data", {}), BulletinTargetData
)
bulletin_meta.target.Bilibili = bilibili_data bulletin_meta.target.Bilibili = bilibili_data
case "IOS": case "IOS":
ios_data = convert( ios_data = convert(cur_meta.get("data", {}), BulletinTargetData)
cur_meta.get("data", {}), BulletinTargetData
)
bulletin_meta.target.IOS = ios_data bulletin_meta.target.IOS = ios_data
assert android_data is not None assert android_data is not None
@ -80,9 +73,7 @@ async def check_bulletin_update() -> dict[str, BulletinData]:
update_set: set[int] = set() update_set: set[int] = set()
update_list: list[BulletinTargetDataItem] = [ update_list: list[BulletinTargetDataItem] = [
x x for x in update_list if x.updatedAt not in update_set and not update_set.add(x.updatedAt)
for x in update_list
if x.updatedAt not in update_set and not update_set.add(x.updatedAt)
] ]
update_list.sort(key=lambda x: x.updatedAt, reverse=True) update_list.sort(key=lambda x: x.updatedAt, reverse=True)
@ -112,12 +103,8 @@ async def check_bulletin_update() -> dict[str, BulletinData]:
new_ann[item.cid] = ann new_ann[item.cid] = ann
logger.info(f"New bulletin found: {item.cid}:{item.title}") logger.info(f"New bulletin found: {item.cid}:{item.title}")
bulletin_meta.data = dict( bulletin_meta.data = dict(sorted(bulletin_meta.data.items(), key=lambda x: int(x[0])))
sorted(bulletin_meta.data.items(), key=lambda x: int(x[0])) bulletin_meta.update = dict(sorted(bulletin_meta.update.items(), key=lambda x: x[1].cid, reverse=False))
)
bulletin_meta.update = dict(
sorted(bulletin_meta.update.items(), key=lambda x: x[1].cid, reverse=False)
)
data = msgjson.decode(msgjson.encode(bulletin_meta)) data = msgjson.decode(msgjson.encode(bulletin_meta))
with Path.open(bulletin_path, mode="w", encoding="UTF-8") as file: with Path.open(bulletin_path, mode="w", encoding="UTF-8") as file:

View File

@ -6,7 +6,7 @@ from gsuid_core.logger import logger
from gsuid_core.utils.image.convert import convert_img from gsuid_core.utils.image.convert import convert_img
from PIL import Image, ImageDraw from PIL import Image, ImageDraw
from ..arknightsuid_resource.constants import CHARACTER_TABLE from ..arknightsuid_resource.constants import EXCEL
from ..utils.ark_api import ark_skd_api from ..utils.ark_api import ark_skd_api
from ..utils.database.models import ArknightsBind from ..utils.database.models import ArknightsBind
from ..utils.fonts.source_han_sans import ( from ..utils.fonts.source_han_sans import (
@ -102,9 +102,7 @@ def get_error(img: Image.Image, uid: str, daily_data: int):
async def draw_ap_img(uid: str) -> Image.Image: async def draw_ap_img(uid: str) -> Image.Image:
# char # char
char_pic = ( char_pic = Image.open(TEXT_PATH / "char_1028_texas2_1b.png").resize((1700, 1700)).convert("RGBA")
Image.open(TEXT_PATH / "char_1028_texas2_1b.png").resize((1700, 1700)).convert("RGBA")
)
tmp_img = Image.new("RGBA", (based_w, based_h)) tmp_img = Image.new("RGBA", (based_w, based_h))
tmp_img.paste(char_pic, (-250, 50), char_pic) tmp_img.paste(char_pic, (-250, 50), char_pic)
@ -291,7 +289,7 @@ async def draw_ap_img(uid: str) -> Image.Image:
# 将remainSecs(剩余秒数) , 转换为几小时几分钟 # 将remainSecs(剩余秒数) , 转换为几小时几分钟
remain_time = seconds2hours_zhcn(remain_secs) remain_time = seconds2hours_zhcn(remain_secs)
char_cn_name = CHARACTER_TABLE[training_char].name char_cn_name = EXCEL.CHARATER_TABLE.chars[training_char].name
blue_bar_bg1_img = blue_bar_bg1.copy() blue_bar_bg1_img = blue_bar_bg1.copy()
blue_bar_bg1_draw = ImageDraw.Draw(blue_bar_bg1_img) blue_bar_bg1_draw = ImageDraw.Draw(blue_bar_bg1_img)
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(

View File

@ -1,5 +1,3 @@
from typing import Dict
from gsuid_core.gss import gss from gsuid_core.gss import gss
from gsuid_core.logger import logger from gsuid_core.logger import logger
@ -17,8 +15,8 @@ NOTICE = {
} }
async def get_notice_list() -> Dict[str, Dict[str, Dict]]: async def get_notice_list() -> dict[str, dict[str, dict]]:
msg_dict: Dict[str, Dict[str, Dict]] = {} msg_dict: dict[str, dict[str, dict]] = {}
for _bot_id in gss.active_bot: for _bot_id in gss.active_bot:
user_list = await ArknightsUser.get_all_push_user_list() user_list = await ArknightsUser.get_all_push_user_list()
for user in user_list: for user in user_list:
@ -42,11 +40,11 @@ async def get_notice_list() -> Dict[str, Dict[str, Dict]]:
async def all_check( async def all_check(
bot_id: str, bot_id: str,
raw_data: ArknightsPlayerInfoModel, raw_data: ArknightsPlayerInfoModel,
push_data: Dict, push_data: dict,
msg_dict: Dict[str, Dict[str, Dict]], msg_dict: dict[str, dict[str, dict]],
user_id: str, user_id: str,
uid: str, uid: str,
) -> Dict[str, Dict[str, Dict]]: ) -> dict[str, dict[str, dict]]:
for mode in NOTICE.keys(): for mode in NOTICE.keys():
# 检查条件 # 检查条件
if push_data[f"{mode}_is_push"] is True: if push_data[f"{mode}_is_push"] is True:

View File

@ -1,10 +1,9 @@
from pathlib import Path from pathlib import Path
from typing import Dict
from gsuid_core.utils.image.convert import convert_img from gsuid_core.utils.image.convert import convert_img
from PIL import Image, ImageDraw from PIL import Image, ImageDraw
from ..arknightsuid_resource.constants import SKILL_TABLE from ..arknightsuid_resource.constants import EXCEL
from ..utils.ark_api import ark_skd_api from ..utils.ark_api import ark_skd_api
from ..utils.fonts.source_han_sans import ( from ..utils.fonts.source_han_sans import (
sans_font_26, sans_font_26,
@ -97,9 +96,7 @@ async def get_char_snapshot(uid: str, cur_page: int):
avatar_id = status.avatar.id_ avatar_id = status.avatar.id_
try: try:
try: try:
avatar_img = Image.open(UI_PLAYER_AVATAR_LIST_PATH / f"{avatar_id}.png").resize( avatar_img = Image.open(UI_PLAYER_AVATAR_LIST_PATH / f"{avatar_id}.png").resize((235, 235))
(235, 235)
)
except FileNotFoundError: except FileNotFoundError:
avatar_img = Image.open(UI_CHAR_AVATAR_PATH / f"{avatar_id}.png").resize((235, 235)) avatar_img = Image.open(UI_CHAR_AVATAR_PATH / f"{avatar_id}.png").resize((235, 235))
except FileNotFoundError: except FileNotFoundError:
@ -170,8 +167,8 @@ async def get_char_snapshot(uid: str, cur_page: int):
def draw_char( def draw_char(
test_char: PlayerInfoChar, test_char: PlayerInfoChar,
charInfoMap: Dict[str, PlayerCharInfo], charInfoMap: dict[str, PlayerCharInfo],
equipmentInfoMap: Dict[str, PlayerEquipmentInfo], equipmentInfoMap: dict[str, PlayerEquipmentInfo],
): ):
avatar_bg = Image.open(TEXT_PATH / "avatar_bg.png").resize((118, 118)) avatar_bg = Image.open(TEXT_PATH / "avatar_bg.png").resize((118, 118))
bar_img: Image.Image = Image.open(TEXT_PATH / "bar.png").convert("RGBA") bar_img: Image.Image = Image.open(TEXT_PATH / "bar.png").convert("RGBA")
@ -179,16 +176,12 @@ def draw_char(
charid = test_char.charId charid = test_char.charId
if charid == "char_1037_amiya3": if charid == "char_1037_amiya3":
charid = "char_1037_amiya3_2" charid = "char_1037_amiya3_2"
ui_char_avatar = ( ui_char_avatar = Image.open(UI_CHAR_AVATAR_PATH / f"{charid}.png").resize((90, 90)).convert("RGBA")
Image.open(UI_CHAR_AVATAR_PATH / f"{charid}.png").resize((90, 90)).convert("RGBA")
)
bar_img.paste(avatar_bg, (24, 5), mask=avatar_bg) bar_img.paste(avatar_bg, (24, 5), mask=avatar_bg)
bar_img.paste(ui_char_avatar, (38, 21), mask=ui_char_avatar) bar_img.paste(ui_char_avatar, (38, 21), mask=ui_char_avatar)
potential_rank = test_char.potentialRank potential_rank = test_char.potentialRank
potential_img = Image.open(POTENTIAL_HUB_PATH / f"potential_{potential_rank}.png").resize( potential_img = Image.open(POTENTIAL_HUB_PATH / f"potential_{potential_rank}.png").resize((45, 45))
(45, 45)
)
bar_img.paste(potential_img, (135, 67), mask=potential_img) bar_img.paste(potential_img, (135, 67), mask=potential_img)
elite_level = test_char.evolvePhase elite_level = test_char.evolvePhase
@ -226,7 +219,7 @@ def draw_char(
if char_skills is not None: if char_skills is not None:
for i, skill in enumerate(char_skills): for i, skill in enumerate(char_skills):
skill_id = skill.id_ skill_id = skill.id_
skill_icon_id = SKILL_TABLE.skills[skill_id].iconId skill_icon_id = EXCEL.SKILL_TABLE.skills[skill_id].iconId
skill_specialize_level = skill.specializeLevel skill_specialize_level = skill.specializeLevel
if skill_icon_id is None: if skill_icon_id is None:
skill_icon_id = skill_id skill_icon_id = skill_id
@ -234,9 +227,7 @@ def draw_char(
skill_img = skill_img.resize((70, 70)) skill_img = skill_img.resize((70, 70))
if test_char.defaultSkillId == skill_id: if test_char.defaultSkillId == skill_id:
skill_img.paste(skill_selected, (38, -1), mask=skill_selected) skill_img.paste(skill_selected, (38, -1), mask=skill_selected)
skill_specialize_img = Image.open( skill_specialize_img = Image.open(CHAR_COMMON_PATH / f"evolve_small_icon_{skill_specialize_level}.png")
CHAR_COMMON_PATH / f"evolve_small_icon_{skill_specialize_level}.png"
)
skill_img.paste(skill_specialize_img, (0, 0), mask=skill_specialize_img) skill_img.paste(skill_specialize_img, (0, 0), mask=skill_specialize_img)
skill_img = skill_img.resize((60, 60)) skill_img = skill_img.resize((60, 60))
bar_img.paste(skill_img, box=(355 + 70 * i, 37), mask=skill_img) bar_img.paste(skill_img, box=(355 + 70 * i, 37), mask=skill_img)
@ -256,9 +247,7 @@ def draw_char(
equip_type_icon = equipmentInfoMap[equip_id.id_].typeIcon equip_type_icon = equipmentInfoMap[equip_id.id_].typeIcon
if equip_type_icon == "original": if equip_type_icon == "original":
continue continue
equip_img = Image.open( equip_img = Image.open(UI_EQUIP_TYPE_DIRECTION_HUB_PATH / f"{equip_type_icon.lower()}.png").resize((92, 68))
UI_EQUIP_TYPE_DIRECTION_HUB_PATH / f"{equip_type_icon.lower()}.png"
).resize((92, 68))
if test_char.defaultEquipId == equip_id.id_: if test_char.defaultEquipId == equip_id.id_:
bar_img.paste(equip_selected, (626 + 67 * i, 31), mask=equip_selected) bar_img.paste(equip_selected, (626 + 67 * i, 31), mask=equip_selected)
bar_img.paste(equip_img, (616 + 68 * i, 32), mask=equip_img) bar_img.paste(equip_img, (616 + 68 * i, 32), mask=equip_img)

View File

@ -1,5 +1,3 @@
from typing import Dict
from gsuid_core.utils.plugins_config.models import ( from gsuid_core.utils.plugins_config.models import (
GSC, GSC,
GsBoolConfig, GsBoolConfig,
@ -8,10 +6,8 @@ from gsuid_core.utils.plugins_config.models import (
GsStrConfig, GsStrConfig,
) )
CONIFG_DEFAULT: Dict[str, GSC] = { CONIFG_DEFAULT: dict[str, GSC] = {
"SignTime": GsListStrConfig( "SignTime": GsListStrConfig("每晚签到时间设置", "每晚森空岛签到时间设置(时,分)", ["0", "38"]),
"每晚签到时间设置", "每晚森空岛签到时间设置(时,分)", ["0", "38"]
),
"SignReportSimple": GsBoolConfig( "SignReportSimple": GsBoolConfig(
"简洁签到报告", "简洁签到报告",
"开启后可以大大减少每日签到报告字数", "开启后可以大大减少每日签到报告字数",
@ -37,7 +33,5 @@ CONIFG_DEFAULT: Dict[str, GSC] = {
"用于设置ArknightsUID前缀的配置", "用于设置ArknightsUID前缀的配置",
"ark", "ark",
), ),
"AnnMinuteCheck": GsIntConfig( "AnnMinuteCheck": GsIntConfig("公告推送时间检测单位min", "公告推送时间检测单位min", 1, 60),
"公告推送时间检测单位min", "公告推送时间检测单位min", 1, 60
),
} }

View File

@ -1,5 +1,3 @@
from typing import Optional
from gsuid_core.logger import logger from gsuid_core.logger import logger
from ..utils.database.models import ArknightsPush, ArknightsUser from ..utils.database.models import ArknightsPush, ArknightsUser
@ -35,7 +33,7 @@ async def set_config_func(
uid: str = "0", uid: str = "0",
user_id: str = "", user_id: str = "",
option: str = "0", option: str = "0",
query: Optional[bool] = None, query: bool | None = None,
is_admin: bool = False, is_admin: bool = False,
): ):
# 这里将传入的中文config_name转换为英文status # 这里将传入的中文config_name转换为英文status
@ -60,7 +58,7 @@ async def set_config_func(
await ArknightsPush.update_push_data( await ArknightsPush.update_push_data(
uid, uid,
{ {
f'{PUSH_MAP[config_name.replace("推送", "")]}_push': option, f"{PUSH_MAP[config_name.replace('推送', '')]}_push": option,
}, },
) )
else: else:

View File

@ -1,5 +1,4 @@
from pathlib import Path from pathlib import Path
from typing import List, Tuple
from PIL import Image from PIL import Image
@ -12,7 +11,7 @@ back_four = Image.open(IMG_DIR / "back_four.png").convert("RGBA").resize((115, 3
# (140 388) # (140 388)
async def draw_gacha_image(char_get: List[Tuple[str, int]]): async def draw_gacha_image(char_get: list[tuple[str, int]]):
if len(char_get) != 10: if len(char_get) != 10:
return return
img = GACHA_BG.copy().resize((1170, 580)) img = GACHA_BG.copy().resize((1170, 580))
@ -43,7 +42,7 @@ async def draw_gacha_image(char_get: List[Tuple[str, int]]):
import asyncio import asyncio
test: List[Tuple[str, int]] = [ test: list[tuple[str, int]] = [
("char_328_cammou", 4), ("char_328_cammou", 4),
("char_473_mberry", 4), ("char_473_mberry", 4),
("char_103_angel", 5), ("char_103_angel", 5),

View File

@ -1,7 +1,6 @@
import json import json
import time import time
from pathlib import Path from pathlib import Path
from typing import List
from msgspec import convert from msgspec import convert
from msgspec import json as msgjson from msgspec import json as msgjson
@ -32,9 +31,7 @@ async def gacha(uid: str):
data = PlayerDataDetail( data = PlayerDataDetail(
user=PlayerData( user=PlayerData(
gacha=PlayerGacha( gacha=PlayerGacha(
newbee=PlayerGacha.PlayerNewbeeGachaPool( newbee=PlayerGacha.PlayerNewbeeGachaPool(openFlag=1, cnt=21, poolId="BOOT_0_1_2"),
openFlag=1, cnt=21, poolId="BOOT_0_1_2"
),
normal={}, normal={},
attain={}, attain={},
single={}, single={},
@ -64,7 +61,7 @@ async def testTenAdvancedGacha(
player_data: PlayerDataDetail, player_data: PlayerDataDetail,
useTkt: int = 0, useTkt: int = 0,
itemId: str = "4003", itemId: str = "4003",
) -> List[str]: ) -> list[str]:
now = int(time.time()) now = int(time.time())
newbeeGachaPoolClient = Excel.newbeeGachaPoolClient newbeeGachaPoolClient = Excel.newbeeGachaPoolClient
gachaPoolClient = Excel.gachaPoolClient gachaPoolClient = Excel.gachaPoolClient

View File

@ -2,7 +2,7 @@ import json
import random import random
import time import time
from pathlib import Path from pathlib import Path
from typing import ClassVar, List, Tuple from typing import ClassVar
from loguru import logger from loguru import logger
from msgspec import convert from msgspec import convert
@ -33,12 +33,10 @@ class GachaService:
RIT5_UP_CNT_2: ClassVar[int] = 20 RIT5_UP_CNT_2: ClassVar[int] = 20
RIT6_UP_CNT: ClassVar[int] = 50 RIT6_UP_CNT: ClassVar[int] = 50
forbiddenGachaPool: ClassVar[List[str]] = [] forbiddenGachaPool: ClassVar[list[str]] = []
@classmethod @classmethod
async def doAdvancedGacha( async def doAdvancedGacha(cls, poolId: str, ruleType: str, player_data: PlayerDataDetail) -> PoolWeightItem:
cls, poolId: str, ruleType: str, player_data: PlayerDataDetail
) -> PoolWeightItem:
pool = Server.details[poolId] pool = Server.details[poolId]
state = GachaService._tryGetTrackState(poolId, player_data) state = GachaService._tryGetTrackState(poolId, player_data)
@ -85,9 +83,7 @@ class GachaService:
return charHit return charHit
@staticmethod @staticmethod
async def handleNormalGacha( async def handleNormalGacha(poolId: str, useTkt: int, player_data: PlayerDataDetail) -> PoolWeightItem:
poolId: str, useTkt: int, player_data: PlayerDataDetail
) -> PoolWeightItem:
now = time.time() now = time.time()
poolClient = next(p for p in Excel.gachaPoolClient if p.gachaPoolId == poolId) poolClient = next(p for p in Excel.gachaPoolClient if p.gachaPoolId == poolId)
state = GachaService._tryGetTrackState(poolId, player_data) state = GachaService._tryGetTrackState(poolId, player_data)
@ -115,7 +111,7 @@ class GachaService:
@staticmethod @staticmethod
async def handleTenNormalGacha( async def handleTenNormalGacha(
poolId: str, itemId: str, useTkt: int, player_data: PlayerDataDetail poolId: str, itemId: str, useTkt: int, player_data: PlayerDataDetail
) -> List[PoolWeightItem]: ) -> list[PoolWeightItem]:
now = time.time() now = time.time()
poolClient = next(p for p in Excel.gachaPoolClient if p.gachaPoolId == poolId) poolClient = next(p for p in Excel.gachaPoolClient if p.gachaPoolId == poolId)
state = GachaService._tryGetTrackState(poolId, player_data) state = GachaService._tryGetTrackState(poolId, player_data)
@ -167,14 +163,10 @@ class GachaService:
# 调试状态下模拟客户端请求时需强制完成`obt/guide/l0-0/1_recruit_adv` # 调试状态下模拟客户端请求时需强制完成`obt/guide/l0-0/1_recruit_adv`
curPool.cnt -= 1 curPool.cnt -= 1
return await GachaService.doAdvancedGacha( return await GachaService.doAdvancedGacha(poolId=poolId, ruleType=RuleType.NEWBEE, player_data=player_data)
poolId=poolId, ruleType=RuleType.NEWBEE, player_data=player_data
)
@staticmethod @staticmethod
async def handleTenNewbieGacha( async def handleTenNewbieGacha(poolId: str, player_data: PlayerDataDetail) -> list[PoolWeightItem]:
poolId: str, player_data: PlayerDataDetail
) -> List[PoolWeightItem]:
now = time.time() now = time.time()
poolClient = next(p for p in Excel.newbeeGachaPoolClient if p.gachaPoolId == poolId) poolClient = next(p for p in Excel.newbeeGachaPoolClient if p.gachaPoolId == poolId)
carousel = next(g for g in Excel.carousel if g.poolId == poolId) carousel = next(g for g in Excel.carousel if g.poolId == poolId)
@ -195,7 +187,7 @@ class GachaService:
curPool.cnt -= 10 curPool.cnt -= 10
result: List[PoolWeightItem] = [] result: list[PoolWeightItem] = []
for _ in range(10): for _ in range(10):
obj = await GachaService.doAdvancedGacha( obj = await GachaService.doAdvancedGacha(
poolId=poolId, poolId=poolId,
@ -210,7 +202,7 @@ class GachaService:
poolId: str, poolId: str,
useTkt: int, useTkt: int,
player_data: PlayerDataDetail, player_data: PlayerDataDetail,
) -> Tuple[PoolWeightItem, List]: ) -> tuple[PoolWeightItem, list]:
now = time.time() now = time.time()
poolClient = next(p for p in Excel.gachaPoolClient if p.gachaPoolId == poolId) poolClient = next(p for p in Excel.gachaPoolClient if p.gachaPoolId == poolId)
state = GachaService._tryGetTrackState(poolId, player_data) state = GachaService._tryGetTrackState(poolId, player_data)
@ -241,7 +233,7 @@ class GachaService:
@staticmethod @staticmethod
async def handleTenLimitedGacha( async def handleTenLimitedGacha(
poolId: str, itemId: str, useTkt: int, player_data: PlayerDataDetail poolId: str, itemId: str, useTkt: int, player_data: PlayerDataDetail
) -> Tuple[List[PoolWeightItem], List[List]]: ) -> tuple[list[PoolWeightItem], list[list]]:
now = time.time() now = time.time()
poolClient = next(p for p in Excel.gachaPoolClient if p.gachaPoolId == poolId) poolClient = next(p for p in Excel.gachaPoolClient if p.gachaPoolId == poolId)
state = GachaService._tryGetTrackState(poolId, player_data) state = GachaService._tryGetTrackState(poolId, player_data)
@ -260,7 +252,7 @@ class GachaService:
## === ↑ ***基础数据校验*** ↑ === ## === ↑ ***基础数据校验*** ↑ ===
# 处理 lmtgs -> itemGet # 处理 lmtgs -> itemGet
result: List[PoolWeightItem] = [] result: list[PoolWeightItem] = []
for _ in range(10): for _ in range(10):
obj = await GachaService.doAdvancedGacha( obj = await GachaService.doAdvancedGacha(
@ -304,7 +296,7 @@ class GachaService:
poolId: str, poolId: str,
useTkt: int, useTkt: int,
player_data: PlayerDataDetail, player_data: PlayerDataDetail,
) -> List[PoolWeightItem]: ) -> list[PoolWeightItem]:
now = time.time() now = time.time()
poolClient = next(p for p in Excel.gachaPoolClient if p.gachaPoolId == poolId) poolClient = next(p for p in Excel.gachaPoolClient if p.gachaPoolId == poolId)
state = GachaService._tryGetTrackState(poolId, player_data) state = GachaService._tryGetTrackState(poolId, player_data)
@ -321,7 +313,7 @@ class GachaService:
# useTkt:7|CLASSIC_TKT_GACHA_10 -> useTkt:8|CLASSIC_TKT_GACHA -> useTkt:2|TKT_GACHA_10 -> useTkt:5|TKT_GACHA -> useTkt:0|DIAMOND_SHD -> gacha tkt state error # useTkt:7|CLASSIC_TKT_GACHA_10 -> useTkt:8|CLASSIC_TKT_GACHA -> useTkt:2|TKT_GACHA_10 -> useTkt:5|TKT_GACHA -> useTkt:0|DIAMOND_SHD -> gacha tkt state error
## === ↑ ***基础数据校验*** ↑ === ## === ↑ ***基础数据校验*** ↑ ===
result: List[PoolWeightItem] = [] result: list[PoolWeightItem] = []
for _ in range(10): for _ in range(10):
obj = await GachaService.doAdvancedGacha( obj = await GachaService.doAdvancedGacha(
poolId=poolId, poolId=poolId,
@ -332,9 +324,7 @@ class GachaService:
return result return result
@classmethod @classmethod
async def tryInitGachaRule( async def tryInitGachaRule(cls, poolClient: GachaPoolClientData, player_data: PlayerDataDetail) -> None:
cls, poolClient: GachaPoolClientData, player_data: PlayerDataDetail
) -> None:
poolId = poolClient.gachaPoolId poolId = poolClient.gachaPoolId
if poolClient.gachaRuleType in [RuleType.ATTAIN, RuleType.CLASSIC_ATTAIN]: if poolClient.gachaRuleType in [RuleType.ATTAIN, RuleType.CLASSIC_ATTAIN]:
await cls._initAttainPoolState(poolId, poolClient, player_data) await cls._initAttainPoolState(poolId, poolClient, player_data)
@ -351,9 +341,7 @@ class GachaService:
return player_data.track.gacha.pool[poolId] return player_data.track.gacha.pool[poolId]
@staticmethod @staticmethod
async def _initAttainPoolState( async def _initAttainPoolState(poolId: str, poolClient: GachaPoolClientData, player_data: PlayerDataDetail) -> None:
poolId: str, poolClient: GachaPoolClientData, player_data: PlayerDataDetail
) -> None:
if poolId not in player_data.user.gacha.attain: if poolId not in player_data.user.gacha.attain:
attain6Count = (poolClient.dynMeta or {}).get("attainRare6Num", 0) attain6Count = (poolClient.dynMeta or {}).get("attainRare6Num", 0)
poolObj = player_data.user.gacha.PlayerAttainGacha(attain6Count=attain6Count) poolObj = player_data.user.gacha.PlayerAttainGacha(attain6Count=attain6Count)

View File

@ -24,9 +24,7 @@ with cur_path.joinpath("gacha_detail_table.json").open(encoding="UTF-8") as f:
class GachaTrigger: class GachaTrigger:
@classmethod @classmethod
async def postAdvancedGacha( async def postAdvancedGacha(cls, poolId: str, charHit: PoolWeightItem, player_data: PlayerDataDetail) -> None:
cls, poolId: str, charHit: PoolWeightItem, player_data: PlayerDataDetail
) -> None:
if poolId not in [p.gachaPoolId for p in Excel.newbeeGachaPoolClient]: if poolId not in [p.gachaPoolId for p in Excel.newbeeGachaPoolClient]:
poolClient = next(p for p in Excel.gachaPoolClient if p.gachaPoolId == poolId) poolClient = next(p for p in Excel.gachaPoolClient if p.gachaPoolId == poolId)
if poolClient.gachaRuleType == RuleType.LINKAGE: if poolClient.gachaRuleType == RuleType.LINKAGE:
@ -54,9 +52,7 @@ class GachaTrigger:
# return self.track.pool[poolId] # return self.track.pool[poolId]
@staticmethod @staticmethod
async def _trigLinkageType( async def _trigLinkageType(poolId: str, charHit: PoolWeightItem, player_data: PlayerDataDetail) -> None:
poolId: str, charHit: PoolWeightItem, player_data: PlayerDataDetail
) -> None:
pool = Server.details[poolId] pool = Server.details[poolId]
poolClient = next(p for p in Excel.gachaPoolClient if p.gachaPoolId == poolId) poolClient = next(p for p in Excel.gachaPoolClient if p.gachaPoolId == poolId)
track = player_data.track.gacha.pool[poolId] track = player_data.track.gacha.pool[poolId]
@ -108,9 +104,7 @@ class GachaTrigger:
player_data.track.gacha.nonNormal6StarCnt = track.non6StarCnt player_data.track.gacha.nonNormal6StarCnt = track.non6StarCnt
@staticmethod @staticmethod
async def _trigAttainType( async def _trigAttainType(poolId: str, charHit: PoolWeightItem, player_data: PlayerDataDetail) -> None:
poolId: str, charHit: PoolWeightItem, player_data: PlayerDataDetail
) -> None:
pool = Server.details[poolId] pool = Server.details[poolId]
weightPool = await PoolGenerator.build(pool) weightPool = await PoolGenerator.build(pool)
attain = player_data.user.gacha.attain[poolId] attain = player_data.user.gacha.attain[poolId]
@ -127,17 +121,13 @@ class GachaTrigger:
attain.attain6Count -= 1 attain.attain6Count -= 1
@staticmethod @staticmethod
async def _trigClassicType( async def _trigClassicType(poolId: str, charHit: PoolWeightItem, player_data: PlayerDataDetail) -> None:
poolId: str, charHit: PoolWeightItem, player_data: PlayerDataDetail
) -> None:
track = player_data.track.gacha.pool[poolId] track = player_data.track.gacha.pool[poolId]
player_data.track.gacha.nonClassic6StarCnt = track.non6StarCnt player_data.track.gacha.nonClassic6StarCnt = track.non6StarCnt
charHit.isClassic = True charHit.isClassic = True
@staticmethod @staticmethod
async def _trigSingleType( async def _trigSingleType(poolId: str, charHit: PoolWeightItem, player_data: PlayerDataDetail) -> None:
poolId: str, charHit: PoolWeightItem, player_data: PlayerDataDetail
) -> None:
pool = Server.details[poolId] pool = Server.details[poolId]
single = player_data.user.gacha.single[poolId] single = player_data.user.gacha.single[poolId]
charHit.singleEnsureCnt = 150 if single.singleEnsureCnt < 0 else single.singleEnsureCnt charHit.singleEnsureCnt = 150 if single.singleEnsureCnt < 0 else single.singleEnsureCnt
@ -162,17 +152,13 @@ class GachaTrigger:
charHit.isSingleEnsure = True charHit.isSingleEnsure = True
@staticmethod @staticmethod
async def _trigFesClassicType( async def _trigFesClassicType(poolId: str, charHit: PoolWeightItem, player_data: PlayerDataDetail) -> None:
poolId: str, charHit: PoolWeightItem, player_data: PlayerDataDetail
) -> None:
track = player_data.track.gacha.pool[poolId] track = player_data.track.gacha.pool[poolId]
player_data.track.gacha.nonClassic6StarCnt = track.non6StarCnt player_data.track.gacha.nonClassic6StarCnt = track.non6StarCnt
charHit.isClassic = True charHit.isClassic = True
@staticmethod @staticmethod
async def _trigClassicAttainType( async def _trigClassicAttainType(poolId: str, charHit: PoolWeightItem, player_data: PlayerDataDetail) -> None:
poolId: str, charHit: PoolWeightItem, player_data: PlayerDataDetail
) -> None:
pool = Server.details[poolId] pool = Server.details[poolId]
weightPool = await PoolGenerator.build(pool) weightPool = await PoolGenerator.build(pool)
attain = player_data.user.gacha.attain[poolId] attain = player_data.user.gacha.attain[poolId]

View File

@ -1,7 +1,7 @@
from enum import Enum from enum import Enum
# from typing_extensions import TypeAlias # from typing_extensions import TypeAlias
from typing import Any, Dict, List, Union from typing import Any
from msgspec import Struct, field from msgspec import Struct, field
@ -29,23 +29,23 @@ class LinkageRuleType(StrEnum):
class GachaPerAvail(Struct): class GachaPerAvail(Struct):
rarityRank: int rarityRank: int
charIdList: List[str] charIdList: list[str]
totalPercent: float totalPercent: float
class GachaAvailChar(Struct): class GachaAvailChar(Struct):
perAvailList: List[GachaPerAvail] perAvailList: list[GachaPerAvail]
class GachaPerChar(Struct): class GachaPerChar(Struct):
rarityRank: int rarityRank: int
charIdList: List[str] charIdList: list[str]
percent: float percent: float
count: int count: int
class GachaUpChar(Struct): class GachaUpChar(Struct):
perCharList: List[GachaPerChar] perCharList: list[GachaPerChar]
class GachaWeightUpChar(Struct): class GachaWeightUpChar(Struct):
@ -58,7 +58,7 @@ class GachaObject(Struct):
gachaObject: str gachaObject: str
type_: int = field(name="type") type_: int = field(name="type")
imageType: int imageType: int
param: Union[str, None] param: str | None
class GachaGroupObject(Struct): class GachaGroupObject(Struct):
@ -69,15 +69,15 @@ class GachaGroupObject(Struct):
class GachaDetailInfo(Struct): class GachaDetailInfo(Struct):
availCharInfo: GachaAvailChar availCharInfo: GachaAvailChar
upCharInfo: Union[GachaUpChar, None] upCharInfo: GachaUpChar | None
weightUpCharInfoList: Union[List[GachaWeightUpChar], None] weightUpCharInfoList: list[GachaWeightUpChar] | None
limitedChar: Union[List[str], None] limitedChar: list[str] | None
gachaObjList: List[GachaObject] gachaObjList: list[GachaObject]
gachaObjGroups: Union[List[GachaGroupObject], None] gachaObjGroups: list[GachaGroupObject] | None
class GachaDetailTable(Struct): class GachaDetailTable(Struct):
details: Dict[str, GachaDetailInfo] details: dict[str, GachaDetailInfo]
class GachaDataLinkageTenGachaTkt(Struct): class GachaDataLinkageTenGachaTkt(Struct):
@ -118,24 +118,24 @@ class GachaDataRecruitRange(Struct):
class PotentialMaterialConverterConfig(Struct): class PotentialMaterialConverterConfig(Struct):
items: Dict[str, ItemBundle] items: dict[str, ItemBundle]
class RecruitPoolRecruitTime(Struct): class RecruitPoolRecruitTime(Struct):
timeLength: int timeLength: int
recruitPrice: int recruitPrice: int
accumRate: Union[float, None] = None accumRate: float | None = None
class RecruitConstantsData(Struct): class RecruitConstantsData(Struct):
tagPriceList: Dict[str, int] tagPriceList: dict[str, int]
maxRecruitTime: int maxRecruitTime: int
rarityWeights: None = None rarityWeights: None = None
recruitTimeFactorList: None = None recruitTimeFactorList: None = None
class RecruitPool(Struct): class RecruitPool(Struct):
recruitTimeTable: List[RecruitPoolRecruitTime] recruitTimeTable: list[RecruitPoolRecruitTime]
recruitConstants: RecruitConstantsData recruitConstants: RecruitConstantsData
recruitCharacterList: None = None recruitCharacterList: None = None
maskTypeWeightTable: None = None maskTypeWeightTable: None = None
@ -148,30 +148,30 @@ class NewbeeGachaPoolClientData(Struct):
gachaPoolDetail: str gachaPoolDetail: str
gachaPrice: int gachaPrice: int
gachaTimes: int gachaTimes: int
gachaOffset: Union[str, None] = None gachaOffset: str | None = None
firstOpenDay: Union[int, None] = None firstOpenDay: int | None = None
reOpenDay: Union[int, None] = None reOpenDay: int | None = None
gachaPoolItems: None = None gachaPoolItems: None = None
signUpEarliestTime: Union[int, None] = None signUpEarliestTime: int | None = None
class GachaPoolClientData(Struct): class GachaPoolClientData(Struct):
CDPrimColor: Union[str, None] CDPrimColor: str | None
CDSecColor: Union[str, None] CDSecColor: str | None
endTime: int endTime: int
gachaIndex: int gachaIndex: int
gachaPoolDetail: Union[str, None] gachaPoolDetail: str | None
gachaPoolId: str gachaPoolId: str
gachaPoolName: str gachaPoolName: str
gachaPoolSummary: str gachaPoolSummary: str
gachaRuleType: str gachaRuleType: str
guarantee5Avail: int guarantee5Avail: int
guarantee5Count: int guarantee5Count: int
LMTGSID: Union[str, None] LMTGSID: str | None
openTime: int openTime: int
dynMeta: Union[Dict[str, Any], None] = None dynMeta: dict[str, Any] | None = None
linkageParam: Union[Dict[str, Any], None] = None linkageParam: dict[str, Any] | None = None
linkageRuleId: Union[str, None] = None linkageRuleId: str | None = None
class GachaTag(Struct): class GachaTag(Struct):
@ -190,13 +190,13 @@ class SpecialRecruitPool(Struct):
endDateTime: int endDateTime: int
order: int order: int
recruitId: str recruitId: str
recruitTimeTable: List[SpecialRecruitPoolSpecialRecruitCostData] recruitTimeTable: list[SpecialRecruitPoolSpecialRecruitCostData]
startDateTime: int startDateTime: int
tagId: int tagId: int
tagName: str tagName: str
CDPrimColor: Union[str, None] CDPrimColor: str | None
CDSecColor: Union[str, None] CDSecColor: str | None
LMTGSID: Union[str, None] LMTGSID: str | None
gachaRuleType: str gachaRuleType: str
@ -208,35 +208,35 @@ class GachaDataFesGachaPoolRelateItem(Struct):
class GachaTable(Struct): class GachaTable(Struct):
__version__ = "24-03-29-14-33-44-5002d2" __version__ = "24-03-29-14-33-44-5002d2"
gachaTags: List[GachaTag] gachaTags: list[GachaTag]
carousel: List[GachaDataCarouselData] carousel: list[GachaDataCarouselData]
classicPotentialMaterialConverter: PotentialMaterialConverterConfig classicPotentialMaterialConverter: PotentialMaterialConverterConfig
dicRecruit6StarHint: Union[Dict[str, str], None] dicRecruit6StarHint: dict[str, str] | None
fesGachaPoolRelateItem: Union[Dict[str, GachaDataFesGachaPoolRelateItem], None] fesGachaPoolRelateItem: dict[str, GachaDataFesGachaPoolRelateItem] | None
freeGacha: List[GachaDataFreeLimitGachaData] freeGacha: list[GachaDataFreeLimitGachaData]
gachaPoolClient: List[GachaPoolClientData] gachaPoolClient: list[GachaPoolClientData]
limitTenGachaItem: List[GachaDataLimitTenGachaTkt] limitTenGachaItem: list[GachaDataLimitTenGachaTkt]
linkageTenGachaItem: List[GachaDataLinkageTenGachaTkt] linkageTenGachaItem: list[GachaDataLinkageTenGachaTkt]
newbeeGachaPoolClient: List[NewbeeGachaPoolClientData] newbeeGachaPoolClient: list[NewbeeGachaPoolClientData]
potentialMaterialConverter: PotentialMaterialConverterConfig potentialMaterialConverter: PotentialMaterialConverterConfig
recruitDetail: str recruitDetail: str
recruitPool: RecruitPool recruitPool: RecruitPool
recruitRarityTable: Dict[str, GachaDataRecruitRange] recruitRarityTable: dict[str, GachaDataRecruitRange]
specialRecruitPool: List[SpecialRecruitPool] specialRecruitPool: list[SpecialRecruitPool]
specialTagRarityTable: Dict[str, List[int]] specialTagRarityTable: dict[str, list[int]]
gachaTagMaxValid: Union[int, None] = None gachaTagMaxValid: int | None = None
potentialMats: Union[Dict, None] = None potentialMats: dict | None = None
classicPotentialMats: Union[Dict, None] = None classicPotentialMats: dict | None = None
class GachaDetailDataPerAvail(Struct): class GachaDetailDataPerAvail(Struct):
rarityRank: int rarityRank: int
charIdList: List[str] charIdList: list[str]
totalPercent: float totalPercent: float
class GachaDetailDataGachaAvailChar(Struct): class GachaDetailDataGachaAvailChar(Struct):
perAvailList: List[GachaDetailDataPerAvail] perAvailList: list[GachaDetailDataPerAvail]
class PoolWeightItem(Struct): class PoolWeightItem(Struct):
@ -245,12 +245,12 @@ class PoolWeightItem(Struct):
type_: str = field(name="type") type_: str = field(name="type")
rarity: int rarity: int
isClassic: bool = field(default=False) isClassic: bool = field(default=False)
beforeNonHitCnt: Union[int, None] = field(default=None) beforeNonHitCnt: int | None = field(default=None)
singleEnsureCnt: Union[int, None] = field(default=None) singleEnsureCnt: int | None = field(default=None)
isSingleEnsure: Union[bool, None] = field(default=None) isSingleEnsure: bool | None = field(default=None)
def bulidLog(self) -> Dict: def bulidLog(self) -> dict:
m_log: Dict[str, Union[bool, int]] = {} m_log: dict[str, bool | int] = {}
if self.beforeNonHitCnt is not None: if self.beforeNonHitCnt is not None:
m_log["beforeNonHitCnt"] = self.beforeNonHitCnt m_log["beforeNonHitCnt"] = self.beforeNonHitCnt
if self.singleEnsureCnt is not None: if self.singleEnsureCnt is not None:
@ -262,10 +262,10 @@ class PoolWeightItem(Struct):
class gachaGroupConfig(Struct): class gachaGroupConfig(Struct):
normalCharCnt: int normalCharCnt: int
weights: List[float] = field(default_factory=list) weights: list[float] = field(default_factory=list)
pool: List[PoolWeightItem] = field(default_factory=list) pool: list[PoolWeightItem] = field(default_factory=list)
upChars_1: List[str] = field(default_factory=list) upChars_1: list[str] = field(default_factory=list)
upChars_2: List[str] = field(default_factory=list) upChars_2: list[str] = field(default_factory=list)
perUpWeight_1: float = field(default=0.0) perUpWeight_1: float = field(default=0.0)
perUpWeight_2: float = field(default=0.0) perUpWeight_2: float = field(default=0.0)
totalWeights: float = field(default=1.0) totalWeights: float = field(default=1.0)
@ -276,13 +276,13 @@ class GachaPoolInfo(Struct, omit_defaults=False):
totalCnt: int = field(default=0) totalCnt: int = field(default=0)
non6StarCnt: int = field(default=0) non6StarCnt: int = field(default=0)
non5StarCnt: int = field(default=0) non5StarCnt: int = field(default=0)
gain5Star: List[str] = field(default_factory=list) gain5Star: list[str] = field(default_factory=list)
gain6Star: List[str] = field(default_factory=list) gain6Star: list[str] = field(default_factory=list)
history: List[str] = field(default_factory=list) history: list[str] = field(default_factory=list)
class GachaTrackModel(Struct, omit_defaults=False): class GachaTrackModel(Struct, omit_defaults=False):
pool: Dict[str, GachaPoolInfo] = field(default_factory=dict) pool: dict[str, GachaPoolInfo] = field(default_factory=dict)
nonNormal6StarCnt: int = field(default=0) nonNormal6StarCnt: int = field(default=0)
nonClassic6StarCnt: int = field(default=0) nonClassic6StarCnt: int = field(default=0)
@ -317,20 +317,20 @@ class PlayerGacha(Struct):
singleEnsureCnt: int singleEnsureCnt: int
singleEnsureUse: bool singleEnsureUse: bool
singleEnsureChar: str singleEnsureChar: str
cnt: Union[int, None] = field(default=None) cnt: int | None = field(default=None)
maxCnt: Union[int, None] = field(default=None) maxCnt: int | None = field(default=None)
avail: Union[bool, None] = field(default=None) avail: bool | None = field(default=None)
class PlayerFesClassicGacha(Struct): class PlayerFesClassicGacha(Struct):
upChar: Dict[str, List[str]] upChar: dict[str, list[str]]
newbee: PlayerNewbeeGachaPool newbee: PlayerNewbeeGachaPool
normal: Dict[str, PlayerGachaPool] normal: dict[str, PlayerGachaPool]
attain: Dict[str, PlayerAttainGacha] attain: dict[str, PlayerAttainGacha]
single: Dict[str, PlayerSingleGacha] single: dict[str, PlayerSingleGacha]
fesClassic: Dict[str, PlayerFesClassicGacha] fesClassic: dict[str, PlayerFesClassicGacha]
limit: Dict[str, PlayerFreeLimitGacha] limit: dict[str, PlayerFreeLimitGacha]
linkage: Dict[str, Dict[str, PlayerLinkageGacha]] linkage: dict[str, dict[str, PlayerLinkageGacha]]
class PlayerTrack(Struct): class PlayerTrack(Struct):

View File

@ -1,6 +1,4 @@
from typing import List, Tuple, overload from typing import TypeAlias, overload
from typing_extensions import TypeAlias
from .models import ( from .models import (
GachaDetailDataGachaAvailChar, GachaDetailDataGachaAvailChar,
@ -10,8 +8,8 @@ from .models import (
gachaGroupConfig, gachaGroupConfig,
) )
PoolResultA: TypeAlias = Tuple[List[float], List[PoolWeightItem]] PoolResultA: TypeAlias = tuple[list[float], list[PoolWeightItem]]
PoolResultB: TypeAlias = List[List[Tuple[List[float], List[PoolWeightItem]]]] PoolResultB: TypeAlias = list[list[tuple[list[float], list[PoolWeightItem]]]]
class PoolGenerator: class PoolGenerator:
@ -22,9 +20,7 @@ class PoolGenerator:
if not group.charIdList: if not group.charIdList:
continue continue
for charId in group.charIdList: for charId in group.charIdList:
weightObj = PoolWeightItem( weightObj = PoolWeightItem(id_=charId, count=1, type_="CHAR", rarity=group.rarityRank)
id_=charId, count=1, type_="CHAR", rarity=group.rarityRank
)
pool.append(weightObj) pool.append(weightObj)
length = len(group.charIdList) length = len(group.charIdList)
weights.extend([group.totalPercent / length] * length) weights.extend([group.totalPercent / length] * length)
@ -36,9 +32,7 @@ class PoolGenerator:
@overload @overload
@classmethod @classmethod
async def build( async def build(cls, detail: GachaDetailInfo, poolId: str, player_data: PlayerDataDetail) -> PoolResultB: ...
cls, detail: GachaDetailInfo, poolId: str, player_data: PlayerDataDetail
) -> PoolResultB: ...
@classmethod @classmethod
async def build(cls, *args) -> PoolResultB: # type: ignore[overload-overlap] async def build(cls, *args) -> PoolResultB: # type: ignore[overload-overlap]
@ -54,9 +48,7 @@ class PoolGenerator:
for group in detail.availCharInfo.perAvailList: for group in detail.availCharInfo.perAvailList:
conf = gachaGroupConfig(normalCharCnt=len(group.charIdList)) conf = gachaGroupConfig(normalCharCnt=len(group.charIdList))
if info := detail.upCharInfo: if info := detail.upCharInfo:
upGroup = next( upGroup = next((x for x in info.perCharList if x.rarityRank == group.rarityRank), None)
(x for x in info.perCharList if x.rarityRank == group.rarityRank), None
)
if upGroup is not None: if upGroup is not None:
conf.upChars_1 = upGroup.charIdList conf.upChars_1 = upGroup.charIdList
conf.perUpWeight_1 = upGroup.percent conf.perUpWeight_1 = upGroup.percent
@ -68,11 +60,7 @@ class PoolGenerator:
conf.perUpWeight_2 = info[0].weight conf.perUpWeight_2 = info[0].weight
conf.normalCharCnt -= len(conf.upChars_2) conf.normalCharCnt -= len(conf.upChars_2)
rate = conf.perUpWeight_2 // 100 rate = conf.perUpWeight_2 // 100
conf.perUpWeight_2 = ( conf.perUpWeight_2 = conf.totalWeights / (conf.normalCharCnt + len(conf.upChars_2) * rate) * rate
conf.totalWeights
/ (conf.normalCharCnt + len(conf.upChars_2) * rate)
* rate
)
conf.totalWeights -= conf.perUpWeight_2 * len(conf.upChars_2) conf.totalWeights -= conf.perUpWeight_2 * len(conf.upChars_2)
for charId in group.charIdList: for charId in group.charIdList:
weightObj = PoolWeightItem( weightObj = PoolWeightItem(
@ -92,9 +80,7 @@ class PoolGenerator:
return result return result
@staticmethod @staticmethod
async def _buildFesCustomPool( async def _buildFesCustomPool(detail: GachaDetailInfo, poolId: str, player_data: PlayerDataDetail) -> PoolResultB:
detail: GachaDetailInfo, poolId: str, player_data: PlayerDataDetail
) -> PoolResultB:
result = [[] for _ in range(6)] result = [[] for _ in range(6)]
for group in detail.availCharInfo.perAvailList: for group in detail.availCharInfo.perAvailList:
conf = gachaGroupConfig(normalCharCnt=len(group.charIdList)) conf = gachaGroupConfig(normalCharCnt=len(group.charIdList))

View File

@ -1,5 +1,4 @@
from pathlib import Path from pathlib import Path
from typing import Dict, Union
import aiofiles import aiofiles
from gsuid_core.help.draw_plugin_help import get_help from gsuid_core.help.draw_plugin_help import get_help
@ -18,16 +17,16 @@ TEXT_PATH = Path(__file__).parent / "texture2d"
HELP_DATA = Path(__file__).parent / "Help.json" HELP_DATA = Path(__file__).parent / "Help.json"
async def get_help_data() -> Union[Dict[str, PluginHelp], None]: async def get_help_data() -> dict[str, PluginHelp] | None:
if HELP_DATA.exists(): if HELP_DATA.exists():
async with aiofiles.open(HELP_DATA, "rb") as file: async with aiofiles.open(HELP_DATA, "rb") as file:
return msgjson.decode( return msgjson.decode(
await file.read(), await file.read(),
type=Dict[str, PluginHelp], type=dict[str, PluginHelp],
) )
async def get_core_help() -> Union[bytes, str]: async def get_core_help() -> bytes | str:
help_data = await get_help_data() help_data = await get_help_data()
if help_data is None: if help_data is None:
return "暂未找到帮助数据..." return "暂未找到帮助数据..."
@ -42,8 +41,6 @@ async def get_core_help() -> Union[bytes, str]:
Image.open(TEXT_PATH / "banner.png"), Image.open(TEXT_PATH / "banner.png"),
Image.open(TEXT_PATH / "button.png"), Image.open(TEXT_PATH / "button.png"),
source_han_sans_cn_origin, source_han_sans_cn_origin,
extra_message=[ extra_message=[f"Client Version:{Arknights_Client_version} Res version: {Arknights_Res_version}"],
f"Client Version:{Arknights_Client_version} " f" Res version: {Arknights_Res_version}"
],
) )
return img return img

View File

@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from typing import ClassVar, Dict, TypeVar, Union from typing import ClassVar, TypeVar
import httpx import httpx
from gsuid_core.utils.plugins_config.gs_config import core_plugins_config from gsuid_core.utils.plugins_config.gs_config import core_plugins_config
@ -36,19 +36,19 @@ class SklandLoginError(Exception):
return self.url + " " + self.message return self.url + " " + self.message
def transUnset(v: Union[T1, UnsetType], d: T2 = None) -> Union[T1, T2]: def transUnset(v: T1 | UnsetType, d: T2 = None) -> T1 | T2:
return v if not isinstance(v, UnsetType) else d return v if not isinstance(v, UnsetType) else d
class SklandLogin: class SklandLogin:
_HEADER: ClassVar[Dict[str, str]] = { _HEADER: ClassVar[dict[str, str]] = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36", # noqa: E501 "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36", # noqa: E501
"content-type": "application/json;charset=UTF-8", "content-type": "application/json;charset=UTF-8",
"origin": "https://ak.hypergryph.com", "origin": "https://ak.hypergryph.com",
"referer": "https://ak.hypergryph.com", "referer": "https://ak.hypergryph.com",
} }
def __init__(self, phone: str, geetest_token: Union[str, None] = None): def __init__(self, phone: str, geetest_token: str | None = None):
self.phone = phone self.phone = phone
self.client = httpx.Client( self.client = httpx.Client(
headers=self._HEADER, headers=self._HEADER,
@ -60,7 +60,7 @@ class SklandLogin:
def send_phone_code( def send_phone_code(
self, self,
override_geetest: Union[GeneralGeetestData, None] = None, override_geetest: GeneralGeetestData | None = None,
): ):
if override_geetest: if override_geetest:
data = GeneralV1SendPhoneCodeRequest( data = GeneralV1SendPhoneCodeRequest(

View File

@ -1,5 +1,3 @@
from typing import Dict, Union
from msgspec import UNSET, Struct, UnsetType, field from msgspec import UNSET, Struct, UnsetType, field
@ -12,7 +10,7 @@ class GeneralGeetestData(Struct):
class GeneralV1SendPhoneCodeRequest(Struct): class GeneralV1SendPhoneCodeRequest(Struct):
phone: str phone: str
type: int type: int
captcha: Union[GeneralGeetestData, UnsetType] = field(default=UNSET) captcha: GeneralGeetestData | UnsetType = field(default=UNSET)
class CaptchaItemModel(Struct): class CaptchaItemModel(Struct):
@ -28,9 +26,9 @@ class GeneralV1SendPhoneCodeData(Struct):
class GeneralV1SendPhoneCodeResponse(Struct): class GeneralV1SendPhoneCodeResponse(Struct):
status: int status: int
msg: Union[str, UnsetType] = field(default=UNSET) msg: str | UnsetType = field(default=UNSET)
type: Union[str, UnsetType] = field(default=UNSET) type: str | UnsetType = field(default=UNSET)
data: Union[GeneralV1SendPhoneCodeData, UnsetType] = field(default=UNSET) data: GeneralV1SendPhoneCodeData | UnsetType = field(default=UNSET)
class TokenData(Struct): class TokenData(Struct):
@ -44,9 +42,9 @@ class UserAuthV2TokenByPhoneCodeRequest(Struct):
class UserAuthV2TokenByPhoneCodeResponse(Struct): class UserAuthV2TokenByPhoneCodeResponse(Struct):
status: int status: int
msg: Union[str, UnsetType] = field(default=UNSET) msg: str | UnsetType = field(default=UNSET)
data: Union[TokenData, UnsetType] = field(default=UNSET) data: TokenData | UnsetType = field(default=UNSET)
type: Union[str, UnsetType] = field(default=UNSET) type: str | UnsetType = field(default=UNSET)
class AccountInfoHGRequest(Struct): class AccountInfoHGRequest(Struct):
@ -56,7 +54,7 @@ class AccountInfoHGRequest(Struct):
class AccountInfoHGResponse(Struct): class AccountInfoHGResponse(Struct):
code: int code: int
msg: str msg: str
data: Dict data: dict
class GeetestData(Struct): class GeetestData(Struct):
@ -80,19 +78,19 @@ class Oauth2V2GrantRequest(Struct):
class Oauth2V2CodeDataItemResponse(Struct): class Oauth2V2CodeDataItemResponse(Struct):
hgId: Union[str, UnsetType] = field(default=UNSET) hgId: str | UnsetType = field(default=UNSET)
token: Union[str, UnsetType] = field(default=UNSET) token: str | UnsetType = field(default=UNSET)
code: Union[str, UnsetType] = field(default=UNSET) code: str | UnsetType = field(default=UNSET)
uid: Union[str, UnsetType] = field(default=UNSET) uid: str | UnsetType = field(default=UNSET)
delete_commit_ts: Union[int, UnsetType] = field(default=UNSET) delete_commit_ts: int | UnsetType = field(default=UNSET)
delete_request_ts: Union[int, UnsetType] = field(default=UNSET) delete_request_ts: int | UnsetType = field(default=UNSET)
class Oauth2V2GrantResponse(Struct): class Oauth2V2GrantResponse(Struct):
status: int status: int
msg: str msg: str
data: Union[Oauth2V2CodeDataItemResponse, UnsetType] = field(default=UNSET) data: Oauth2V2CodeDataItemResponse | UnsetType = field(default=UNSET)
type: Union[str, UnsetType] = field(default=UNSET) type: str | UnsetType = field(default=UNSET)
class ZonaiSklandWebUserGenerateCredByCodeRequest(Struct): class ZonaiSklandWebUserGenerateCredByCodeRequest(Struct):

View File

@ -1,158 +1,8 @@
import asyncio import asyncio
import json
import threading import threading
from pathlib import Path
from gsuid_core.logger import logger from torappu_excel import ExcelTableManager
from ..utils.models.gamedata.BattleEquipTable import BattleEquipTable EXCEL: ExcelTableManager = ExcelTableManager()
from ..utils.models.gamedata.BuildingData import BuildingData
from ..utils.models.gamedata.CampaignTable import CampaignTable
from ..utils.models.gamedata.ChapterTable import ChapterTable
from ..utils.models.gamedata.CharacterTable import CharacterTable
from ..utils.models.gamedata.CharMetaTable import CharMetaTable
from ..utils.models.gamedata.CharmTable import CharmTable
from ..utils.models.gamedata.CharPatchTable import CharPatchTable
from ..utils.models.gamedata.CharwordTable import CharwordTable
from ..utils.models.gamedata.CheckinTable import CheckinTable
from ..utils.models.gamedata.ClimbTowerTable import ClimbTowerTable
from ..utils.models.gamedata.ClueData import ClueData
from ..utils.models.gamedata.CrisisTable import CrisisTable
from ..utils.models.gamedata.CrisisV2Table import CrisisV2Table
from ..utils.models.gamedata.EnemyHandbookTable import EnemyHandbookTable
from ..utils.models.gamedata.FavorTable import FavorTable
from ..utils.models.gamedata.GachaTable import GachaTable
from ..utils.models.gamedata.GamedataConst import GamedataConst
from ..utils.models.gamedata.HandbookInfoTable import HandbookInfoTable
from ..utils.models.gamedata.HandbookTable import HandbookTable
from ..utils.models.gamedata.HandbookTeamTable import HandbookTeamTable
from ..utils.models.gamedata.MedalTable import MedalTable
from ..utils.models.gamedata.MissionTable import MissionTable
from ..utils.models.gamedata.OpenServerTable import OpenServerTable
from ..utils.models.gamedata.PlayerAvatarTable import PlayerAvatarTable
from ..utils.models.gamedata.RangeTable import RangeTable
from ..utils.models.gamedata.ReplicateTable import ReplicateTable
from ..utils.models.gamedata.RetroTable import RetroTable
from ..utils.models.gamedata.RoguelikeTable import RoguelikeTable
from ..utils.models.gamedata.RoguelikeTopicTable import RoguelikeTopicTable
from ..utils.models.gamedata.SandboxTable import SandboxTable
from ..utils.models.gamedata.ShopClientTable import ShopClientTable
from ..utils.models.gamedata.SkillTable import SkillTable
from ..utils.models.gamedata.SkinTable import SkinTable
from ..utils.models.gamedata.StageTable import StageTable
from ..utils.models.gamedata.StoryReviewMetaTable import StoryReviewMetaTable
from ..utils.models.gamedata.StoryReviewTable import StoryReviewTable
from ..utils.models.gamedata.StoryTable import StoryTable
from ..utils.models.gamedata.TechBuffTable import TechBuffTable
from ..utils.models.gamedata.TipTable import TipTable
from ..utils.models.gamedata.TokenTable import TokenTable
from ..utils.models.gamedata.UniequipData import UniequipData
from ..utils.models.gamedata.UniequipTable import UniEquipTable
from ..utils.models.gamedata.ZoneTable import ZoneTable
from ..utils.resource.download_all_resource import download_all_resource
from ..utils.resource.RESOURCE_PATH import GAMEDATA_PATH
threading.Thread(target=lambda: asyncio.run(EXCEL.preload_table()), daemon=True).start()
def read_json(file_path: Path, **kwargs) -> dict:
"""
Read a JSON file and return its contents as a dictionary.
"""
try:
with Path.open(file_path, encoding="UTF-8", **kwargs) as file:
return json.load(file)
except (FileNotFoundError, json.JSONDecodeError) as e:
logger.error(f"Error reading JSON file: {e}")
return {}
threading.Thread(target=lambda: asyncio.run(download_all_resource()), daemon=True).start()
# ACTIVITY_TABLE = ActivityTable.convert(read_json(GAMEDATA_PATH / 'activity_table.json'))
# AUDIO_DATA = AudioData.convert(read_json(GAMEDATA_PATH / 'audio_data.json'))
BATTLE_EQUIP_TABLE = BattleEquipTable.convert(
{"equips": read_json(GAMEDATA_PATH / "battle_equip_table.json")}
)
BUILDING_DATA = BuildingData.convert(read_json(GAMEDATA_PATH / "building_data.json"))
CAMPAIGN_TABLE = CampaignTable.convert(read_json(GAMEDATA_PATH / "campaign_table.json"))
CHAPTER_TABLE = ChapterTable.convert(
{"chapters": read_json(GAMEDATA_PATH / "chapter_table.json")}
)
CHARACTER_TABLE = CharacterTable.convert(
{"chars": read_json(GAMEDATA_PATH / "character_table.json")}
)
CHAR_META_TABLE = CharMetaTable.convert(read_json(GAMEDATA_PATH / "char_meta_table.json"))
CHARM_TABLE = CharmTable.convert(read_json(GAMEDATA_PATH / "charm_table.json"))
CHAR_PATH_TABLE = CharPatchTable.convert(read_json(GAMEDATA_PATH / "char_patch_table.json"))
CHARWORD_TABLE = CharwordTable.convert(read_json(GAMEDATA_PATH / "charword_table.json"))
CHECKIN_TABLE = CheckinTable.convert(read_json(GAMEDATA_PATH / "checkin_table.json"))
CLIMB_TOWER_TABLE = ClimbTowerTable.convert(read_json(GAMEDATA_PATH / "climb_tower_table.json"))
CLUE_DATA = ClueData.convert(read_json(GAMEDATA_PATH / "clue_data.json"))
CRISIS_TABLE = CrisisTable.convert(read_json(GAMEDATA_PATH / "crisis_table.json"))
CRISIS_V2_TABLE = CrisisV2Table.convert(read_json(GAMEDATA_PATH / "crisis_v2_table.json"))
# DISPLAY_META_TABLE = DisplayMetaTable.convert(read_json(GAMEDATA_PATH / 'display_meta_table.json'))
ENEMY_HANDBOOK_TABLE = EnemyHandbookTable.convert(
read_json(GAMEDATA_PATH / "enemy_handbook_table.json")
)
FAVOR_TABLE = FavorTable.convert(read_json(GAMEDATA_PATH / "favor_table.json"))
GACHA_TABLE = GachaTable.convert(read_json(GAMEDATA_PATH / "gacha_table.json"))
GAMEDATA_CONST = GamedataConst.convert(read_json(GAMEDATA_PATH / "gamedata_const.json"))
HANDBOOK_INFO_TABLE = HandbookInfoTable.convert(
read_json(GAMEDATA_PATH / "handbook_info_table.json")
)
HANDBOOK_TABLE = HandbookTable.convert(read_json(GAMEDATA_PATH / "handbook_table.json"))
HANDBOOK_TEAM_TABLE = HandbookTeamTable.convert(
{"team": read_json(GAMEDATA_PATH / "handbook_team_table.json")}
)
# ITEM_TABLE = ItemTable.convert(read_json(GAMEDATA_PATH / "item_table.json"))
MEDAL_TABLE = MedalTable.convert(read_json(GAMEDATA_PATH / "medal_table.json"))
MISSION_TABLE = MissionTable.convert(read_json(GAMEDATA_PATH / "mission_table.json"))
OPEN_SERVER_TABLE = OpenServerTable.convert(read_json(GAMEDATA_PATH / "open_server_table.json"))
PLAYER_AVATAR_TABLE = PlayerAvatarTable.convert(
read_json(GAMEDATA_PATH / "player_avatar_table.json")
)
RANGE_TABLE = RangeTable.convert({"range_": read_json(GAMEDATA_PATH / "range_table.json")})
REPLICATE_TABLE = ReplicateTable.convert(
{"replicate": read_json(GAMEDATA_PATH / "replicate_table.json")}
)
RETRO_TABLE = RetroTable.convert(read_json(GAMEDATA_PATH / "retro_table.json"))
ROGUELIKE_TABLE = RoguelikeTable.convert(read_json(GAMEDATA_PATH / "roguelike_table.json"))
ROGUELIKE_TOPIC_TABLE = RoguelikeTopicTable.convert(
read_json(GAMEDATA_PATH / "roguelike_topic_table.json")
)
SANDBOX_TABLE = SandboxTable.convert(read_json(GAMEDATA_PATH / "sandbox_table.json"))
# SANDBOX_PERM_TABLE = SandboxPermTable.convert(
# read_json(GAMEDATA_PATH / "sandbox_perm_table.json")
# )
SHOP_CLIENT_TABLE = ShopClientTable.convert(read_json(GAMEDATA_PATH / "shop_client_table.json"))
SKILL_TABLE = SkillTable.convert(
{"skills": read_json(Path(__file__).parent / "skill_table.json")}
)
SKIN_TABLE = SkinTable.convert(read_json(GAMEDATA_PATH / "skin_table.json"))
STAGE_TABLE = StageTable.convert(read_json(GAMEDATA_PATH / "stage_table.json"))
STORY_REVIEW_META_TABLE = StoryReviewMetaTable.convert(
read_json(GAMEDATA_PATH / "story_review_meta_table.json")
)
STORY_REVIEW_TABLE = StoryReviewTable.convert(
{"storyreviewtable": read_json(GAMEDATA_PATH / "story_review_table.json")}
)
STORY_TABLE = StoryTable.convert({"stories": read_json(GAMEDATA_PATH / "story_table.json")})
TECH_BUFF_TABLE = TechBuffTable.convert(read_json(GAMEDATA_PATH / "tech_buff_table.json"))
TIP_TABLE = TipTable.convert(read_json(GAMEDATA_PATH / "tip_table.json"))
TOKEN_TABLE = TokenTable.convert({"tokens": read_json(GAMEDATA_PATH / "token_table.json")})
UNIEQUIP_DATA = UniequipData.convert(read_json(GAMEDATA_PATH / "uniequip_data.json"))
UNIEQUIP_TABLE = UniEquipTable.convert(read_json(GAMEDATA_PATH / "uniequip_table.json"))
ZONE_TABLE = ZoneTable.convert(read_json(GAMEDATA_PATH / "zone_table.json"))

View File

@ -33,9 +33,7 @@ async def get_role_img(uid: str):
# secretary_charId = secretary.charId # secretary_charId = secretary.charId
secretary_skinId = secretary.skinId.replace("@", "_") secretary_skinId = secretary.skinId.replace("@", "_")
secretary_char_img = ( secretary_char_img = Image.open(SKINPACK_PATH / f"{secretary_skinId}b.png").resize((768, 768)).convert("RGBA")
Image.open(SKINPACK_PATH / f"{secretary_skinId}b.png").resize((768, 768)).convert("RGBA")
)
char_info.paste(secretary_char_img, (0, -20), secretary_char_img) char_info.paste(secretary_char_img, (0, -20), secretary_char_img)
# 放基础信息 # 放基础信息

View File

@ -3,8 +3,6 @@ import json
import random import random
import aiohttp import aiohttp
from msgspec import Struct, convert
from gsuid_core.aps import scheduler from gsuid_core.aps import scheduler
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.data_store import get_res_path from gsuid_core.data_store import get_res_path
@ -12,6 +10,7 @@ from gsuid_core.logger import logger
from gsuid_core.models import Event from gsuid_core.models import Event
from gsuid_core.subscribe import gs_subscribe from gsuid_core.subscribe import gs_subscribe
from gsuid_core.sv import SV from gsuid_core.sv import SV
from msgspec import Struct, convert
from ..arknightsuid_config import PREFIX from ..arknightsuid_config import PREFIX
@ -44,9 +43,7 @@ async def check_update() -> UpdateCheckResult:
bool: if the resource version is updated bool: if the resource version is updated
""" """
async with aiohttp.ClientSession() as session: async with aiohttp.ClientSession() as session:
async with session.get( async with session.get("https://ak-conf.hypergryph.com/config/prod/official/Android/version") as response:
"https://ak-conf.hypergryph.com/config/prod/official/Android/version"
) as response:
data = json.loads(await response.text()) data = json.loads(await response.text())
version = convert(data, VersionModel) version = convert(data, VersionModel)
@ -58,19 +55,14 @@ async def check_update() -> UpdateCheckResult:
json.dump(data, f, indent=2) json.dump(data, f, indent=2)
logger.info("First time checking version") logger.info("First time checking version")
return UpdateCheckResult( return UpdateCheckResult(version=version, old_version=None, client_updated=False, res_updated=False)
version=version, old_version=None, client_updated=False, res_updated=False
)
else: else:
with open(version_path, encoding="utf-8") as f: with open(version_path, encoding="utf-8") as f:
base_version_json = json.load(f) base_version_json = json.load(f)
base_version = convert(base_version_json, VersionModel) base_version = convert(base_version_json, VersionModel)
if ( if version.clientVersion != base_version.clientVersion or version.resVersion != base_version.resVersion:
version.clientVersion != base_version.clientVersion
or version.resVersion != base_version.resVersion
):
with open(version_path, "w", encoding="utf-8") as f: with open(version_path, "w", encoding="utf-8") as f:
json.dump(data, f, indent=2) json.dump(data, f, indent=2)
@ -92,9 +84,7 @@ async def check_update() -> UpdateCheckResult:
@sv_server_check.on_command("取明日方舟最新版本") @sv_server_check.on_command("取明日方舟最新版本")
async def get_latest_version(bot: Bot, ev: Event): async def get_latest_version(bot: Bot, ev: Event):
result = await check_update() result = await check_update()
await bot.send( await bot.send(f"clientVersion: {result.version.clientVersion}\nresVersion: {result.version.resVersion}")
f"clientVersion: {result.version.clientVersion}\nresVersion: {result.version.resVersion}"
)
@sv_server_check_sub.on_fullmatch(f"{PREFIX}订阅版本更新") @sv_server_check_sub.on_fullmatch(f"{PREFIX}订阅版本更新")

View File

@ -60,9 +60,7 @@ async def send_daily_sign():
try: try:
for bot_id in gss.active_bot: for bot_id in gss.active_bot:
for single in private_msg_list[qid]: for single in private_msg_list[qid]:
await gss.active_bot[bot_id].target_send( await gss.active_bot[bot_id].target_send(single["msg"], "direct", qid, single["bot_id"], "", "")
single["msg"], "direct", qid, single["bot_id"], "", ""
)
except Exception as e: except Exception as e:
logger.warning(f"[ARK每日全部签到] QQ {qid} 私聊推送失败!错误信息:{e}") logger.warning(f"[ARK每日全部签到] QQ {qid} 私聊推送失败!错误信息:{e}")
await asyncio.sleep(0.5) await asyncio.sleep(0.5)

View File

@ -1,8 +1,8 @@
import asyncio import asyncio
import random import random
from collections.abc import Sequence
from copy import deepcopy from copy import deepcopy
from datetime import datetime from datetime import datetime
from typing import Sequence
from gsuid_core.gss import gss from gsuid_core.gss import gss
from gsuid_core.logger import logger from gsuid_core.logger import logger

View File

@ -26,9 +26,7 @@ ark_skd_cred_add = SV("森空岛cred绑定")
# await bot.send(uid_list) # await bot.send(uid_list)
@sv_user_info.on_command( @sv_user_info.on_command((f"{PREFIX}绑定uid", f"{PREFIX}切换uid", f"{PREFIX}删除uid", f"{PREFIX}解绑uid"))
(f"{PREFIX}绑定uid", f"{PREFIX}切换uid", f"{PREFIX}删除uid", f"{PREFIX}解绑uid")
)
async def send_link_uid_msg(bot: Bot, ev: Event): async def send_link_uid_msg(bot: Bot, ev: Event):
await bot.logger.info("开始执行[绑定/解绑用户信息]") await bot.logger.info("开始执行[绑定/解绑用户信息]")
qid = ev.user_id qid = ev.user_id
@ -52,7 +50,7 @@ async def send_link_uid_msg(bot: Bot, ev: Event):
) )
elif "切换" in ev.command: elif "切换" in ev.command:
data = await ArknightsBind.switch_uid_by_game(qid, ev.bot_id, ark_uid) data = await ArknightsBind.switch_uid_by_game(qid, ev.bot_id, ark_uid)
if isinstance(data, List): if isinstance(data, list):
return await bot.send(f"切换ARK_UID{ark_uid}成功!") return await bot.send(f"切换ARK_UID{ark_uid}成功!")
else: else:
return await bot.send(f"尚未绑定该ARK_UID{ark_uid}") return await bot.send(f"尚未绑定该ARK_UID{ark_uid}")

View File

@ -3,9 +3,7 @@ import re
from ..utils.ark_api import ark_skd_api from ..utils.ark_api import ark_skd_api
from ..utils.database.models import ArknightsBind, ArknightsPush, ArknightsUser from ..utils.database.models import ArknightsBind, ArknightsPush, ArknightsUser
ERROR_HINT = ( ERROR_HINT = "添加失败, 格式为: skd添加cred Cred 例如: skd添加cred VropL583Sb1hClS5buQ4nSASkDlL8tMT"
"添加失败, 格式为: skd添加cred Cred 例如: skd添加cred VropL583Sb1hClS5buQ4nSASkDlL8tMT"
)
UID_HINT = "添加失败, 请先绑定明日方舟UID" UID_HINT = "添加失败, 请先绑定明日方舟UID"

View File

@ -8,7 +8,7 @@ from gsuid_core.utils.image.convert import convert_img
from gsuid_core.utils.image.image_tools import draw_center_text_by_line from gsuid_core.utils.image.image_tools import draw_center_text_by_line
from PIL import Image, ImageDraw from PIL import Image, ImageDraw
from ..arknightsuid_resource.constants import CHARACTER_TABLE from ..arknightsuid_resource.constants import EXCEL
from ..arknightsuid_wiki.draw_wiki_img import ( from ..arknightsuid_wiki.draw_wiki_img import (
# draw_wiki, # draw_wiki,
get_equip_info, get_equip_info,
@ -44,7 +44,7 @@ async def send_role_wiki_pic(bot: Bot, ev: Event):
logger.info(char_name) logger.info(char_name)
char_id = None char_id = None
for char_id_, char_info in CHARACTER_TABLE.chars.items(): for char_id_, char_info in EXCEL.CHARATER_TABLE.chars.items():
if char_info.name == char_name: if char_info.name == char_name:
char_id = char_id_ char_id = char_id_
break break
@ -62,7 +62,7 @@ async def send_equip_wiki_pic(bot: Bot, ev: Event):
char_name = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text)) char_name = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text))
char_id = None char_id = None
for char_id_, char_info in CHARACTER_TABLE.chars.items(): for char_id_, char_info in EXCEL.CHARATER_TABLE.chars.items():
if char_info.name == char_name: if char_info.name == char_name:
char_id = char_id_ char_id = char_id_
break break

View File

@ -2,20 +2,13 @@ import asyncio
import re import re
from pathlib import Path from pathlib import Path
from pprint import pformat from pprint import pformat
from typing import Dict, Union
from gsuid_core.utils.colortext.ColorText import ColorTextGroup, split_ctg from gsuid_core.utils.colortext.ColorText import ColorTextGroup, split_ctg
from gsuid_core.utils.image.image_tools import draw_text_by_line from gsuid_core.utils.image.image_tools import draw_text_by_line
from jinja2 import Template from jinja2 import Template
from PIL import Image, ImageDraw from PIL import Image, ImageDraw
from ..arknightsuid_resource.constants import ( from ..arknightsuid_resource.constants import EXCEL
BATTLE_EQUIP_TABLE,
CHARACTER_TABLE,
RANGE_TABLE,
SKILL_TABLE,
UNIEQUIP_TABLE,
)
from ..utils.fonts.source_han_sans import ( from ..utils.fonts.source_han_sans import (
sans_font_24, sans_font_24,
sans_font_34, sans_font_34,
@ -92,7 +85,7 @@ def test_ctg(length: int, *params):
f_ = pformat(split_ctg(groups_, length)).split("\n") f_ = pformat(split_ctg(groups_, length)).split("\n")
def render_template(template_str: str, data: Dict[str, Union[float, Union[int, None]]]): def render_template(template_str: str, data: dict[str, float | int | None]):
matches = re.finditer(r"\{([^}:]+)\}", template_str) matches = re.finditer(r"\{([^}:]+)\}", template_str)
matches_1 = re.finditer(r"\{([^{}]+):([^{}]+)\}", template_str) matches_1 = re.finditer(r"\{([^{}]+):([^{}]+)\}", template_str)
@ -132,15 +125,15 @@ async def get_equip_info(char_id: str):
im = "" im = ""
try: try:
char_equip_id_list = UNIEQUIP_TABLE.charEquip[char_id] char_equip_id_list = EXCEL.UNIEQUIP_TABLE.charEquip[char_id]
except KeyError: except KeyError:
return "该干员没有模组" return "该干员没有模组"
for char_equip_id in char_equip_id_list: for char_equip_id in char_equip_id_list:
equip_dict = UNIEQUIP_TABLE.equipDict[char_equip_id] equip_dict = EXCEL.UNIEQUIP_TABLE.equipDict[char_equip_id]
uniequip_name = equip_dict.uniEquipName uniequip_name = equip_dict.uniEquipName
try: try:
char_equip_phases = BATTLE_EQUIP_TABLE.equips[char_equip_id].phases char_equip_phases = EXCEL.BATTLE_EQUIP_TABLE.equips[char_equip_id].phases
except KeyError: except KeyError:
continue continue
@ -173,9 +166,7 @@ async def get_equip_info(char_id: str):
blackboard_dict[blackboard_.key] = blackboard_.value blackboard_dict[blackboard_.key] = blackboard_.value
if additionalDescription: if additionalDescription:
additionalDescription = re.sub(r"<[^>]+>", "", additionalDescription) additionalDescription = re.sub(r"<[^>]+>", "", additionalDescription)
additionalDescription = render_template( additionalDescription = render_template(additionalDescription, blackboard_dict)
additionalDescription, blackboard_dict
)
additionalDescription = re.sub(r".000000", "", additionalDescription) additionalDescription = re.sub(r".000000", "", additionalDescription)
im += f"{additionalDescription}\n" im += f"{additionalDescription}\n"
@ -202,9 +193,7 @@ async def get_equip_info(char_id: str):
blackboard_dict[blackboard_.key] = blackboard_.value blackboard_dict[blackboard_.key] = blackboard_.value
if additionalDescription and blackboard: if additionalDescription and blackboard:
additionalDescription = re.sub(r"<[^>]+>", "", additionalDescription) additionalDescription = re.sub(r"<[^>]+>", "", additionalDescription)
additionalDescription = render_template( additionalDescription = render_template(additionalDescription, blackboard_dict)
additionalDescription, blackboard_dict
)
additionalDescription = re.sub(r".000000", "", additionalDescription) additionalDescription = re.sub(r".000000", "", additionalDescription)
im += f"{additionalDescription}\n" im += f"{additionalDescription}\n"
@ -230,9 +219,7 @@ async def get_equip_info(char_id: str):
blackboard_dict[blackboard_.key] = blackboard_.value blackboard_dict[blackboard_.key] = blackboard_.value
if overrideDescripton and blackboard: if overrideDescripton and blackboard:
overrideDescripton = re.sub(r"<[^>]+>", "", overrideDescripton) overrideDescripton = re.sub(r"<[^>]+>", "", overrideDescripton)
overrideDescripton = render_template( overrideDescripton = render_template(overrideDescripton, blackboard_dict)
overrideDescripton, blackboard_dict
)
im += f"{overrideDescripton}\n" im += f"{overrideDescripton}\n"
else: else:
raise NotImplementedError raise NotImplementedError
@ -247,20 +234,20 @@ async def get_equip_info(char_id: str):
async def get_wiki_info(char_id: str): async def get_wiki_info(char_id: str):
im = "" im = ""
character_data = CHARACTER_TABLE[char_id] character_data = EXCEL.CHARATER_TABLE.chars[char_id]
char_name = character_data.name char_name = character_data.name
im += f"干员名: {char_name}\n" im += f"干员名: {char_name}\n"
im += "-----------------\n" im += "-----------------\n"
char_rarity = character_data.rarity char_rarity = character_data.rarity.value
im += f"星级: {char_rarity + 1!s}\n" im += f"星级: {char_rarity + 1!s}\n"
im += "-----------------\n" im += "-----------------\n"
profession = character_data.profession profession = character_data.profession.name
im += f"职业: {profession_en_to_cn[profession]}\n" im += f"职业: {profession_en_to_cn[profession]}\n"
char_position = character_data.position char_position = character_data.position
im += f"攻击方式: {char_position_en_to_cn[char_position]}\n" im += f"攻击方式: {char_position_en_to_cn[char_position]}\n"
sub_profession_id = character_data.subProfessionId sub_profession_id = character_data.subProfessionId
sub_profession = UNIEQUIP_TABLE.subProfDict[sub_profession_id].subProfessionName sub_profession = EXCEL.UNIEQUIP_TABLE.subProfDict[sub_profession_id].subProfessionName
im += f"子职业: {sub_profession}\n" im += f"子职业: {sub_profession}\n"
im += "-----------------\n" im += "-----------------\n"
nation_id = character_data.nationId nation_id = character_data.nationId
@ -301,7 +288,7 @@ async def get_wiki_info(char_id: str):
if potential.buff: if potential.buff:
potential_add_attribute = potential.buff.attributes.attributeModifiers potential_add_attribute = potential.buff.attributes.attributeModifiers
if len(potential.buff.attributes.attributeModifiers) == 1: if len(potential.buff.attributes.attributeModifiers) == 1:
potential_add_attribute_type = potential_add_attribute[0].attributeType potential_add_attribute_type = potential_add_attribute[0].attributeType.value
potential_add_attribute_value = potential_add_attribute[0].value potential_add_attribute_value = potential_add_attribute[0].value
potential_add_dict[potential_id] = ( potential_add_dict[potential_id] = (
potential_add_attribute_type, potential_add_attribute_type,
@ -328,7 +315,7 @@ async def get_wiki_info(char_id: str):
im += "技能:\n" im += "技能:\n"
for skill in skill_id_list: for skill in skill_id_list:
skill_data = SKILL_TABLE.skills[skill] skill_data = EXCEL.SKILL_TABLE.skills[skill]
skill_level_data = skill_data.levels[-1] skill_level_data = skill_data.levels[-1]
skill_name = skill_level_data.name skill_name = skill_level_data.name
im += f"技能名: {skill_name}\n" im += f"技能名: {skill_name}\n"
@ -362,15 +349,13 @@ async def get_wiki_info(char_id: str):
im += f"初始: {skill_sp_data.initSp} " im += f"初始: {skill_sp_data.initSp} "
im += f"持续: {skill_duration!s}\n" im += f"持续: {skill_duration!s}\n"
skill_blackboard_data = skill_level_data.blackboard skill_blackboard_data = skill_level_data.blackboard
black_board_dict: dict[str, Union[Union[int, float], None]] = {} black_board_dict: dict[str, int | float | None] = {}
for black_board in skill_blackboard_data: for black_board in skill_blackboard_data:
black_board_dict[black_board.key] = black_board.value black_board_dict[black_board.key] = black_board.value
if skill_description: if skill_description:
skill_description = skill_description.replace(":0.0", "") skill_description = skill_description.replace(":0.0", "")
skill_description = re.sub(r"<[^>]+>", "", skill_description) skill_description = re.sub(r"<[^>]+>", "", skill_description)
skill_description = render_template(skill_description, black_board_dict).replace( skill_description = render_template(skill_description, black_board_dict).replace("--", "-")
"--", "-"
)
last_skill_description = re.sub(r".000000", "", skill_description) last_skill_description = re.sub(r".000000", "", skill_description)
if "{" in last_skill_description: if "{" in last_skill_description:
raise NotImplementedError raise NotImplementedError
@ -392,7 +377,7 @@ async def draw_wiki(char_id: str):
img.paste(vvan_img, (-700, -100), vvan_img) img.paste(vvan_img, (-700, -100), vvan_img)
img.paste(title_img, (0, -50), title_img) img.paste(title_img, (0, -50), title_img)
character_data = CHARACTER_TABLE[char_id] character_data = EXCEL.CHARATER_TABLE.chars[char_id]
char_name = character_data.name char_name = character_data.name
draw.text( draw.text(
@ -407,7 +392,7 @@ async def draw_wiki(char_id: str):
rarity_img = Image.open(TEXTURE2D_PATH / f"rarity_yellow_{char_rarity}.png") rarity_img = Image.open(TEXTURE2D_PATH / f"rarity_yellow_{char_rarity}.png")
img.paste(rarity_img, (960, 120), rarity_img) img.paste(rarity_img, (960, 120), rarity_img)
profession = character_data.profession profession = character_data.profession.name
profession_img = Image.open(TEXTURE2D_PATH / f"icon_{profession.lower()}.png") profession_img = Image.open(TEXTURE2D_PATH / f"icon_{profession.lower()}.png")
img.paste(profession_img, (1100, 7050), profession_img) img.paste(profession_img, (1100, 7050), profession_img)
@ -427,7 +412,7 @@ async def draw_wiki(char_id: str):
) )
sub_profession_id = character_data.subProfessionId sub_profession_id = character_data.subProfessionId
sub_profession = UNIEQUIP_TABLE.subProfDict[sub_profession_id].subProfessionName sub_profession = EXCEL.UNIEQUIP_TABLE.subProfDict[sub_profession_id].subProfessionName
bar_img_draw.text( bar_img_draw.text(
(360, 100), (360, 100),
sub_profession, sub_profession,
@ -589,7 +574,7 @@ async def draw_wiki(char_id: str):
range_id = char_phases_data.rangeId range_id = char_phases_data.rangeId
attack_area_img = Image.open(TEXTURE2D_PATH / "attack_area.png") attack_area_img = Image.open(TEXTURE2D_PATH / "attack_area.png")
if range_id: if range_id:
range_data = RANGE_TABLE.range_[range_id] range_data = EXCEL.RANGE_TABLE.range_[range_id]
grids = range_data.grids grids = range_data.grids
area_0 = Image.open(TEXTURE2D_PATH / "area_0.png").resize((58, 58)) area_0 = Image.open(TEXTURE2D_PATH / "area_0.png").resize((58, 58))
area_1 = Image.open(TEXTURE2D_PATH / "area_1.png") area_1 = Image.open(TEXTURE2D_PATH / "area_1.png")
@ -608,7 +593,7 @@ async def draw_wiki(char_id: str):
if potential.buff: if potential.buff:
potential_add_attribute = potential.buff.attributes.attributeModifiers potential_add_attribute = potential.buff.attributes.attributeModifiers
if len(potential.buff.attributes.attributeModifiers) == 1: if len(potential.buff.attributes.attributeModifiers) == 1:
potential_add_attribute_type = potential_add_attribute[0].attributeType potential_add_attribute_type = potential_add_attribute[0].attributeType.value
potential_add_attribute_value = potential_add_attribute[0].value potential_add_attribute_value = potential_add_attribute[0].value
potential_add_dict[potential_id] = ( potential_add_dict[potential_id] = (
potential_add_attribute_type, potential_add_attribute_type,
@ -640,21 +625,19 @@ async def draw_wiki(char_id: str):
skill_bg = Image.open(TEXTURE2D_PATH / "skill_bg.png") skill_bg = Image.open(TEXTURE2D_PATH / "skill_bg.png")
skill3_bar_bg = Image.open(TEXTURE2D_PATH / "skill3_bar.png") skill3_bar_bg = Image.open(TEXTURE2D_PATH / "skill3_bar.png")
skill_data = SKILL_TABLE.skills[skill] skill_data = EXCEL.SKILL_TABLE.skills[skill]
skill_level_data = skill_data.levels[-1] skill_level_data = skill_data.levels[-1]
skill_name = skill_level_data.name skill_name = skill_level_data.name
skill_description = skill_level_data.description skill_description = skill_level_data.description
skill_sp_data = skill_level_data.spData skill_sp_data = skill_level_data.spData
skill_duration = skill_level_data.duration skill_duration = skill_level_data.duration
skill_blackboard_data = skill_level_data.blackboard skill_blackboard_data = skill_level_data.blackboard
black_board_dict: dict[str, Union[Union[int, float], None]] = {} black_board_dict: dict[str, int | float | None] = {}
for black_board in skill_blackboard_data: for black_board in skill_blackboard_data:
black_board_dict[black_board.key] = black_board.value black_board_dict[black_board.key] = black_board.value
if skill_description: if skill_description:
skill_description = re.sub(r"<[^>]+>", "", skill_description) skill_description = re.sub(r"<[^>]+>", "", skill_description)
skill_description = render_template(skill_description, black_board_dict).replace( skill_description = render_template(skill_description, black_board_dict).replace("--", "-")
"--", "-"
)
last_skill_description = re.sub(r".000000", "", skill_description) last_skill_description = re.sub(r".000000", "", skill_description)
if "{" in last_skill_description: if "{" in last_skill_description:
raise NotImplementedError raise NotImplementedError

View File

@ -3,7 +3,7 @@ import hmac
import json import json
import time import time
from copy import deepcopy from copy import deepcopy
from typing import Any, Dict, Literal, Tuple, Union, cast from typing import Any, Literal, cast
from urllib.parse import urlparse from urllib.parse import urlparse
import msgspec import msgspec
@ -31,7 +31,7 @@ ssl_verify = core_plugins_config.get_config("MhySSLVerify").data
# header["dId"] = await get_d_id() # header["dId"] = await get_d_id()
# return header # return header
_HEADER: Dict[str, str] = { _HEADER: dict[str, str] = {
"User-Agent": "Skland/1.28.0 (com.hypergryph.skland; build:102800063; Android 35; ) Okhttp/4.11.0", "User-Agent": "Skland/1.28.0 (com.hypergryph.skland; build:102800063; Android 35; ) Okhttp/4.11.0",
"Accept-Encoding": "gzip", "Accept-Encoding": "gzip",
"Connection": "close", "Connection": "close",
@ -52,9 +52,7 @@ header_for_sign = {
} }
def generate_signature( def generate_signature(token: str, path: str, body_or_query: str, dId: str = "") -> tuple[str, dict[str, str]]:
token: str, path: str, body_or_query: str, dId: str = ""
) -> Tuple[str, Dict[str, str]]:
t = str(int(time.time()) - 2) t = str(int(time.time()) - 2)
_token = token.encode("utf-8") _token = token.encode("utf-8")
header_ca = header_for_sign.copy() header_ca = header_for_sign.copy()
@ -71,7 +69,7 @@ def get_sign_header(
token: str, token: str,
url: str, url: str,
method: str, method: str,
body: Union[dict[Any, Any], None], body: dict[Any, Any] | None,
old_header: dict[str, str], old_header: dict[str, str],
): ):
h = old_header.copy() h = old_header.copy()
@ -93,13 +91,13 @@ class TokenRefreshFailed(Exception):
class BaseArkApi: class BaseArkApi:
proxy_url: Union[str, None] = proxy_url if proxy_url else None proxy_url: str | None = proxy_url if proxy_url else None
async def _pass( async def _pass(
self, self,
gt: str, gt: str,
ch: str, ch: str,
) -> Tuple[Union[str, None], Union[str, None]]: ) -> tuple[str | None, str | None]:
_pass_api = core_plugins_config.get_config("_pass_API").data _pass_api = core_plugins_config.get_config("_pass_API").data
if _pass_api: if _pass_api:
data = await self._ark_request( data = await self._ark_request(
@ -119,15 +117,15 @@ class BaseArkApi:
async def get_game_player_info( async def get_game_player_info(
self, self,
uid: str, uid: str,
) -> Union[int, ArknightsPlayerInfoModel]: ) -> int | ArknightsPlayerInfoModel:
cred: Union[str, None] = await ArknightsUser.get_user_attr_by_uid( cred: str | None = await ArknightsUser.get_user_attr_by_uid(
uid=uid, uid=uid,
attr="cred", attr="cred",
) )
if cred is None: if cred is None:
logger.info(f"cred is None {uid}") logger.info(f"cred is None {uid}")
return -60 return -60
token: Union[str, None] = await ArknightsUser.get_user_attr_by_uid( token: str | None = await ArknightsUser.get_user_attr_by_uid(
uid=uid, uid=uid,
attr="token", attr="token",
) )
@ -165,14 +163,14 @@ class BaseArkApi:
else: else:
return msgspec.convert(unpack_data, type=ArknightsPlayerInfoModel) return msgspec.convert(unpack_data, type=ArknightsPlayerInfoModel)
async def skd_sign(self, uid: str) -> Union[int, ArknightsAttendanceModel]: async def skd_sign(self, uid: str) -> int | ArknightsAttendanceModel:
cred: Union[str, None] = await ArknightsUser.get_user_attr_by_uid( cred: str | None = await ArknightsUser.get_user_attr_by_uid(
uid=uid, uid=uid,
attr="cred", attr="cred",
) )
if cred is None: if cred is None:
return -60 return -60
token: Union[str, None] = await ArknightsUser.get_user_attr_by_uid( token: str | None = await ArknightsUser.get_user_attr_by_uid(
uid=uid, uid=uid,
attr="token", attr="token",
) )
@ -206,14 +204,14 @@ class BaseArkApi:
async def get_sign_info( async def get_sign_info(
self, self,
uid: str, uid: str,
) -> Union[int, ArknightsAttendanceCalendarModel]: ) -> int | ArknightsAttendanceCalendarModel:
cred: Union[str, None] = await ArknightsUser.get_user_attr_by_uid( cred: str | None = await ArknightsUser.get_user_attr_by_uid(
uid=uid, uid=uid,
attr="cred", attr="cred",
) )
if cred is None: if cred is None:
return -60 return -60
token: Union[str, None] = await ArknightsUser.get_user_attr_by_uid( token: str | None = await ArknightsUser.get_user_attr_by_uid(
uid=uid, uid=uid,
attr="token", attr="token",
) )
@ -242,10 +240,10 @@ class BaseArkApi:
async def check_cred_valid( async def check_cred_valid(
self, self,
cred: Union[str, None] = None, cred: str | None = None,
token: Union[str, None] = None, token: str | None = None,
uid: Union[str, None] = None, uid: str | None = None,
) -> Union[bool, ArknightsUserMeModel]: ) -> bool | ArknightsUserMeModel:
if uid is not None: if uid is not None:
cred = ( cred = (
cred cred
@ -282,14 +280,14 @@ class BaseArkApi:
unpack_data = self.unpack(raw_data) unpack_data = self.unpack(raw_data)
return msgspec.convert(unpack_data, type=ArknightsUserMeModel) return msgspec.convert(unpack_data, type=ArknightsUserMeModel)
def unpack(self, raw_data: Dict) -> Dict: def unpack(self, raw_data: dict) -> dict:
try: try:
data = raw_data["data"] data = raw_data["data"]
return data return data
except KeyError: except KeyError:
return raw_data return raw_data
async def refresh_token(self, cred: str, uid: Union[str, None] = None) -> str: async def refresh_token(self, cred: str, uid: str | None = None) -> str:
header = deepcopy(_HEADER) header = deepcopy(_HEADER)
header["cred"] = cred header["cred"] = cred
header["sign_enable"] = "false" header["sign_enable"] = "false"
@ -312,11 +310,11 @@ class BaseArkApi:
self, self,
url: str, url: str,
method: Literal["GET", "POST"] = "GET", method: Literal["GET", "POST"] = "GET",
header: Dict[str, Any] = _HEADER, header: dict[str, Any] = _HEADER,
params: Union[Dict[str, Any], None] = None, params: dict[str, Any] | None = None,
data: Union[Dict[str, Any], None] = None, data: dict[str, Any] | None = None,
use_proxy: Union[bool, None] = False, use_proxy: bool | None = False,
) -> Union[Dict, Union[int, None]]: ) -> dict | int | None:
logger.debug(f"ark_request {url} {method} {header} {params} {data} {use_proxy}") logger.debug(f"ark_request {url} {method} {header} {params} {data} {use_proxy}")
try: try:
raw_data = await self._ark_request( raw_data = await self._ark_request(
@ -347,11 +345,11 @@ class BaseArkApi:
self, self,
url: str, url: str,
method: Literal["GET", "POST"] = "GET", method: Literal["GET", "POST"] = "GET",
header: Dict[str, Any] = _HEADER, header: dict[str, Any] = _HEADER,
params: Union[Dict[str, Any], None] = None, params: dict[str, Any] | None = None,
data: Union[Dict[str, Any], None] = None, data: dict[str, Any] | None = None,
use_proxy: Union[bool, None] = False, use_proxy: bool | None = False,
) -> Union[Dict, Union[int, None]]: ) -> dict | int | None:
async with ClientSession( async with ClientSession(
connector=TCPConnector(verify_ssl=ssl_verify), connector=TCPConnector(verify_ssl=ssl_verify),
) as client: ) as client:

View File

@ -1,4 +1,5 @@
from typing import Dict, Literal, Optional, Sequence, Type, TypeVar, Union from collections.abc import Sequence
from typing import Literal, TypeVar
from gsuid_core.utils.database.base_models import ( from gsuid_core.utils.database.base_models import (
BaseModel, BaseModel,
@ -17,14 +18,14 @@ T_ARK_User = TypeVar("T_ARK_User", bound="ArknightsUser")
class ArknightsBind(Bind, table=True): class ArknightsBind(Bind, table=True):
uid: Union[str, None] = Field(default=None, title="明日方舟UID") uid: str | None = Field(default=None, title="明日方舟UID")
class ArknightsUser(User, table=True): class ArknightsUser(User, table=True):
uid: Union[str, None] = Field(default=None, title="明日方舟UID") uid: str | None = Field(default=None, title="明日方舟UID")
skd_uid: Union[str, None] = Field(default=None, title="SKD用户ID") skd_uid: str | None = Field(default=None, title="SKD用户ID")
cred: Union[str, None] = Field(default=None, title="SKD凭证") cred: str | None = Field(default=None, title="SKD凭证")
token: Union[str, None] = Field(default=None, title="SKD Token") token: str | None = Field(default=None, title="SKD Token")
@classmethod @classmethod
@with_session @with_session
@ -32,7 +33,7 @@ class ArknightsUser(User, table=True):
cls, cls,
session: AsyncSession, session: AsyncSession,
cred: str, cred: str,
) -> Union[BaseModel, None]: ) -> BaseModel | None:
sql = select(cls).where(cls.cred == cred) sql = select(cls).where(cls.cred == cred)
result = await session.execute(sql) result = await session.execute(sql)
data = result.scalars().all() data = result.scalars().all()
@ -40,19 +41,19 @@ class ArknightsUser(User, table=True):
@classmethod @classmethod
@with_session @with_session
async def get_all_user(cls: Type[T_ARK_User], session: AsyncSession) -> Sequence[T_ARK_User]: async def get_all_user(cls: type[T_ARK_User], session: AsyncSession) -> Sequence[T_ARK_User]:
sql = select(cls).where(cls.cred is not None, cls.cred != "") sql = select(cls).where(cls.cred is not None, cls.cred != "")
result = await session.execute(sql) result = await session.execute(sql)
data: Sequence[T_ARK_User] = result.scalars().all() data: Sequence[T_ARK_User] = result.scalars().all()
return data return data
@classmethod @classmethod
async def get_token_by_cred(cls, cred: str) -> Union[str, None]: async def get_token_by_cred(cls, cred: str) -> str | None:
result = await cls.select_data_by_cred(cred) result = await cls.select_data_by_cred(cred)
return getattr(result, "token") if result else None return getattr(result, "token") if result else None
@classmethod @classmethod
async def get_uid_by_cred(cls, cred: str) -> Union[str, None]: async def get_uid_by_cred(cls, cred: str) -> str | None:
result = await cls.select_data_by_cred(cred) result = await cls.select_data_by_cred(cred)
return getattr(result, "uid") if result else None return getattr(result, "uid") if result else None
@ -74,21 +75,21 @@ class ArknightsUser(User, table=True):
return not bool(retcode) return not bool(retcode)
@classmethod @classmethod
async def update_user_data(cls, uid: str, data: Dict = {}): async def update_user_data(cls, uid: str, data: dict = {}):
return await cls.update_data_by_uid(uid, cls.bot_id, None, **data) return await cls.update_data_by_uid(uid, cls.bot_id, None, **data)
class ArknightsPush(Push, table=True): class ArknightsPush(Push, table=True):
uid: Union[str, None] = Field(default=None, title="明日方舟UID") uid: str | None = Field(default=None, title="明日方舟UID")
skd_uid: Union[str, None] = Field(default=None, title="森空岛用户ID") skd_uid: str | None = Field(default=None, title="森空岛用户ID")
ap_push: Union[bool, None] = Field(default=False, title="理智推送") ap_push: bool | None = Field(default=False, title="理智推送")
ap_value: Union[int, None] = Field(default=110, title="理智推送阈值") ap_value: int | None = Field(default=110, title="理智推送阈值")
ap_is_push: Union[bool, None] = Field(default=False, title="理智是否已经推送") ap_is_push: bool | None = Field(default=False, title="理智是否已经推送")
training_push: Union[bool, None] = Field(default=False, title="训练室推送") training_push: bool | None = Field(default=False, title="训练室推送")
training_value: Union[int, None] = Field(default=30, title="训练室推送阈值") training_value: int | None = Field(default=30, title="训练室推送阈值")
training_is_push: Union[bool, None] = Field(default=False, title="训练室是否已经推送") training_is_push: bool | None = Field(default=False, title="训练室是否已经推送")
version_push: Union[bool, None] = Field(default=False, title="版本更新推送") version_push: bool | None = Field(default=False, title="版本更新推送")
version_is_push: Union[bool, None] = Field(default=False, title="版本更新是否已经推送") version_is_push: bool | None = Field(default=False, title="版本更新是否已经推送")
@classmethod @classmethod
async def insert_push_data(cls, bot_id: str, uid: str, skd_uid: str): async def insert_push_data(cls, bot_id: str, uid: str, skd_uid: str):
@ -106,9 +107,7 @@ class ArknightsPush(Push, table=True):
@classmethod @classmethod
@with_session @with_session
async def base_select_data( async def base_select_data(cls: type[T_BaseIDModel], session: AsyncSession, **data) -> T_BaseIDModel | None:
cls: Type[T_BaseIDModel], session: AsyncSession, **data
) -> Optional[T_BaseIDModel]:
stmt = select(cls) stmt = select(cls)
for k, v in data.items(): for k, v in data.items():
stmt = stmt.where(getattr(cls, k) == v) stmt = stmt.where(getattr(cls, k) == v)
@ -117,7 +116,7 @@ class ArknightsPush(Push, table=True):
return data[0] if data else None return data[0] if data else None
@classmethod @classmethod
async def update_push_data(cls, uid: str, data: Dict) -> bool: async def update_push_data(cls, uid: str, data: dict) -> bool:
retcode = -1 retcode = -1
if await cls.data_exist(uid=uid): if await cls.data_exist(uid=uid):
retcode = await cls.update_data_by_uid( retcode = await cls.update_data_by_uid(
@ -138,7 +137,7 @@ class ArknightsPush(Push, table=True):
await cls.update_push_data(uid, {f"{mode}_is_push": status}) await cls.update_push_data(uid, {f"{mode}_is_push": status})
@classmethod @classmethod
async def select_push_data(cls: Type[T_BaseIDModel], uid: str) -> Union[T_BaseIDModel, None]: async def select_push_data(cls: type[T_BaseIDModel], uid: str) -> T_BaseIDModel | None:
return await cls.base_select_data(uid=uid) return await cls.base_select_data(uid=uid)
@classmethod @classmethod

View File

@ -1,9 +1,7 @@
from typing import Union
UID_HINT = "添加失败, 请先绑定明日方舟UID" UID_HINT = "添加失败, 请先绑定明日方舟UID"
def get_error(retcode: Union[int, str]) -> str: def get_error(retcode: int | str) -> str:
if retcode == 10000: if retcode == 10000:
return "请求异常, 请检查具体实现代码..." return "请求异常, 请检查具体实现代码..."
if retcode == 10001: if retcode == 10001:

View File

@ -1,11 +1,10 @@
import json import json
from pathlib import Path from pathlib import Path
from typing import Dict
from loguru import logger from loguru import logger
def read_json(file_path: Path, **kwargs) -> Dict: def read_json(file_path: Path, **kwargs) -> dict:
""" """
Read a JSON file and return its contents as a dictionary. Read a JSON file and return its contents as a dictionary.
""" """
@ -17,7 +16,7 @@ def read_json(file_path: Path, **kwargs) -> Dict:
return {} return {}
def write_json(data: Dict, file_path: Path) -> None: def write_json(data: dict, file_path: Path) -> None:
""" """
Write a dictionary to a JSON file. Write a dictionary to a JSON file.
""" """

View File

@ -1,5 +1,4 @@
from pathlib import Path from pathlib import Path
from typing import Union
from gsuid_core.utils.image.image_tools import CustomizeImage from gsuid_core.utils.image.image_tools import CustomizeImage
from PIL import Image from PIL import Image
@ -9,8 +8,6 @@ NM_BG_PATH = BG_PATH / "nm_bg"
SP_BG_PATH = BG_PATH / "sp_bg" SP_BG_PATH = BG_PATH / "sp_bg"
async def get_simple_bg( async def get_simple_bg(based_w: int, based_h: int, image: str | None | Image.Image = None) -> Image.Image:
based_w: int, based_h: int, image: Union[str, Union[None, Image.Image]] = None
) -> Image.Image:
CIL = CustomizeImage(NM_BG_PATH) CIL = CustomizeImage(NM_BG_PATH)
return CIL.get_image(image, based_w, based_h) return CIL.get_image(image, based_w, based_h)

View File

@ -1,9 +1,9 @@
from typing import Any, Dict, Union from typing import Any
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
async def send_diff_msg(bot: Bot, code: Any, data: Union[Dict, None] = None): async def send_diff_msg(bot: Bot, code: Any, data: dict | None = None):
if data is None: if data is None:
data = { data = {
0: "绑定UID成功!", 0: "绑定UID成功!",

View File

@ -1,69 +0,0 @@
from collections.abc import Callable, Iterable, Iterator
from copy import copy, deepcopy
from typing import Any, Dict, Tuple, Type, TypeVar, Union
from msgspec import Struct, UnsetType, convert, field
from msgspec import json as mscjson
from typing_extensions import dataclass_transform
Model = TypeVar("Model", bound="BaseStruct")
T = TypeVar("T")
def transUnset(v: Union[T, UnsetType], d: Any = None) -> Union[T, Any]:
return v if not isinstance(v, UnsetType) else d
@dataclass_transform(field_specifiers=(field,))
class BaseStruct(
Struct,
forbid_unknown_fields=True,
omit_defaults=True,
gc=False,
):
class Config:
encoder = mscjson.Encoder()
@classmethod
def convert(
cls: Type[Model],
obj: Any,
*,
strict: bool = True,
from_attributes: bool = False,
dec_hook: Union[Callable[[type, Any], Any], None] = None,
builtin_types: Union[Iterable[type], None] = None,
str_keys: bool = False,
) -> Model:
return convert(
obj=obj,
type=cls,
strict=strict,
from_attributes=from_attributes,
dec_hook=dec_hook,
builtin_types=builtin_types,
str_keys=str_keys,
)
def __iter__(self) -> Iterator[Tuple[str, Any]]:
for field_name in self.__struct_fields__:
yield field_name, getattr(self, field_name)
def __getattribute__(self, __name: str) -> Union[Any, None]:
value = super().__getattribute__(__name)
if isinstance(value, UnsetType):
return None
return value
def keys(self) -> Iterator[str]:
yield from self.__struct_fields__
def values(self) -> Iterator[Any]:
for field_name in self.__struct_fields__:
yield getattr(self, field_name)
def model_dump(self) -> Dict[str, Any]:
return mscjson.decode(mscjson.encode(self))
def model_copy(self: Model, *, deep: bool = False) -> Model:
return deepcopy(self) if deep else copy(self)

File diff suppressed because it is too large Load Diff

View File

@ -1,105 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class BGMBank(BaseStruct):
name: str
intro: Union[str, None]
loop: Union[str, None]
volume: float
crossfade: float
delay: float
fadeStyleId: Union[str, None] = None
class SoundFXBankSoundFX(BaseStruct):
asset: str
weight: float
important: bool
is2D: bool
delay: float
minPitch: float
maxPitch: float
minVolume: float
maxVolume: float
ignoreTimeScale: bool
class SoundFXBank(BaseStruct):
name: str
sounds: Union[List[SoundFXBankSoundFX], None]
maxSoundAllowed: int
popOldest: bool
customMixerGroup: Union[str, None]
loop: bool
class SoundFXCtrlBank(BaseStruct):
name: str
targetBank: str
ctrlStop: bool
ctrlStopFadetime: float
class SnapshotBank(BaseStruct):
name: str
targetSnapshot: str
hookSoundFxBank: str
delay: float
duration: float
targetFxBank: Union[str, None] = None
class BattleVoiceOption(BaseStruct):
voiceType: int
priority: int
overlapIfSamePriority: bool
cooldown: float
delay: float
class MusicData(BaseStruct):
id_: str = field(name="id")
name: str
bank: str
class BattleVoiceData(BaseStruct):
crossfade: float
minTimeDeltaForEnemyEncounter: float
minSpCostForImportantPassiveSkill: int
voiceTypeOptions: List[BattleVoiceOption]
class AudioDataDucking(BaseStruct):
bank: str
volume: float
fadeTime: float
delay: float
fadeStyleId: Union[str, None] = None
class AudioDataFadeStyle(BaseStruct):
styleName: str
fadeinTime: float
fadeoutTime: float
fadeinType: str
fadeoutType: str
class AudioData(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
bgmBanks: List[BGMBank]
soundFXBanks: List[SoundFXBank]
soundFXCtrlBanks: List[SoundFXCtrlBank]
snapshotBanks: List[SnapshotBank]
battleVoice: BattleVoiceData
musics: List[MusicData]
soundFxVoiceLang: Dict[str, Dict[str, Dict[str, str]]]
bankAlias: Dict[str, str]
duckings: List[AudioDataDucking]
fadeStyles: List[AudioDataFadeStyle]

View File

@ -1,83 +0,0 @@
from typing import Dict, List, Union
from ..common import BaseStruct
class CharacterDataUnlockCondition(BaseStruct):
phase: int
level: int
class Blackboard(BaseStruct):
key: str
value: Union[float, None] = None
valueStr: Union[str, None] = None
class TalentData(BaseStruct):
unlockCondition: CharacterDataUnlockCondition
requiredPotentialRank: int
prefabKey: Union[str, None]
name: Union[str, None]
description: Union[str, None]
rangeId: Union[str, None]
blackboard: List[Blackboard]
class EquipTalentData(TalentData):
displayRangeId: bool
upgradeDescription: str
talentIndex: int
tokenKey: Union[str, None] = None
class CharacterDataEquipTalentDataBundle(BaseStruct):
candidates: Union[List[EquipTalentData], None]
class CharacterDataTraitData(BaseStruct):
unlockCondition: CharacterDataUnlockCondition
requiredPotentialRank: int
blackboard: List[Blackboard]
overrideDescripton: Union[str, None]
prefabKey: Union[str, None]
rangeId: Union[str, None]
class CharacterDataEquipTraitData(BaseStruct):
additionalDescription: Union[str, None]
unlockCondition: CharacterDataUnlockCondition
requiredPotentialRank: int
blackboard: List[Blackboard]
overrideDescripton: Union[str, None]
prefabKey: Union[str, None]
rangeId: Union[str, None]
class CharacterDataEquipTraitDataBundle(BaseStruct):
candidates: Union[List[CharacterDataEquipTraitData], None]
class BattleUniEquipData(BaseStruct):
resKey: Union[str, None]
target: str
isToken: bool
addOrOverrideTalentDataBundle: CharacterDataEquipTalentDataBundle
overrideTraitDataBundle: CharacterDataEquipTraitDataBundle
class BattleEquipPerLevelPack(BaseStruct):
equipLevel: int
parts: List[BattleUniEquipData]
attributeBlackboard: List[Blackboard]
tokenAttributeBlackboard: Dict[str, List[Blackboard]]
class BattleEquipData(BaseStruct):
phases: List[BattleEquipPerLevelPack]
class BattleEquipTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
equips: Dict[str, BattleEquipData]

View File

@ -1,487 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class BuildingDataRoomUnlockCondCondItem(BaseStruct):
type_: str = field(name="type")
level: int
count: int
class BuildingDataRoomUnlockCond(BaseStruct):
id_: str = field(name="id")
number: Dict[str, BuildingDataRoomUnlockCondCondItem]
class GridPosition(BaseStruct):
row: int
col: int
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class BuildingDataRoomDataBuildCost(BaseStruct):
items: List[ItemBundle]
time: int
labor: int
class BuildingDataRoomDataPhaseData(BaseStruct):
overrideName: Union[str, None]
overridePrefabId: Union[str, None]
unlockCondId: str
buildCost: BuildingDataRoomDataBuildCost
electricity: int
maxStationedNum: int
manpowerCost: int
class BuildingDataRoomData(BaseStruct):
id_: str = field(name="id")
name: str
description: Union[str, None]
defaultPrefabId: str
canLevelDown: bool
maxCount: int
category: str
size: GridPosition
phases: List[BuildingDataRoomDataPhaseData]
class BuildingDataLayoutDataRoomSlot(BaseStruct):
id_: str = field(name="id")
cleanCostId: str
costLabor: int
provideLabor: int
size: GridPosition
offset: GridPosition
category: str
storeyId: str
class BuildingDataLayoutDataSlotCleanCostCountCost(BaseStruct):
items: List[ItemBundle]
class BuildingDataLayoutDataSlotCleanCost(BaseStruct):
id_: str = field(name="id")
number: Dict[str, BuildingDataLayoutDataSlotCleanCostCountCost]
class BuildingDataLayoutDataStoreyData(BaseStruct):
id_: str = field(name="id")
yOffset: int
unlockControlLevel: int
type_: str = field(name="type")
class BuildingDataLayoutData(BaseStruct):
id_: str = field(name="id")
slots: Dict[str, BuildingDataLayoutDataRoomSlot]
cleanCosts: Dict[str, BuildingDataLayoutDataSlotCleanCost]
storeys: Dict[str, BuildingDataLayoutDataStoreyData]
class BuildingDataPrefabInfo(BaseStruct):
id_: str = field(name="id")
blueprintRoomOverrideId: Union[str, None]
size: GridPosition
floorGridSize: GridPosition
backWallGridSize: GridPosition
obstacleId: Union[str, None]
class BuildingDataManufactPhase(BaseStruct, tag="BuildingDataManufactPhase"):
speed: Union[float, int]
outputCapacity: int
class BuildingDataShopPhase(BaseStruct, tag="BuildingDataShopPhase"):
counterNum: int
speed: Union[float, int]
moneyCapacity: int
class BuildingDataHirePhase(BaseStruct, tag="BuildingDataHirePhase"):
economizeRate: float
resSpeed: int
refreshTimes: int
class BuildingDataDormPhase(BaseStruct, tag="BuildingDataDormPhase"):
manpowerRecover: int
decorationLimit: int
class BuildingDataMeetingPhase(BaseStruct, tag="BuildingDataMeetingPhase"):
friendSlotInc: int
maxVisitorNum: int
gatheringSpeed: int
class BuildingDataTradingPhase(BaseStruct, tag="BuildingDataTradingPhase"):
orderSpeed: Union[float, int]
orderLimit: int
orderRarity: int
class BuildingDataWorkshopPhase(BaseStruct, tag="BuildingDataWorkshopPhase"):
manpowerFactor: Union[float, int]
class BuildingDataTrainingPhase(BaseStruct, tag="BuildingDataTrainingPhase"):
specSkillLvlLimit: int
class BuildingDataShopRoomBean(BaseStruct):
phases: None = None
# phases: Union[List[Union[Union[Union[Union[Union[Union[Union[BuildingDataManufactPhase, BuildingDataShopPhase], BuildingDataHirePhase], BuildingDataDormPhase], BuildingDataMeetingPhase], BuildingDataTradingPhase], BuildingDataWorkshopPhase], BuildingDataTrainingPhase]], None] # noqa: E501
class BuildingDataControlRoomBean(BaseStruct):
basicCostBuff: int
phases: None = None
class BuildingDataManufactRoomBean(BaseStruct):
basicSpeedBuff: float
phases: List[BuildingDataManufactPhase]
class BuildingDataHireRoomBean(BaseStruct):
basicSpeedBuff: float
phases: List[BuildingDataHirePhase]
class BuildingDataDormRoomBean(BaseStruct):
phases: List[BuildingDataDormPhase]
class BuildingDataMeetingRoomBean(BaseStruct):
basicSpeedBuff: float
phases: List[BuildingDataMeetingPhase]
class BuildingDataTradingRoomBean(BaseStruct):
basicSpeedBuff: float
phases: List[BuildingDataTradingPhase]
class BuildingDataWorkShopRoomBean(BaseStruct):
phases: List[BuildingDataWorkshopPhase]
class BuildingDataTrainingBean(BaseStruct):
basicSpeedBuff: float
phases: List[BuildingDataTrainingPhase]
class BuildingDataPowerRoomBean(BaseStruct):
basicSpeedBuff: float
phases: None = None
class CharacterDataUnlockCondition(BaseStruct):
phase: int
level: int
class BuildingDataBuildingBuffCharSlotSlotItem(BaseStruct):
buffId: str
cond: CharacterDataUnlockCondition
class BuildingDataBuildingBuffCharSlot(BaseStruct):
buffData: List[BuildingDataBuildingBuffCharSlotSlotItem]
class BuildingDataBuildingCharacter(BaseStruct):
charId: str
maxManpower: int
buffChar: List[BuildingDataBuildingBuffCharSlot]
class BuildingDataBuildingBuff(BaseStruct):
buffId: str
buffName: str
buffIcon: str
skillIcon: str
sortId: int
buffColor: str
textColor: str
buffCategory: str
roomType: str
description: str
class BuildingDataCustomDataFurnitureData(BaseStruct):
id_: str = field(name="id")
sortId: int
name: str
iconId: str
type_: str = field(name="type")
subType: str
location: str
category: str
validOnRotate: bool
enableRotate: bool
rarity: int
themeId: str
groupId: str
width: int
depth: int
height: int
comfort: int
usage: str
description: str
obtainApproach: str
processedProductId: str
processedProductCount: int
processedByProductPercentage: int
processedByProductGroup: List
canBeDestroy: bool
isOnly: int
quantity: int
musicId: str
interactType: Union[str, None] = None
class BuildingDataCustomDataThemeQuickSetupItem(BaseStruct):
furnitureId: str
pos0: int
pos1: int
dir_: int = field(name="dir")
class BuildingDataCustomDataThemeData(BaseStruct):
id_: str = field(name="id")
sortId: int
name: str
themeType: str
desc: str
quickSetup: List[BuildingDataCustomDataThemeQuickSetupItem]
groups: List[str]
furnitures: List[str]
class BuildingDataCustomDataGroupData(BaseStruct):
id_: str = field(name="id")
sortId: int
name: str
themeId: str
comfort: int
count: int
furniture: List[str]
class BuildingDataCustomDataFurnitureTypeData(BaseStruct):
type_: str = field(name="type")
name: str
class BuildingDataCustomDataFurnitureSubTypeData(BaseStruct):
subType: str
name: str
type_: str = field(name="type")
sortId: int
class BuildingDataCustomDataDormitoryDefaultFurnitureItem(BaseStruct):
furnitureId: str
xOffset: int
yOffset: int
defaultPrefabId: str
class BuildingDataCustomDataInteractItem(BaseStruct):
skinId: str
class BuildingDataCustomDataDiyUISortTemplateListDataDiyUISortTemplateData(
BaseStruct,
):
name: str
sequences: List[str]
stableSequence: str
stableSequenceOrder: str
class BuildingDataCustomDataDiyUISortTemplateListData(BaseStruct):
diyUIType: str
expandState: str
defaultTemplateIndex: int
defaultTemplateOrder: str
templates: List[BuildingDataCustomDataDiyUISortTemplateListDataDiyUISortTemplateData]
class BuildingDataCustomData(BaseStruct):
furnitures: Dict[str, BuildingDataCustomDataFurnitureData]
themes: Dict[str, BuildingDataCustomDataThemeData]
groups: Dict[str, BuildingDataCustomDataGroupData]
types: Dict[str, BuildingDataCustomDataFurnitureTypeData]
subTypes: Dict[str, BuildingDataCustomDataFurnitureSubTypeData]
defaultFurnitures: Dict[
str,
List[BuildingDataCustomDataDormitoryDefaultFurnitureItem],
]
interactGroups: Dict[str, List[BuildingDataCustomDataInteractItem]]
diyUISortTemplates: Dict[
str,
Dict[str, BuildingDataCustomDataDiyUISortTemplateListData],
]
class BuildingDataManufactFormulaUnlockRoom(BaseStruct):
roomId: str
roomLevel: int
roomCount: int
class BuildingDataManufactFormulaUnlockStage(BaseStruct):
stageId: str
rank: int
class BuildingDataManufactFormula(BaseStruct):
formulaId: str
itemId: str
count: int
weight: int
costPoint: int
formulaType: str
buffType: str
costs: List[ItemBundle]
requireRooms: List[BuildingDataManufactFormulaUnlockRoom]
requireStages: List[BuildingDataManufactFormulaUnlockStage]
class BuildingDataShopFormulaUnlockRoom(BaseStruct):
roomId: str
roomLevel: int
class BuildingDataShopFormula(BaseStruct):
formulaId: str
itemId: str
formulaType: str
costPoint: int
gainItem: ItemBundle
requireRooms: List[BuildingDataShopFormulaUnlockRoom]
class BuildingDataWorkshopExtraWeightItem(BaseStruct):
weight: int
itemId: str
itemCount: int
class BuildingDataWorkshopFormulaUnlockRoom(BaseStruct):
roomId: str
roomLevel: int
roomCount: int
class BuildingDataWorkshopFormulaUnlockStage(BaseStruct):
stageId: str
rank: int
class BuildingDataWorkshopFormula(BaseStruct):
sortId: int
formulaId: str
rarity: int
itemId: str
count: int
goldCost: int
apCost: int
formulaType: str
buffType: str
extraOutcomeRate: float
extraOutcomeGroup: List[BuildingDataWorkshopExtraWeightItem]
costs: List[ItemBundle]
requireRooms: List[BuildingDataWorkshopFormulaUnlockRoom]
requireStages: List[BuildingDataWorkshopFormulaUnlockStage]
class BuildingDataCreditFormulaValueModel(BaseStruct):
basic: int
addition: int
class BuildingDataCreditFormula(BaseStruct):
initiative: Dict
passive: Dict
class BuildingData(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
controlSlotId: str
meetingSlotId: str
initMaxLabor: int
laborRecoverTime: int
manufactInputCapacity: int
shopCounterCapacity: int
comfortLimit: int
creditInitiativeLimit: int
creditPassiveLimit: int
creditComfortFactor: int
creditGuaranteed: int
creditCeiling: int
manufactUnlockTips: str
shopUnlockTips: str
manufactStationBuff: float
comfortManpowerRecoverFactor: int
manpowerDisplayFactor: int
shopOutputRatio: Union[Dict[str, int], None]
shopStackRatio: Union[Dict[str, int], None]
basicFavorPerDay: int
humanResourceLimit: int
tiredApThreshold: int
processedCountRatio: int
trainingBonusMax: int
tradingStrategyUnlockLevel: int
tradingReduceTimeUnit: int
tradingLaborCostUnit: int
manufactReduceTimeUnit: int
manufactLaborCostUnit: int
laborAssistUnlockLevel: int
apToLaborUnlockLevel: int
apToLaborRatio: int
socialResourceLimit: int
socialSlotNum: int
furniDuplicationLimit: int
assistFavorReport: int
manufactManpowerCostByNum: List[int]
tradingManpowerCostByNum: List[int]
roomUnlockConds: Dict[str, BuildingDataRoomUnlockCond]
rooms: Dict[str, BuildingDataRoomData]
layouts: Dict[str, BuildingDataLayoutData]
prefabs: Dict[str, BuildingDataPrefabInfo]
controlData: BuildingDataControlRoomBean
manufactData: BuildingDataManufactRoomBean
shopData: BuildingDataShopRoomBean
hireData: BuildingDataHireRoomBean
dormData: BuildingDataDormRoomBean
meetingData: BuildingDataMeetingRoomBean
tradingData: BuildingDataTradingRoomBean
workshopData: BuildingDataWorkShopRoomBean
trainingData: BuildingDataTrainingBean
powerData: BuildingDataPowerRoomBean
chars: Dict[str, BuildingDataBuildingCharacter]
buffs: Dict[str, BuildingDataBuildingBuff]
workshopBonus: Dict[str, List[str]]
customData: BuildingDataCustomData
manufactFormulas: Dict[str, BuildingDataManufactFormula]
shopFormulas: Dict[str, BuildingDataShopFormula]
workshopFormulas: Dict[str, BuildingDataWorkshopFormula]
creditFormula: BuildingDataCreditFormula
goldItems: Dict[str, int]
assistantUnlock: List[int]

View File

@ -1,159 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class CampaignDataBreakRewardLadder(BaseStruct):
killCnt: int
breakFeeAdd: int
rewards: List[ItemBundle]
class WeightItemBundle(BaseStruct):
id_: str = field(name="id")
type_: str = field(name="type")
dropType: str
count: int
weight: int
class StageDataDisplayRewards_(BaseStruct):
type_: str = field(name="type")
id_: str = field(name="id")
dropType: int
class StageDataDisplayDetailRewards_(StageDataDisplayRewards_):
occPercent: int
GetPercent: float
CannotGetPercent: float
class CampaignDataCampaignDropInfo(BaseStruct):
firstPassRewards: Union[List[ItemBundle], None]
passRewards: Union[List[List[WeightItemBundle]], None]
displayDetailRewards: Union[List[StageDataDisplayDetailRewards_], None]
class CampaignDataDropLadder(BaseStruct):
killCnt: int
dropInfo: CampaignDataCampaignDropInfo
class CampaignDataGainLadder(BaseStruct):
killCnt: int
apFailReturn: int
favor: int
expGain: int
goldGain: int
displayDiamondShdNum: int
class StageDataDisplayRewards(BaseStruct):
type_: str = field(name="type")
id_: str = field(name="id")
dropType: int
class StageDataDisplayDetailRewards(BaseStruct):
occPercent: int
type_: str = field(name="type")
id_: str = field(name="id")
dropType: int
class CampaignDataDropGainInfo(BaseStruct):
dropLadders: List[CampaignDataDropLadder]
gainLadders: List[CampaignDataGainLadder]
displayRewards: List[StageDataDisplayRewards]
displayDetailRewards: List[StageDataDisplayDetailRewards]
class CampaignData(BaseStruct):
stageId: str
isSmallScale: int
breakLadders: List[CampaignDataBreakRewardLadder]
isCustomized: bool
dropGains: Dict[str, CampaignDataDropGainInfo]
class CampaignGroupData(BaseStruct):
groupId: str
activeCamps: List[str]
startTs: int
endTs: int
class CampaignRegionData(BaseStruct):
id_: str = field(name="id")
isUnknwon: int
class CampaignZoneData(BaseStruct):
id_: str = field(name="id")
name: str
regionId: str
templateId: str
class CampaignMissionData(BaseStruct):
id_: str = field(name="id")
sortId: int
param: List[str]
description: str
breakFeeAdd: int
class CampaignConstTable(BaseStruct):
systemPreposedStage: str
rotateStartTime: int
rotatePreposedStage: str
zoneUnlockStage: str
firstRotateRegion: str
sweepStartTime: int
class CampaignRotateOpenTimeData(BaseStruct):
groupId: str
stageId: str
mapId: str
unknownRegions: List[str]
duration: int
startTs: int
endTs: int
class CampaignTrainingOpenTimeData(BaseStruct):
groupId: str
stages: List[str]
startTs: int
endTs: int
class CampaignTrainingAllOpenTimeData(BaseStruct):
groupId: str
startTs: int
endTs: int
class CampaignTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
campaigns: Dict[str, CampaignData]
campaignGroups: Dict[str, CampaignGroupData]
campaignRegions: Dict[str, CampaignRegionData]
campaignZones: Dict[str, CampaignZoneData]
campaignMissions: Dict[str, CampaignMissionData]
stageIndexInZoneMap: Dict[str, int]
campaignConstTable: CampaignConstTable
campaignRotateStageOpenTimes: List[CampaignRotateOpenTimeData]
campaignTrainingStageOpenTimes: List[CampaignTrainingOpenTimeData]
campaignTrainingAllOpenTimes: List[CampaignTrainingAllOpenTimeData]

View File

@ -1,20 +0,0 @@
from typing import Dict, Union
from ..common import BaseStruct
class ChapterData(BaseStruct):
chapterId: str
chapterName: str
chapterName2: str
chapterIndex: int
preposedChapterId: Union[str, None]
startZoneId: str
endZoneId: str
chapterEndStageId: str
class ChapterTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
chapters: Dict[str, ChapterData]

View File

@ -1,28 +0,0 @@
from typing import Dict, List
from msgspec import field
from ..common import BaseStruct
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class SpCharMissionData(BaseStruct):
charId: str
missionId: str
sortId: int
condType: str
param: List[str]
rewards: List[ItemBundle]
class CharMetaTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
spCharGroups: Dict[str, List[str]]
spCharMissions: Dict[str, Dict[str, SpCharMissionData]]
spCharVoucherSkinTime: Dict[str, int]

View File

@ -1,200 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class CharPatchDataPatchInfo(BaseStruct):
tmplIds: List[str]
default: str
class CharacterDataUnlockCondition(BaseStruct):
phase: int
level: int
class Blackboard(BaseStruct):
key: str
value: Union[float, None] = None
valueStr: Union[str, None] = None
class CharacterDataTraitData(BaseStruct):
unlockCondition: CharacterDataUnlockCondition
requiredPotentialRank: int
blackboard: List[Blackboard]
overrideDescripton: Union[str, None]
prefabKey: Union[str, None]
rangeId: Union[str, None]
class CharacterDataTraitDataBundle(BaseStruct):
candidates: List[CharacterDataTraitData]
class AttributesData(BaseStruct):
maxHp: int
atk: int
def_: int = field(name="def")
magicResistance: float
cost: int
blockCnt: int
moveSpeed: float
attackSpeed: float
baseAttackTime: float
respawnTime: int
hpRecoveryPerSec: float
spRecoveryPerSec: float
maxDeployCount: int
maxDeckStackCnt: int
tauntLevel: int
massLevel: int
baseForceLevel: int
stunImmune: bool
silenceImmune: bool
sleepImmune: bool
frozenImmune: bool
levitateImmune: bool
disarmedCombatImmune: bool
class CharacterDataAttributesKeyFrame(BaseStruct):
level: int
data: AttributesData
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class CharacterDataPhaseData(BaseStruct):
characterPrefabKey: str
rangeId: Union[str, None]
maxLevel: int
attributesKeyFrames: List[CharacterDataAttributesKeyFrame]
evolveCost: Union[List[ItemBundle], None]
class CharacterDataMainSkillSpecializeLevelData(BaseStruct):
unlockCond: CharacterDataUnlockCondition
lvlUpTime: int
levelUpCost: Union[List[ItemBundle], None]
class CharacterDataMainSkill(BaseStruct):
skillId: Union[str, None]
overridePrefabKey: Union[str, None]
overrideTokenKey: Union[str, None]
levelUpCostCond: List[CharacterDataMainSkillSpecializeLevelData]
unlockCond: CharacterDataUnlockCondition
class TalentData(BaseStruct):
unlockCondition: CharacterDataUnlockCondition
requiredPotentialRank: int
prefabKey: str
name: Union[str, None]
description: Union[str, None]
rangeId: Union[str, None]
blackboard: List[Blackboard]
displayRange: bool
class CharacterDataTalentDataBundle(BaseStruct):
candidates: Union[List[TalentData], None]
class AttributeModifierDataAttributeModifier(BaseStruct):
attributeType: int
formulaItem: int
value: float
loadFromBlackboard: bool
fetchBaseValueFromSourceEntity: bool
class AttributeModifierData(BaseStruct):
abnormalFlags: Union[List[str], None]
abnormalImmunes: Union[List[str], None]
abnormalAntis: Union[List[str], None]
abnormalCombos: Union[List[str], None]
abnormalComboImmunes: Union[List[str], None]
attributeModifiers: List[AttributeModifierDataAttributeModifier]
class ExternalBuff(BaseStruct):
attributes: AttributeModifierData
class CharacterDataPotentialRank(BaseStruct):
type_: int = field(name="type")
description: str
buff: Union[ExternalBuff, None]
equivalentCost: Union[ItemBundle, None]
class CharacterDataSkillLevelCost(BaseStruct):
unlockCond: CharacterDataUnlockCondition
lvlUpCost: Union[List[ItemBundle], None]
class CharacterData(BaseStruct):
name: str
description: Union[str, None]
canUseGeneralPotentialItem: bool
canUseActivityPotentialItem: bool
potentialItemId: Union[str, None]
activityPotentialItemId: Union[str, None]
nationId: Union[str, None]
groupId: Union[str, None]
teamId: Union[str, None]
displayNumber: Union[str, None]
appellation: str
position: str
tagList: Union[List[str], None]
itemUsage: Union[str, None]
itemDesc: Union[str, None]
itemObtainApproach: Union[str, None]
isNotObtainable: bool
isSpChar: bool
maxPotentialLevel: int
rarity: int
profession: str
subProfessionId: str
trait: Union[CharacterDataTraitDataBundle, None]
phases: List[CharacterDataPhaseData]
skills: List[CharacterDataMainSkill]
talents: Union[List[CharacterDataTalentDataBundle], None]
potentialRanks: List[CharacterDataPotentialRank]
favorKeyFrames: Union[List[CharacterDataAttributesKeyFrame], None]
allSkillLvlup: List[CharacterDataSkillLevelCost]
minPowerId: str
maxPowerId: str
tokenKey: Union[str, None] = None
class CharPatchDataUnlockCondItem(BaseStruct):
stageId: str
completeState: int
class CharPatchDataUnlockCond(BaseStruct):
conds: List[CharPatchDataUnlockCondItem]
class CharPatchDataPatchDetailInfo(BaseStruct):
patchId: str
sortId: int
infoParam: str
class CharPatchTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
infos: Dict[str, CharPatchDataPatchInfo]
patchChars: Dict[str, CharacterData]
unlockConds: Dict[str, CharPatchDataUnlockCond]
patchDetailInfoList: Dict[str, CharPatchDataPatchDetailInfo]

View File

@ -1,184 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class CharacterDataUnlockCondition(BaseStruct):
phase: int
level: int
class Blackboard(BaseStruct):
key: str
value: Union[float, None] = None
valueStr: Union[str, None] = None
class CharacterDataTraitData(BaseStruct):
unlockCondition: CharacterDataUnlockCondition
requiredPotentialRank: int
blackboard: List[Blackboard]
overrideDescripton: Union[str, None]
prefabKey: Union[str, None]
rangeId: Union[str, None]
additionalDesc: str
class CharacterDataTraitDataBundle(BaseStruct):
candidates: List[CharacterDataTraitData]
class AttributesData(BaseStruct):
maxHp: int
atk: int
def_: int = field(name="def")
magicResistance: float
cost: int
blockCnt: int
moveSpeed: float
attackSpeed: float
baseAttackTime: float
respawnTime: int
hpRecoveryPerSec: float
spRecoveryPerSec: float
maxDeployCount: int
maxDeckStackCnt: int
tauntLevel: int
massLevel: int
baseForceLevel: int
stunImmune: bool
silenceImmune: bool
sleepImmune: bool
frozenImmune: bool
levitateImmune: bool
disarmedCombatImmune: bool
class CharacterDataAttributesKeyFrame(BaseStruct):
level: int
data: AttributesData
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class CharacterDataPhaseData(BaseStruct):
characterPrefabKey: str
rangeId: Union[str, None]
maxLevel: int
attributesKeyFrames: List[CharacterDataAttributesKeyFrame]
evolveCost: Union[List[ItemBundle], None]
class CharacterDataMainSkillSpecializeLevelData(BaseStruct):
unlockCond: CharacterDataUnlockCondition
lvlUpTime: int
levelUpCost: Union[List[ItemBundle], None]
class CharacterDataMainSkill(BaseStruct):
skillId: Union[str, None]
overridePrefabKey: Union[str, None]
overrideTokenKey: Union[str, None]
levelUpCostCond: List[CharacterDataMainSkillSpecializeLevelData]
unlockCond: CharacterDataUnlockCondition
class TalentData(BaseStruct):
unlockCondition: CharacterDataUnlockCondition
requiredPotentialRank: int
prefabKey: str
name: Union[str, None]
description: Union[str, None]
rangeId: Union[str, None]
blackboard: List[Blackboard]
displayRange: bool
tokenKey: Union[str, None] = None
class CharacterDataTalentDataBundle(BaseStruct):
candidates: Union[List[TalentData], None]
class AttributeModifierDataAttributeModifier(BaseStruct):
attributeType: int
formulaItem: int
value: float
loadFromBlackboard: bool
fetchBaseValueFromSourceEntity: bool
class AttributeModifierData(BaseStruct):
abnormalFlags: Union[List[str], None]
abnormalImmunes: Union[List[str], None]
abnormalAntis: Union[List[str], None]
abnormalCombos: Union[List[str], None]
abnormalComboImmunes: Union[List[str], None]
attributeModifiers: List[AttributeModifierDataAttributeModifier]
class ExternalBuff(BaseStruct):
attributes: AttributeModifierData
class CharacterDataPotentialRank(BaseStruct):
type_: int = field(name="type")
description: str
buff: Union[ExternalBuff, None]
equivalentCost: Union[ItemBundle, None]
class CharacterDataSkillLevelCost(BaseStruct):
unlockCond: CharacterDataUnlockCondition
lvlUpCost: Union[List[ItemBundle], None]
class CharacterData(BaseStruct):
name: str
description: Union[str, None]
canUseGeneralPotentialItem: bool
canUseActivityPotentialItem: bool
potentialItemId: Union[str, None]
activityPotentialItemId: Union[str, None]
nationId: Union[str, None]
groupId: Union[str, None]
teamId: Union[str, None]
displayNumber: Union[str, None]
appellation: str
position: str
tagList: Union[List[str], None]
itemUsage: Union[str, None]
itemDesc: Union[str, None]
itemObtainApproach: Union[str, None]
isNotObtainable: bool
isSpChar: bool
maxPotentialLevel: int
rarity: int
profession: str
subProfessionId: str
trait: Union[CharacterDataTraitDataBundle, None]
phases: List[CharacterDataPhaseData]
skills: List[CharacterDataMainSkill]
talents: Union[List[CharacterDataTalentDataBundle], None]
potentialRanks: List[CharacterDataPotentialRank]
favorKeyFrames: Union[List[CharacterDataAttributesKeyFrame], None]
allSkillLvlup: List[CharacterDataSkillLevelCost]
minPowerId: str
maxPowerId: str
displayTokenDict: Union[Dict[str, bool], None] = None
classicPotentialItemId: Union[str, None] = None
tokenKey: Union[str, None] = None
class CharacterTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
chars: Dict[str, CharacterData]
def __getitem__(self, key: str) -> CharacterData:
return self.chars[key]

View File

@ -1,66 +0,0 @@
from typing import List, Union
from msgspec import field
from ..common import BaseStruct
class RuneDataSelector(BaseStruct):
professionMask: Union[int, str]
buildableMask: int
charIdFilter: Union[List[str], None]
enemyIdFilter: Union[List[str], None]
enemyIdExcludeFilter: Union[List[str], None]
enemyLevelTypeFilter: Union[List[str], None]
skillIdFilter: Union[List[str], None]
tileKeyFilter: Union[List[str], None]
groupTagFilter: Union[List[str], None]
filterTagFilter: Union[List[str], None]
filterTagExcludeFilter: Union[List[str], None]
subProfessionExcludeFilter: Union[List[str], None]
mapTagFilter: Union[List[str], None]
class Blackboard(BaseStruct):
key: str
value: Union[float, None] = None
valueStr: Union[str, None] = None
class RuneData(BaseStruct):
key: str
selector: RuneDataSelector
blackboard: List[Blackboard]
class RuneTablePackedRuneData(BaseStruct):
id_: str = field(name="id")
points: float
mutexGroupKey: Union[str, None]
description: str
runes: List[RuneData]
class CharmItemData(BaseStruct):
id_: str = field(name="id")
sort: int
name: str
icon: str
itemUsage: str
itemDesc: str
itemObtainApproach: str
rarity: int
desc: str
price: int
specialObtainApproach: Union[str, None]
charmType: str
obtainInRandom: bool
dropStages: List[str]
runeData: RuneTablePackedRuneData
charmEffect: str
class CharmTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
charmList: List[CharmItemData]

View File

@ -1,70 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class CharWordUnlockParam(BaseStruct):
valueStr: Union[str, None]
valueInt: int
class CharWordData(BaseStruct):
charWordId: str
wordKey: str
charId: str
voiceId: str
voiceText: str
voiceTitle: str
voiceIndex: int
voiceType: str
unlockType: str
unlockParam: List[CharWordUnlockParam]
lockDescription: Union[str, None]
placeType: str
voiceAsset: str
class VoiceLangInfoData(BaseStruct):
wordkey: str
voiceLangType: str
cvName: List[str]
voicePath: Union[str, None] = None
class VoiceLangData(BaseStruct):
wordkeys: List[str]
charId: str
dict_: Dict[str, VoiceLangInfoData] = field(name="dict")
class VoiceLangTypeData(BaseStruct):
name: str
groupType: str
class VoiceLangGroupData(BaseStruct):
name: str
members: List[str]
class NewVoiceTimeData(BaseStruct):
timestamp: int
charSet: List[str]
class CharwordTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
charWords: Dict[str, CharWordData]
voiceLangDict: Dict[str, VoiceLangData]
defaultLangType: str
newTagList: List[str]
voiceLangTypeDict: Dict[str, VoiceLangTypeData]
voiceLangGroupTypeDict: Dict[str, VoiceLangGroupData]
charDefaultTypeDict: Dict[str, str]
startTimeWithTypeDict: Dict[str, List[NewVoiceTimeData]]
displayGroupTypeList: List[str]
displayTypeList: List[str]
playVoiceRange: str

View File

@ -1,43 +0,0 @@
from typing import Dict, List
from msgspec import field
from ..common import BaseStruct
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class MonthlySignInData(BaseStruct):
itemId: str
itemType: str
count: int
class MonthlySignInGroupData(BaseStruct):
groupId: str
title: str
description: str
signStartTime: int
signEndTime: int
items: List[MonthlySignInData]
class MonthlyDailyBonusGroup(BaseStruct):
groupId: str
startTime: int
endTime: int
items: List[ItemBundle]
imgId: str
backId: str
class CheckinTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
groups: Dict[str, MonthlySignInGroupData]
monthlySubItem: Dict[str, List[MonthlyDailyBonusGroup]]
currentMonthlySubId: str

View File

@ -1,258 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class ClimbTowerSingleTowerDataClimbTowerTaskRewardData(BaseStruct):
levelNum: int
rewards: List[ItemBundle]
class ClimbTowerSingleTowerData(BaseStruct):
id_: str = field(name="id")
sortId: int
stageNum: int
name: str
subName: str
desc: str
towerType: str
levels: List[str]
hardLevels: Union[List[str], None]
taskInfo: Union[
List[ClimbTowerSingleTowerDataClimbTowerTaskRewardData],
None,
]
preTowerId: Union[str, None]
medalId: Union[str, None]
hiddenMedalId: Union[str, None]
hardModeMedalId: Union[str, None]
bossId: Union[str, None]
cardId: Union[str, None]
curseCardIds: List[str]
dangerDesc: str
hardModeDesc: Union[str, None]
class WeightItemBundle(BaseStruct):
id_: str = field(name="id")
type_: str = field(name="type")
dropType: str
count: int
weight: int
class StageDataDisplayRewards(BaseStruct):
type_: str = field(name="type")
id_: str = field(name="id")
dropType: int
class StageDataDisplayDetailRewards(BaseStruct):
occPercent: int
type_: str = field(name="type")
id_: str = field(name="id")
dropType: int
class ClimbTowerDropDisplayInfo(BaseStruct):
itemId: str
type_: int = field(name="type")
maxCount: int
minCount: int
class ClimbTowerLevelDropInfo(BaseStruct):
displayRewards: Union[List[StageDataDisplayRewards], None]
displayDetailRewards: Union[List[StageDataDisplayDetailRewards], None]
passRewards: Union[List[List[WeightItemBundle]], None] = None
displayDropInfo: Union[Dict[str, ClimbTowerDropDisplayInfo], None] = None
class ClimbTowerSingleLevelData(BaseStruct):
id_: str = field(name="id")
levelId: str
towerId: str
layerNum: int
code: str
name: str
desc: str
levelType: str
loadingPicId: str
dropInfo: ClimbTowerLevelDropInfo
class ClimbTowerTacticalBuffData(BaseStruct):
id_: str = field(name="id")
desc: str
profession: str
isDefaultActive: bool
sortId: int
buffType: str
class RuneDataSelector(BaseStruct):
professionMask: Union[int, str]
buildableMask: int
charIdFilter: Union[List[str], None]
enemyIdFilter: Union[List[str], None]
enemyIdExcludeFilter: Union[List[str], None]
enemyLevelTypeFilter: Union[List[str], None]
skillIdFilter: Union[List[str], None]
tileKeyFilter: Union[List[str], None]
groupTagFilter: Union[List[str], None]
filterTagFilter: Union[List[str], None]
filterTagExcludeFilter: Union[List[str], None]
subProfessionExcludeFilter: Union[List[str], None]
mapTagFilter: Union[List[str], None]
class Blackboard(BaseStruct):
key: str
value: Union[float, None] = None
valueStr: Union[str, None] = None
class RuneData(BaseStruct):
key: str
selector: RuneDataSelector
blackboard: List[Blackboard]
class RuneTablePackedRuneData(BaseStruct):
id_: str = field(name="id")
points: float
mutexGroupKey: Union[str, None]
description: str
runes: List[RuneData]
class ClimbTowerMainCardData(BaseStruct):
id_: str = field(name="id")
type_: str = field(name="type")
linkedTowerId: Union[str, None]
sortId: int
name: str
desc: str
subCardIds: List[str]
runeData: RuneTablePackedRuneData
trapIds: List[str]
class ClimbTowerSubCardData(BaseStruct):
id_: str = field(name="id")
mainCardId: str
sortId: int
name: str
desc: str
runeData: RuneTablePackedRuneData
trapIds: List[str]
class ClimbTowerCurseCardData(BaseStruct):
id_: str = field(name="id")
towerIdList: List[str]
name: str
desc: str
trapId: str
class ClimbTowerSeasonInfoData(BaseStruct):
id_: str = field(name="id")
name: str
startTs: int
endTs: int
towers: List[str]
seasonCards: List[str]
seasonColor: str
class ClimbTowerDetailConst(BaseStruct):
unlockLevelId: str
unlockModuleNumRequirement: int
lowerItemId: str
lowerItemLimit: int
higherItemId: str
higherItemLimit: int
initCharCount: int
charRecruitTimes: int
charRecruitChoiceCount: int
subcardStageSort: int
assistCharLimit: int
firstClearTaskDesc: str
subCardObtainDesc: str
subGodCardUnlockDesc: str
recruitStageSort: Union[List[int], None] = None
class ClimbTowerRewardInfo(BaseStruct):
stageSort: int
lowerItemCount: int
higherItemCount: int
class MissionDisplayRewards(BaseStruct):
type_: str = field(name="type")
id_: str = field(name="id")
count: int
class MissionData(BaseStruct):
id_: str = field(name="id")
sortId: int
description: str
type_: str = field(name="type")
itemBgType: str
preMissionIds: Union[List[str], None]
template: str
templateType: str
param: List[str]
unlockCondition: Union[str, None]
unlockParam: Union[List[str], None]
missionGroup: str
toPage: Union[str, None]
periodicalPoint: int
rewards: Union[List[MissionDisplayRewards], None]
backImagePath: Union[str, None]
foldId: Union[str, None]
haveSubMissionToUnlock: bool
class ClimbTowerMissionData(MissionData):
bindGodCardId: Union[str, None]
missionBkg: str
class MissionGroup(BaseStruct):
id_: str = field(name="id")
title: Union[str, None]
type_: str = field(name="type")
preMissionGroup: Union[str, None]
period: Union[List[int], None]
rewards: List[MissionDisplayRewards]
missionIds: List[str]
startTs: int
endTs: int
class ClimbTowerTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
towers: Dict[str, ClimbTowerSingleTowerData]
levels: Dict[str, ClimbTowerSingleLevelData]
tacticalBuffs: Dict[str, ClimbTowerTacticalBuffData]
mainCards: Dict[str, ClimbTowerMainCardData]
subCards: Dict[str, ClimbTowerSubCardData]
curseCards: Dict[str, ClimbTowerCurseCardData]
seasonInfos: Dict[str, ClimbTowerSeasonInfoData]
detailConst: ClimbTowerDetailConst
rewardInfoList: List[ClimbTowerRewardInfo]
missionData: Dict[str, ClimbTowerMissionData]
missionGroup: Dict[str, MissionGroup]

View File

@ -1,39 +0,0 @@
from typing import List
from ..common import BaseStruct
class MeetingClueDataClueData(BaseStruct):
clueId: str
clueName: str
clueType: str
number: int
class MeetingClueDataClueTypeData(BaseStruct):
clueType: str
clueNumber: int
class MeetingClueDataReceiveTimeBonus(BaseStruct):
receiveTimes: int
receiveBonus: int
class ClueData(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
clues: List[MeetingClueDataClueData]
clueTypes: List[MeetingClueDataClueTypeData]
receiveTimeBonus: List[MeetingClueDataReceiveTimeBonus]
inventoryLimit: int
outputBasicBonus: int
outputOperatorsBonus: int
cluePointLimit: int
expiredDays: int
transferBonus: int
recycleBonus: int
expiredBonus: int
communicationDuration: int
initiatorBonus: int
participantsBonus: int

View File

@ -1,49 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class StringKeyFrames(BaseStruct):
level: int
data: str
class CrisisClientDataSeasonInfo(BaseStruct):
seasonId: str
startTs: int
endTs: int
name: str
crisisRuneCoinUnlockItem: ItemBundle
permBgm: str
medalGroupId: Union[str, None]
bgmHardPoint: int
permBgmHard: Union[str, None]
class CrisisMapRankInfo(BaseStruct):
rewards: List[ItemBundle]
unlockPoint: int
class CrisisTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
seasonInfo: List[CrisisClientDataSeasonInfo]
meta: str
unlockCoinLv3: int
hardPointPerm: int
hardPointTemp: int
voiceGrade: int
crisisRuneCoinUnlockItemTitle: str
crisisRuneCoinUnlockItemDesc: str
tempAppraise: Union[List[StringKeyFrames], None] = None # Removed in 2.1.21
permAppraise: Union[List[StringKeyFrames], None] = None # Removed in 2.1.21
mapRankInfo: Union[Dict[str, CrisisMapRankInfo], None] = None # Removed in 2.1.21

View File

@ -1,53 +0,0 @@
from enum import Enum
from typing import Dict
from msgspec import field
from ..common import BaseStruct
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class StringKeyFrames(BaseStruct):
level: int
data: str
class CrisisV2ConstData(BaseStruct):
sysStartTime: int
blackScoreThreshold: int
redScoreThreshold: int
detailBkgRedThreshold: int
voiceGrade: int
seasonButtonUnlockInfo: int
shopCoinId: str
hardBgmSwitchScore: int
stageId: str
hideTodoWhenStageFinish: bool
class appraiseType(Enum):
RANK_D = "RANK_D"
RANK_C = "RANK_C"
RANK_B = "RANK_B"
RANK_A = "RANK_A"
RANK_S = "RANK_S"
RANK_SS = "RANK_SS"
RANK_SSS = "RANK_SSS"
class CrisisV2ScoreLevelToAppraiseData(BaseStruct):
appraiseType: appraiseType
class CrisisV2Table(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
seasonInfoDataMap: Dict
scoreLevelToAppraiseDataMap: Dict[str, CrisisV2ScoreLevelToAppraiseData]
constData: CrisisV2ConstData
battleCommentRuneData: Dict

View File

@ -1,93 +0,0 @@
from typing import Dict, List
from msgspec import field
from ..common import BaseStruct
class PlayerAvatarPerData(BaseStruct):
avatarId: str
avatarType: str
avatarIdSort: int
avatarIdDesc: str
avatarItemName: str
avatarItemDesc: str
avatarItemUsage: str
obtainApproach: str
class PlayerAvatarGroupData(BaseStruct):
avatarType: str
typeName: str
avatarIdList: List[str]
class PlayerAvatarData(BaseStruct):
defaultAvatarId: str
avatarList: List[PlayerAvatarPerData]
avatarTypeData: Dict[str, PlayerAvatarGroupData]
class HomeBackgroundSingleData(BaseStruct):
bgId: str
bgType: str
bgSortId: int
bgStartTime: int
bgName: str
bgMusicId: str
bgDes: str
bgUsage: str
obtainApproach: str
unlockDesList: List[str]
class HomeBackgroundThemeData(BaseStruct):
id_: str = field(name="id")
type_: str = field(name="type")
sortId: int
startTime: int
tmName: str
tmDes: str
tmUsage: str
obtainApproach: str
unlockDesList: List[str]
isLimitObtain: bool
hideWhenLimit: bool
class ThemeLimitInfo(BaseStruct):
startTime: int
endTime: int
invalidObtainDesc: str
class HomeBackgroundThemeLimitData(BaseStruct):
id_: str = field(name="id")
limitInfos: List[ThemeLimitInfo]
class HomeBackgroundData(BaseStruct):
defaultBackgroundId: str
defaultThemeId: str
homeBgDataList: List[HomeBackgroundSingleData]
themeList: List[HomeBackgroundThemeData]
themeLimitData: Dict[str, HomeBackgroundThemeLimitData]
defaultBgMusicId: str
themeStartTime: int
# class
# class NameCardV2Data(BaseStruct):
# fixedModuleData: Dict[str, Dict[str, str]]
# removableModuleData: Dict[str, RemovableModule]
# skinData: Dict[str, NameCardV2DataSkinData]
# consts: NameCardV2DataConsts
class DisplayMetaTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
playerAvatarData: PlayerAvatarData
homeBackgroundData: HomeBackgroundData
# nameCardV2Data: NameCardV2Data

View File

@ -1,61 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class EnemyHandBookDataAbilty(BaseStruct):
text: str
textFormat: str
class EnemyHandBookData(BaseStruct):
enemyId: str
enemyIndex: str
enemyTags: Union[List[str], None]
sortId: int
name: str
enemyLevel: str
description: str
attackType: Union[str, None]
ability: Union[str, None]
isInvalidKilled: bool
overrideKillCntInfos: Dict[str, int]
hideInHandbook: bool
abilityList: Union[List[EnemyHandBookDataAbilty], None]
linkEnemies: Union[List[str], None]
damageType: Union[List[str], None]
invisibleDetail: bool
hideInStage: Union[bool, None] = None
class EnemyHandbookLevelInfoDataRangePair(BaseStruct):
min_: float = field(name="min")
max_: float = field(name="max")
class EnemyHandbookLevelInfoData(BaseStruct):
classLevel: str
attack: EnemyHandbookLevelInfoDataRangePair
def_: EnemyHandbookLevelInfoDataRangePair = field(name="def")
magicRes: EnemyHandbookLevelInfoDataRangePair
maxHP: EnemyHandbookLevelInfoDataRangePair
moveSpeed: EnemyHandbookLevelInfoDataRangePair
attackSpeed: EnemyHandbookLevelInfoDataRangePair
enemyDamageRes: EnemyHandbookLevelInfoDataRangePair
enemyRes: EnemyHandbookLevelInfoDataRangePair
class EnemyHandbookRaceData(BaseStruct):
id_: str = field(name="id")
raceName: str
sortId: int
class EnemyHandbookTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
levelInfoList: List[EnemyHandbookLevelInfoData]
enemyData: Dict[str, EnemyHandBookData]
raceData: Dict[str, EnemyHandbookRaceData]

View File

@ -1,21 +0,0 @@
from typing import List
from ..common import BaseStruct
class FavorData(BaseStruct):
favorPoint: int
percent: int
battlePhase: int
class FavorDataFrames(BaseStruct):
level: int
data: FavorData
class FavorTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
maxFavor: int
favorFrames: List[FavorDataFrames]

View File

@ -1,165 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class GachaDataLinkageTenGachaTkt(BaseStruct):
itemId: str
endTime: int
gachaPoolId: str
class GachaDataLimitTenGachaTkt(BaseStruct):
itemId: str
endTime: int
class GachaDataFreeLimitGachaData(BaseStruct):
poolId: str
openTime: int
endTime: int
freeCount: int
class GachaDataCarouselData(BaseStruct):
poolId: str
index: int
startTime: int
endTime: int
spriteId: str
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class GachaDataRecruitRange(BaseStruct):
rarityStart: int
rarityEnd: int
class PotentialMaterialConverterConfig(BaseStruct):
items: Dict[str, ItemBundle]
class RecruitPoolRecruitTime(BaseStruct):
timeLength: int
recruitPrice: int
accumRate: Union[float, None] = None
class RecruitConstantsData(BaseStruct):
tagPriceList: Dict[str, int]
maxRecruitTime: int
rarityWeights: None = None
recruitTimeFactorList: None = None
class RecruitPool(BaseStruct):
recruitTimeTable: List[RecruitPoolRecruitTime]
recruitConstants: RecruitConstantsData
recruitCharacterList: None = None
maskTypeWeightTable: None = None
class NewbeeGachaPoolClientData(BaseStruct):
gachaPoolId: str
gachaIndex: int
gachaPoolName: str
gachaPoolDetail: str
gachaPrice: int
gachaTimes: int
gachaOffset: Union[str, None] = None
firstOpenDay: Union[int, None] = None
reOpenDay: Union[int, None] = None
gachaPoolItems: None = None
signUpEarliestTime: Union[int, None] = None
class GachaPoolClientData(BaseStruct):
CDPrimColor: Union[str, None]
CDSecColor: Union[str, None]
endTime: int
gachaIndex: int
gachaPoolDetail: Union[str, None]
gachaPoolId: str
gachaPoolName: str
gachaPoolSummary: str
gachaRuleType: str
guarantee5Avail: int
guarantee5Count: int
LMTGSID: Union[str, None]
openTime: int
dynMeta: Union[Dict[str, object], None] = None
linkageParam: Union[Dict[str, object], None] = None
linkageRuleId: Union[str, None] = None
class GachaTag(BaseStruct):
tagId: int
tagName: str
tagGroup: int
class SpecialRecruitPoolSpecialRecruitCostData(BaseStruct):
itemCosts: ItemBundle
recruitPrice: int
timeLength: int
class SpecialRecruitPool(BaseStruct):
endDateTime: int
order: int
recruitId: str
recruitTimeTable: List[SpecialRecruitPoolSpecialRecruitCostData]
startDateTime: int
tagId: int
tagName: str
CDPrimColor: Union[str, None]
CDSecColor: Union[str, None]
LMTGSID: Union[str, None]
gachaRuleType: str
class GachaDataFesGachaPoolRelateItem(BaseStruct):
rarityRank5ItemId: str
rarityRank6ItemId: str
class GachaNormalItem(BaseStruct):
itemId: str
endTime: int
gachaPoolId: str
isTen: bool
class GachaTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
gachaTags: List[GachaTag]
carousel: List[GachaDataCarouselData]
classicPotentialMaterialConverter: PotentialMaterialConverterConfig
dicRecruit6StarHint: Union[Dict[str, str], None]
normalGachaItem: List[GachaNormalItem]
fesGachaPoolRelateItem: Union[
Dict[str, GachaDataFesGachaPoolRelateItem],
None,
]
freeGacha: List[GachaDataFreeLimitGachaData]
gachaPoolClient: List[GachaPoolClientData]
limitTenGachaItem: List[GachaDataLimitTenGachaTkt]
linkageTenGachaItem: List[GachaDataLinkageTenGachaTkt]
newbeeGachaPoolClient: List[NewbeeGachaPoolClientData]
potentialMaterialConverter: PotentialMaterialConverterConfig
recruitDetail: str
recruitPool: RecruitPool
recruitRarityTable: Dict[str, GachaDataRecruitRange]
specialRecruitPool: List[SpecialRecruitPool]
specialTagRarityTable: Dict[str, List[int]]
gachaTagMaxValid: Union[int, None] = None
potentialMats: Union[Dict, None] = None
classicPotentialMats: Union[Dict, None] = None

View File

@ -1,124 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class GameDataConstsCharAssistRefreshTimeState(BaseStruct):
Hour: int
Minute: int
class TermDescriptionData(BaseStruct):
termId: str
termName: str
description: str
class GamedataConst(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
addedRewardDisplayZone: str
advancedGachaCrystalCost: int
announceWebBusType: str
apBuyCost: int
apBuyThreshold: int
assistBeUsedSocialPt: Dict[str, int]
attackMax: float
baseMaxFriendNum: int
buyApTimeNoLimitFlag: bool
characterExpMap: List[List[int]]
characterUpgradeCostMap: List[List[int]]
charAssistRefreshTime: List[GameDataConstsCharAssistRefreshTimeState]
charmEquipCount: int
commonPotentialLvlUpCount: int
completeCrystalBonus: int
completeGainBonus: float
continuousActionOpen: bool
creditLimit: int
dataVersion: str
defaultMinContinuousBattleTimes: int
defaultMaxContinuousBattleTimes: int
defCDPrimColor: str
defCDSecColor: str
defMax: float
diamondMaterialToShardExchangeRatio: int
diamondToShdRate: int
easyCrystalBonus: int
evolveGoldCost: List[List[int]]
friendAssistRarityLimit: List[int]
hardDiamondDrop: int
hpMax: float
initCampaignTotalFee: int
initCharIdList: List[str]
initPlayerDiamondShard: int
initPlayerGold: int
initRecruitTagList: List[int]
instFinDmdShdCost: int
isClassicGachaPoolFuncEnabled: bool
isClassicPotentialItemFuncEnabled: bool
isClassicQCShopEnabled: bool
isDynIllustEnabled: bool
isDynIllustStartEnabled: bool
isLMGTSEnabled: bool
isSandboxPermFuncEnabled: bool
isRoguelikeAvgAchieveFuncEnabled: bool
isRoguelikeTopicFuncEnabled: bool
legacyItemList: List[ItemBundle]
legacyTime: int
lMTGSDescConstOne: str
lMTGSDescConstTwo: str
LMTGSToEPGSRatio: int
mailBannerType: List[str]
mainlineCompatibleDesc: str
mainlineEasyDesc: str
mainlineNormalDesc: str
mainlineToughDesc: str
maxLevel: List[List[int]]
maxPlayerLevel: int
maxPracticeTicket: int
monthlySubRemainTimeLimitDays: int
monthlySubWarningTime: int
multiInComeByRank: List[str]
newBeeGiftEPGS: int
normalGachaUnlockPrice: List[int]
normalRecruitLockedString: List[str]
playerApMap: List[int]
playerApRegenSpeed: int
playerExpMap: List[int]
pullForces: List[float]
pullForceZeroIndex: int
pushForces: List[float]
pushForceZeroIndex: int
recruitPoolVersion: int
rejectSpCharMission: int
reMax: float
replicateShopStartTime: int
requestSameFriendCD: int
resPrefVersion: str
richTextStyles: Dict[str, str]
storyReviewUnlockItemLackTip: str
termDescriptionDict: Dict[str, TermDescriptionData]
UnlimitSkinOutOfTime: int
useAssistSocialPt: int
useAssistSocialPtMaxCount: int
v006RecruitTimeStep1Refresh: int
v006RecruitTimeStep2Check: int
v006RecruitTimeStep2Flush: int
voucherDiv: int
voucherSkinDesc: str
voucherSkinRedeem: int
weeklyOverrideDesc: str
TSO: int
classicProtectChar: List[str]
isVoucherClassicItemDistinguishable: Union[bool, None] = None
operatorRecordsStartTime: Union[int, None] = None
subProfessionDamageTypePairs: Union[Dict[str, int], None] = None
crisisUnlockStage: Union[str, None] = None # Removed in 2.1.21

View File

@ -1,132 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class HandbookUnlockParam(BaseStruct):
unlockType: int
unlockParam1: str
unlockParam2: Union[str, None]
unlockParam3: Union[str, None]
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class HandbookStageTimeData(BaseStruct):
timestamp: int
charSet: List[str]
class HandbookStoryStageData(BaseStruct):
charId: str
code: str
description: str
levelId: str
loadingPicId: str
name: str
picId: str
rewardItem: List[ItemBundle]
stageGetTime: int
stageId: str
stageNameForShow: str
unlockParam: List[HandbookUnlockParam]
zoneId: str
zoneNameForShow: str
class HandbookDisplayCondition(BaseStruct):
charId: str
conditionCharId: str
type_: str = field(name="type")
class HandbookTeamMission(BaseStruct):
id_: str = field(name="id")
sort: int
powerId: str
powerName: str
item: ItemBundle
favorPoint: int
class NPCUnlock(BaseStruct):
unLockType: int
unLockParam: str
unLockString: Union[str, None] = None
class NPCData(BaseStruct):
appellation: str
cv: str
designerList: Union[List[str], None]
displayNumber: str
groupId: Union[str, None]
illustList: List[str]
name: str
nationId: str
npcId: str
npcShowAudioInfoFlag: bool
profession: str
resType: str
teamId: None
unlockDict: Dict[str, NPCUnlock]
minPowerId: str
class HandbookAvgData(BaseStruct):
storyId: str
storySetId: str
storySort: int
storyCanShow: bool
storyIntro: str
storyInfo: str
storyTxt: str
class HandbookAvgGroupData(BaseStruct):
storySetId: str
storySetName: str
sortId: int
storyGetTime: int
rewardItem: List[ItemBundle]
unlockParam: List[HandbookUnlockParam]
avgList: List[HandbookAvgData]
charId: str
class HandbookStoryData(BaseStruct):
storyText: str
unLockType: int
unLockParam: str
unLockString: str
class HandBookStoryViewData(BaseStruct):
stories: List[HandbookStoryData]
storyTitle: str
unLockorNot: bool
class HandbookInfoData(BaseStruct):
charID: str
infoName: str
storyTextAudio: List[HandBookStoryViewData]
handbookAvgList: List[HandbookAvgGroupData]
isLimited: Union[bool, None] = None
class HandbookInfoTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
handbookDict: Dict[str, HandbookInfoData]
npcDict: Dict[str, NPCData]
teamMissionList: Dict[str, HandbookTeamMission]
handbookDisplayConditionList: Dict[str, HandbookDisplayCondition]
handbookStageData: Dict[str, HandbookStoryStageData]
handbookStageTime: List[HandbookStageTimeData]

View File

@ -1,45 +0,0 @@
from typing import List, Union
from ..common import BaseStruct
class HandBookInfoTextViewDataInfoTextAudio(BaseStruct):
infoText: str
audioName: str
class StoryTextAudioInfoListItem(BaseStruct):
storyText: Union[str, None]
storyTitle: Union[str, None]
class StoryTextAudioItem(BaseStruct):
stories: List[StoryTextAudioInfoListItem]
unLockorNot: bool
unLockType: int
unLockParam: str
unLockString: str
class HandBookInfoTextViewData(BaseStruct):
infoList: List[HandBookInfoTextViewDataInfoTextAudio]
unLockorNot: bool
unLockType: int
unLockParam: str
unLockLevel: int
unLockLevelAdditive: int
unLockString: str
class CharHandbook(BaseStruct):
charID: str
drawName: str
infoName: str
infoTextAudio: List[HandBookInfoTextViewData]
storyTextAudio: List[StoryTextAudioItem]
class HandbookTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
char_102_texas: CharHandbook

View File

@ -1,20 +0,0 @@
from typing import Dict
from ..common import BaseStruct
class HandbookTeam(BaseStruct):
powerId: str
orderNum: int
powerLevel: int
powerName: str
powerCode: str
color: str
isLimited: bool
isRaw: bool
class HandbookTeamTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
team: Dict[str, HandbookTeam]

View File

@ -1,115 +0,0 @@
from typing import ClassVar, Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class ItemDataStageDropInfo(BaseStruct):
stageId: str
occPer: str
class ItemDataBuildingProductInfo(BaseStruct):
roomType: str
formulaId: str
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class FavorCharacterInfo(BaseStruct):
itemId: str
charId: str
favorAddAmt: int
class ActivityPotentialCharacterInfo(BaseStruct):
charId: str
class FullPotentialCharacterInfo(BaseStruct):
itemId: str
ts: int
class ItemPackInfo(BaseStruct):
packId: str
content: List[ItemBundle]
class UniCollectionInfo(BaseStruct):
uniCollectionItemId: str
uniqueItem: List[ItemBundle]
class ApSupplyFeature(BaseStruct):
id_: str = field(name="id")
ap: int
hasTs: bool
class ExpItemFeature(BaseStruct):
id_: str = field(name="id")
gainExp: int
class ItemDataVoucherRelateInfo(BaseStruct):
voucherId: str
voucherItemType: str
class ItemData(BaseStruct):
itemId: str
name: str
rarity: int
iconId: str
sortId: int
classifyType: str
itemType: str
stageDropList: ClassVar[List[Union[ItemDataStageDropInfo, None]]] = []
buildingProductList: ClassVar[List[Union[ItemDataBuildingProductInfo, None]]] = []
voucherRelateList: ClassVar[List[Union[ItemDataVoucherRelateInfo, None]]] = []
overrideBkg: Union[str, None] = None
usage: Union[str, None] = None
description: Union[str, None] = None
stackIconId: Union[str, None] = None
obtainApproach: Union[str, None] = None
hideInItemGet: Union[bool, None] = None
class CharVoucherItemFeature(BaseStruct):
displayType: int
id_: str = field(name="id")
class ServerItemReminderMailData(BaseStruct):
content: str
sender: str
title: str
class ServerItemReminderInfo(BaseStruct):
paidItemIdList: List[str]
paidReminderMail: ServerItemReminderMailData
class ItemTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
activityPotentialCharacters: Dict[str, ActivityPotentialCharacterInfo]
apSupplies: Dict[str, ApSupplyFeature]
expItems: Dict[str, ExpItemFeature]
favorCharacters: Dict[str, FavorCharacterInfo]
fullPotentialCharacters: Dict[str, FullPotentialCharacterInfo]
itemPackInfos: Dict[str, ItemPackInfo]
items: Dict[str, ItemData]
itemTimeLimit: Dict[str, int]
potentialItems: Dict[str, Dict[str, str]]
uniCollectionInfo: Dict[str, UniCollectionInfo]
uniqueInfo: Dict[str, int]
reminderInfo: Union[ServerItemReminderInfo, None] = None
charVoucherItems: Union[Dict[str, CharVoucherItemFeature], None] = None

View File

@ -1,67 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class MedalExpireTime(BaseStruct):
start: int
end: int
type_: str = field(name="type")
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class MedalGroupData(BaseStruct):
groupId: str
groupName: str
groupDesc: str
medalId: List[str]
sortId: int
groupBackColor: str
groupGetTime: int
sharedExpireTimes: Union[List[MedalExpireTime], None]
class MedalRewardGroupData(BaseStruct):
groupId: str
slotId: int
itemList: List[ItemBundle]
class MedalTypeData(BaseStruct):
medalGroupId: str
sortId: int
medalName: str
groupData: List[MedalGroupData]
class MedalPerData(BaseStruct):
medalId: Union[str, None]
medalName: Union[str, None]
medalType: Union[str, None]
slotId: Union[int, None]
preMedalIdList: Union[List[str], None]
rarity: int
template: Union[str, None]
unlockParam: List[str]
getMethod: Union[str, None]
description: Union[str, None]
advancedMedal: Union[str, None]
originMedal: Union[str, None]
displayTime: int
expireTimes: List[MedalExpireTime]
medalRewardGroup: List[MedalRewardGroupData]
isHidden: Union[bool, None] = None
class MedalTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
medalList: List[MedalPerData]
medalTypeData: Dict[str, MedalTypeData]

View File

@ -1,102 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class MissionDisplayRewards(BaseStruct):
type_: str = field(name="type")
id_: str = field(name="id")
count: int
class DailyMissionGroupInfoperiodInfo(BaseStruct):
missionGroupId: str
period: List[int]
rewardGroupId: str
class DailyMissionGroupInfo(BaseStruct):
endTime: int
periodList: List[DailyMissionGroupInfoperiodInfo]
startTime: int
tagState: Union[str, None]
class MissionWeeklyRewardConf(BaseStruct):
beginTime: int
endTime: int
groupId: str
id_: str = field(name="id")
periodicalPointCost: int
type_: str = field(name="type")
sortIndex: int
rewards: List[MissionDisplayRewards]
class MissionDailyRewardConf(BaseStruct):
groupId: str
id_: str = field(name="id")
periodicalPointCost: int
type_: str = field(name="type")
sortIndex: int
rewards: List[MissionDisplayRewards]
class MissionGroup(BaseStruct):
id_: str = field(name="id")
title: Union[str, None]
type_: str = field(name="type")
preMissionGroup: Union[str, None]
period: Union[List[int], None]
rewards: Union[List[MissionDisplayRewards], None]
missionIds: List[str]
startTs: int
endTs: int
class MissionData(BaseStruct):
id_: str = field(name="id")
sortId: int
description: str
type_: str = field(name="type")
itemBgType: str
preMissionIds: Union[List[str], None]
template: str
templateType: str
param: List[str]
unlockCondition: Union[str, None]
unlockParam: Union[List[str], None]
missionGroup: str
toPage: None
periodicalPoint: int
rewards: Union[List[MissionDisplayRewards], None]
backImagePath: Union[str, None]
foldId: Union[str, None]
haveSubMissionToUnlock: bool
class CrossAppShareMissions(BaseStruct):
shareMissionId: str
missionType: str
relateActivityId: Union[str, None]
startTime: int
endTime: int
limitCount: int
condTemplate: Union[str, None]
condParam: List[Union[str, None]]
rewardsList: Union[List[str], None]
class MissionTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
missions: Dict[str, MissionData]
missionGroups: Dict[str, MissionGroup]
periodicalRewards: Dict[str, MissionDailyRewardConf]
weeklyRewards: Dict[str, MissionWeeklyRewardConf]
dailyMissionGroupInfo: Dict[str, DailyMissionGroupInfo]
dailyMissionPeriodInfo: List[DailyMissionGroupInfo]
crossAppShareMissions: Dict[str, CrossAppShareMissions]
crossAppShareMissionConst: Dict[str, str]

View File

@ -1,279 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class RewardItem(BaseStruct):
type_: str = field(name="type")
id_: str = field(name="id")
count: int
sortId: int
class ItemBundle(BaseStruct):
type_: str = field(name="type")
id_: str = field(name="id")
count: int
class MissionDisplayRewards(BaseStruct):
type_: str = field(name="type")
id_: str = field(name="id")
count: int
class OpenServerItemData(BaseStruct):
itemId: str
itemType: str
count: int
class ReturnIntroData(BaseStruct):
sort: int
pubTime: int
image: str
class ReturnCheckinData(BaseStruct):
isImportant: bool
checkinRewardItems: List[ItemBundle]
class ReturnLongTermTaskData(BaseStruct):
id_: str = field(name="id")
sortId: int
template: str
param: List[str]
desc: str
rewards: List[MissionDisplayRewards]
playPoint: int
class ReturnDailyTaskData(BaseStruct):
groupId: str
id_: str = field(name="id")
groupSortId: int
taskSortId: int
template: str
param: List[str]
desc: str
rewards: List[MissionDisplayRewards]
playPoint: int
class ReturnConst(BaseStruct):
startTime: int
systemTab_time: int
afkDays: int
unlockLv: int
unlockLevel: str
juniorClear: bool
ifvisitor: bool
permMission_time: int
needPoints: int
defaultIntro: str
pointId: str
class ReturnData(BaseStruct):
constData: ReturnConst
onceRewards: List[ItemBundle]
intro: List[ReturnIntroData]
returnDailyTaskDic: Dict[str, List[ReturnDailyTaskData]]
returnLongTermTaskList: List[ReturnLongTermTaskData]
creditsList: List[ItemBundle]
checkinRewardList: List[ReturnCheckinData]
class OpenServerConst(BaseStruct):
firstDiamondShardMailCount: int
initApMailEndTs: int
class TotalCheckinData(BaseStruct):
order: int
item: OpenServerItemData
colorId: int
class ChainLoginData(BaseStruct):
order: int
item: OpenServerItemData
colorId: int
class MissionData(BaseStruct):
id_: str = field(name="id")
sortId: int
description: str
type_: str = field(name="type")
itemBgType: str
preMissionIds: None
template: str
templateType: str
param: List[str]
unlockCondition: None
unlockParam: None
missionGroup: str
toPage: None
periodicalPoint: int
rewards: List[ItemBundle]
backImagePath: None
foldId: None
haveSubMissionToUnlock: bool
class MissionGroup(BaseStruct):
id_: str = field(name="id")
title: None
type_: str = field(name="type")
preMissionGroup: None
period: None
rewards: None
missionIds: List[str]
startTs: int
endTs: int
class OpenServerData(BaseStruct):
openServerMissionGroup: MissionGroup
openServerMissionData: List[MissionData]
checkInData: List[TotalCheckinData]
chainLoginData: List[ChainLoginData]
class OpenServerScheduleItem(BaseStruct):
id_: str = field(name="id")
startTs: int
endTs: int
totalCheckinDescption: str
chainLoginDescription: str
charImg: str
class ReturnConstV2(BaseStruct):
startTime: int
unlockLv: int
unlockStage: str
permMissionTime: int
pointId: str
returnPriceDesc: str
dailySupplyDesc: str
class onceRewardDataV2(BaseStruct):
groupId: str
startTime: int
endTime: int
rewardList: List[RewardItem]
class ReturnCheckinDataV2RewardList(BaseStruct):
sortId: int
isImportant: bool
rewardList: List[ItemBundle]
class CheckInRewardData(BaseStruct):
groupId: str
startTime: int
endTime: int
rewardList: List[ReturnCheckinDataV2RewardList]
class PriceRewardDataV2Content(BaseStruct):
contentId: str
sortId: int
pointRequire: int
desc: str
iconId: str
topIconId: str
rewardList: List[RewardItem]
class PriceRewardDataV2(BaseStruct):
groupId: str
startTime: int
endTime: int
contentList: List[PriceRewardDataV2Content]
class MissionGroupDataV2Mission(BaseStruct):
missionId: str
groupId: str
sortId: int
jumpType: str
jumpParam: Union[str, None]
desc: str
rewardList: List[ItemBundle]
class MissionGroupDataV2(BaseStruct):
groupId: str
sortId: int
tabTitle: str
title: str
desc: str
diffMissionCount: int
startTime: int
endTime: int
imageId: str
iconId: str
missionList: List[MissionGroupDataV2Mission]
class SailySupplyDataV2(BaseStruct):
groupId: str
startTime: int
endTime: int
rewardList: List[ItemBundle]
class PackageCheckInRewardDataV2(BaseStruct):
groupId: str
startTime: int
endTime: int
getTime: int
bindGPGoodId: str
totalCheckInDay: int
iconId: str
rewardDict: Dict[str, List[RewardItem]]
class ReturnDataV2(BaseStruct):
constData: ReturnConstV2
onceRewardData: List[onceRewardDataV2]
checkInRewardData: List[CheckInRewardData]
priceRewardData: List[PriceRewardDataV2]
missionGroupData: List[MissionGroupDataV2]
dailySupplyData: List[SailySupplyDataV2]
packageCheckInRewardData: List[PackageCheckInRewardDataV2]
class CheckInRewardItem(BaseStruct):
orderNum: int
itemBundle: ItemBundle
class OpenServerNewbieCheckInPackage(BaseStruct):
groupId: str
startTime: int
endTime: int
bindGPGoodId: str
checkInDuration: int
totalCheckInDay: int
iconId: str
checkInRewardDict: Dict[str, List[CheckInRewardItem]]
class OpenServerTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
schedule: List[OpenServerScheduleItem]
dataMap: Dict[str, OpenServerData]
constant: OpenServerConst
playerReturn: ReturnData
playerReturnV2: ReturnDataV2
newbieCheckInPackageList: List[OpenServerNewbieCheckInPackage]

View File

@ -1,28 +0,0 @@
from typing import Dict, List
from ..common import BaseStruct
class PlayerAvatarGroupData(BaseStruct):
avatarType: str
typeName: str
avatarIdList: List[str]
class PlayerAvatarPerData(BaseStruct):
avatarId: str
avatarType: str
avatarIdSort: int
avatarIdDesc: str
avatarItemName: str
avatarItemDesc: str
avatarItemUsage: str
obtainApproach: str
class PlayerAvatarTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
avatarList: List[PlayerAvatarPerData]
avatarTypeData: Dict[str, PlayerAvatarGroupData]
defaultAvatarId: str

View File

@ -1,30 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class GridPosition(BaseStruct):
row: int
col: int
class ObscuredRect(BaseStruct):
m_xMin: float
m_yMin: float
m_width: float
m_height: float
class Stage(BaseStruct):
id_: str = field(name="id")
direction: int
grids: List[GridPosition]
boundingBoxes: Union[List[ObscuredRect], None] = None
class RangeTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
range_: Dict[str, Stage]

View File

@ -1,26 +0,0 @@
from typing import Dict, List
from msgspec import field
from ..common import BaseStruct
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class ReplicateData(BaseStruct):
item: ItemBundle
replicateTokenItem: ItemBundle
class ReplicateList(BaseStruct):
replicateList: List[ReplicateData]
class ReplicateTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
replicate: Dict[str, ReplicateList]

View File

@ -1,454 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class StageDataDisplayRewards(BaseStruct):
type_: str = field(name="type")
id_: str = field(name="id")
dropType: int
class Blackboard(BaseStruct):
key: str
value: Union[float, None] = None
valueStr: Union[str, None] = None
class Act17sideDataChoiceNodeOptionData(BaseStruct):
canRepeat: bool
eventId: str
des: str
unlockDes: Union[str, None]
class StageDataDisplayDetailRewards(BaseStruct):
occPercent: int
type_: str = field(name="type")
id_: str = field(name="id")
dropType: int
CannotGetPercent: Union[float, None] = None
GetPercent: Union[float, None] = None
class StageDataConditionDesc(BaseStruct):
stageId: str
completeState: int
class Act17sideDataConstData(BaseStruct):
techTreeUnlockEventId: str
class Act17sideDataZoneData(BaseStruct):
zoneId: str
unlockPlaceId: Union[str, None]
unlockText: str
class Act17sideDataMainlineData(BaseStruct):
mainlineId: str
nodeId: Union[str, None]
sortId: int
missionSort: str
zoneId: str
mainlineDes: str
focusNodeId: Union[str, None]
class Act17sideDataMainlineChapterData(BaseStruct):
chapterId: str
chapterDes: str
chapterIcon: str
unlockDes: str
id_: str = field(name="id")
class RunesSelector(BaseStruct):
professionMask: int
buildableMask: int
charIdFilter: Union[List[str], None]
enemyIdFilter: Union[List[str], None]
enemyIdExcludeFilter: Union[List[str], None]
enemyLevelTypeFilter: Union[List[str], None]
skillIdFilter: Union[List[str], None]
tileKeyFilter: Union[List[str], None]
groupTagFilter: Union[List[str], None]
filterTagFilter: Union[List[str], None]
filterTagExcludeFilter: Union[List[str], None]
subProfessionExcludeFilter: Union[List[str], None]
mapTagFilter: Union[List[str], None]
class TechTreeBranchRunes(BaseStruct):
key: str
selector: RunesSelector
blackboard: List[Blackboard]
class BranchRuneData(BaseStruct):
id_: str = field(name="id")
points: float
mutexGroupKey: None
description: str
runes: List[TechTreeBranchRunes]
class Act17sideDataTechTreeBranchData(BaseStruct):
techTreeBranchId: str
techTreeId: str
techTreeBranchName: str
techTreeBranchIcon: str
techTreeBranchDesc: str
runeData: BranchRuneData
class Act17sideDataTechTreeData(BaseStruct):
techTreeId: str
sortId: int
techTreeName: str
defaultBranchId: str
lockDes: str
class Act17sideDataArchiveItemUnlockData(BaseStruct):
itemId: str
itemType: str
unlockCondition: str
nodeId: Union[str, None]
stageParam: str
chapterId: Union[str, None]
class Act17sideDataEventData(BaseStruct):
eventId: str
eventTitle: str
eventDesList: List[str]
eventPic: Union[str, None] = None
eventSpecialPic: Union[str, None] = None
class Act17sideDataChoiceNodeData(BaseStruct):
nodeId: str
isDisposable: bool
choiceName: str
choiceDesList: List[str]
cancelDes: str
choiceNum: int
optionList: List[Act17sideDataChoiceNodeOptionData]
choicePic: Union[str, None] = None
choiceSpecialPic: Union[str, None] = None
class Act17sideDataTechNodeData(BaseStruct):
nodeId: str
techTreeId: str
techTreeName: str
techPic: None
techSpecialPic: str
endEventId: str
confirmDes: str
techDesList: List[str]
missionIdList: List[None]
class Act17sideDataEventNodeData(BaseStruct):
nodeId: str
eventId: str
endEventId: str
class Act17sideDataTreasureNodeData(BaseStruct):
nodeId: str
treasureId: str
treasureName: str
treasurePic: Union[str, None]
treasureSpecialPic: None
endEventId: str
confirmDes: str
treasureDesList: List[str]
missionIdList: List[str]
rewardList: List[ItemBundle]
treasureType: str
class Act17sideDataBattleNodeData(BaseStruct):
nodeId: str
stageId: str
class Act17sideDataStoryNodeData(BaseStruct):
nodeId: str
storyId: str
storyKey: str
storyName: str
storyPic: Union[str, None]
confirmDes: str
storyDesList: List[str]
class Act17sideDataLandmarkNodeData(BaseStruct):
nodeId: str
landmarkId: str
landmarkName: str
landmarkPic: Union[str, None]
landmarkSpecialPic: str
landmarkDesList: List[str]
class Act17sideDataNodeInfoData(BaseStruct):
nodeId: str
nodeType: str
sortId: int
placeId: str
isPointPlace: bool
chapterId: str
trackPointType: str
class Act17sideDataPlaceData(BaseStruct):
placeId: str
placeDesc: str
lockEventId: Union[str, None]
zoneId: str
class Act17sideData(BaseStruct):
archiveItemUnlockDataMap: Dict[str, Act17sideDataArchiveItemUnlockData]
battleNodeDataMap: Dict[str, Act17sideDataBattleNodeData]
choiceNodeDataMap: Dict[str, Act17sideDataChoiceNodeData]
constData: Act17sideDataConstData
eventDataMap: Dict[str, Act17sideDataEventData]
eventNodeDataMap: Dict[str, Act17sideDataEventNodeData]
landmarkNodeDataMap: Dict[str, Act17sideDataLandmarkNodeData]
mainlineChapterDataMap: Dict[str, Act17sideDataMainlineChapterData]
mainlineDataMap: Dict[str, Act17sideDataMainlineData]
nodeInfoDataMap: Dict[str, Act17sideDataNodeInfoData]
placeDataMap: Dict[str, Act17sideDataPlaceData]
storyNodeDataMap: Dict[str, Act17sideDataStoryNodeData]
techNodeDataMap: Dict[str, Act17sideDataTechNodeData]
techTreeBranchDataMap: Dict[str, Act17sideDataTechTreeBranchData]
techTreeDataMap: Dict[str, Act17sideDataTechTreeData]
treasureNodeDataMap: Dict[str, Act17sideDataTreasureNodeData]
zoneDataList: List[Act17sideDataZoneData]
class RuneDataSelector(BaseStruct):
buildableMask: int
professionMask: int
charIdFilter: Union[List[str], None]
enemyIdFilter: Union[List[str], None]
enemyIdExcludeFilter: Union[List[str], None]
enemyLevelTypeFilter: Union[List[str], None]
skillIdFilter: Union[List[str], None]
tileKeyFilter: Union[List[str], None]
groupTagFilter: Union[List[str], None]
filterTagFilter: Union[List[str], None]
filterTagExcludeFilter: Union[List[str], None]
subProfessionExcludeFilter: Union[List[str], None]
mapTagFilter: Union[List[str], None]
class RuneData(BaseStruct):
blackboard: List[Blackboard]
key: str
selector: RuneDataSelector
m_inited: Union[bool, None] = None
class RuneTablePackedRuneData(BaseStruct):
description: str
id_: str = field(name="id")
points: float
runes: List[RuneData]
mutexGroupKey: Union[str, None] = None
class Act25SideDataBattlePerformanceData(BaseStruct):
itemDesc: str
itemId: str
itemIcon: str
itemName: str
itemTechType: str
runeData: RuneTablePackedRuneData
sortId: int
class ActivityCustomDataAct25sideCustomData(BaseStruct):
battlePerformanceData: Dict[str, Act25SideDataBattlePerformanceData]
class ActivityCustomDataAct20sideCustomData(BaseStruct):
zoneAdditionDataMap: Dict[str, str]
residentCartDatas: Dict[str, Dict[str, str]]
class Act21SideDataZoneAddtionData(BaseStruct):
zoneId: str
unlockText: str
stageUnlockText: Union[str, None]
entryId: str
class Act21SideDataConstData(BaseStruct):
lineConnectZone: str
class ActivityCustomDataAct21sideCustomData(BaseStruct):
zoneAdditionDataMap: Dict[str, Act21SideDataZoneAddtionData]
constData: Act21SideDataConstData
class ActivityCustomData(BaseStruct):
TYPE_ACT17SIDE: Dict[str, Act17sideData]
TYPE_ACT25SIDE: Dict[str, ActivityCustomDataAct25sideCustomData]
TYPE_ACT20SIDE: Dict[str, ActivityCustomDataAct20sideCustomData]
TYPE_ACT21SIDE: Dict[str, ActivityCustomDataAct21sideCustomData]
class RetroTrailRuleData(BaseStruct):
title: List[str]
desc: List[str]
class WeightItemBundle(BaseStruct):
count: int
dropType: str
id_: str = field(name="id")
type_: str = field(name="type")
weight: int
class StageDataStageDropInfo(BaseStruct):
displayRewards: List[StageDataDisplayRewards]
displayDetailRewards: List[StageDataDisplayDetailRewards]
firstPassRewards: Union[List[ItemBundle], None] = None
firstCompleteRewards: Union[List[ItemBundle], None] = None
passRewards: Union[List[List[WeightItemBundle]], None] = None
completeRewards: Union[List[List[WeightItemBundle]], None] = None
class StageData(BaseStruct, kw_only=False):
stageType: str
difficulty: str
performanceStageFlag: str
diffGroup: str
unlockCondition: List[StageDataConditionDesc]
stageId: str
levelId: Union[str, None]
zoneId: str
code: str
name: str
description: str
hardStagedId: Union[str, None]
dangerLevel: Union[str, None]
dangerPoint: float
loadingPicId: str
canPractice: bool
canBattleReplay: bool
apCost: int
apFailReturn: int
etItemId: str
etCost: int
etFailReturn: int
etButtonStyle: None
apProtectTimes: int
diamondOnceDrop: int
practiceTicketCost: int
dailyStageDifficulty: int
expGain: int
goldGain: int
loseExpGain: int
loseGoldGain: int
passFavor: int
completeFavor: int
slProgress: int
displayMainItem: None
hilightMark: bool
bossMark: bool
isPredefined: bool
isHardPredefined: bool
isSkillSelectablePredefined: bool
isStoryOnly: bool
appearanceStyle: int
stageDropInfo: StageDataStageDropInfo
startButtonOverrideId: None
isStagePatch: bool
mainStageId: str
canUseTech: Union[bool, None] = None
canUseCharm: Union[bool, None] = None
canUseBattlePerformance: Union[bool, None] = None
class RetroTrailRewardItem(BaseStruct):
trailRewardId: str
starCount: int
rewardItem: ItemBundle
class RetroTrailData(BaseStruct):
retroId: str
trailStartTime: int
trailRewardList: List[RetroTrailRewardItem]
stageList: List[str]
relatedChar: str
relatedFullPotentialItemId: None
themeColor: str
fullPotentialItemId: str
class RetroActData(BaseStruct):
retroId: str
type_: int = field(name="type")
linkedActId: List[str]
startTime: int
trailStartTime: int
index: int
name: str
detail: str
haveTrail: bool
customActId: Union[str, None]
customActType: str
class StageValidInfo(BaseStruct):
startTs: int
endTs: int
class RetroStageOverrideInfo(BaseStruct):
apCost: int
apFailReturn: int
completeFavor: int
dropInfo: StageDataStageDropInfo
expGain: int
goldGain: int
passFavor: int
zoneId: str
class RetroTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
customData: ActivityCustomData
initRetroCoin: int
retroActList: Dict[str, RetroActData]
retroCoinMax: int
retroCoinPerWeek: int
retroDetail: str
retroPreShowTime: int
retroTrailList: Dict[str, RetroTrailData]
retroUnlockCost: int
ruleData: RetroTrailRuleData
stageList: Dict[str, StageData]
stageValidInfo: Dict[str, StageValidInfo]
zoneToRetro: Dict[str, str]
stages: Union[Dict[str, RetroStageOverrideInfo], None] = None

View File

@ -1,206 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class Blackboard(BaseStruct):
key: str
value: Union[float, None] = None
valueStr: Union[str, None] = None
class RoguelikeBuff(BaseStruct):
key: str
blackboard: List[Blackboard]
class RoguelikeOuterBuff(BaseStruct):
level: int
name: str
iconId: str
description: str
usage: str
key: str
blackboard: List[Blackboard]
buffId: Union[str, None] = None
class RoguelikeOutBuffData(BaseStruct):
id_: str = field(name="id")
buffs: Dict[str, RoguelikeOuterBuff]
class RoguelikeEndingData(BaseStruct):
id_: str = field(name="id")
backgroundId: str
name: str
description: str
priority: int
unlockItemId: Union[str, None]
changeEndingDesc: None
class RoguelikeModeData(BaseStruct):
id_: str = field(name="id")
name: str
canUnlockItem: int
scoreFactor: float
itemPools: List[str]
difficultyDesc: str
ruleDesc: str
sortId: int
unlockMode: str
color: str
class RoguelikeChoiceSceneData(BaseStruct):
id_: str = field(name="id")
title: str
description: str
background: str
class RoguelikeChoiceData(BaseStruct):
id_: str = field(name="id")
title: str
description: Union[str, None]
type_: str = field(name="type")
nextSceneId: Union[str, None]
icon: Union[str, None]
param: Dict[str, object]
class RoguelikeZoneData(BaseStruct):
id_: str = field(name="id")
name: str
description: str
endingDescription: str
backgroundId: str
subIconId: str
class RoguelikeStageData(BaseStruct):
id_: str = field(name="id")
linkedStageId: str
levelId: str
code: str
name: str
loadingPicId: str
description: str
eliteDesc: Union[str, None]
isBoss: int
isElite: int
difficulty: str
class RoguelikeRelicFeature(BaseStruct):
id_: str = field(name="id")
buffs: List[RoguelikeBuff]
class RoguelikeUpgradeTicketFeature(BaseStruct):
id_: str = field(name="id")
profession: int
rarity: int
professionList: List[str]
rarityList: List[int]
class RoguelikeRecruitTicketFeature(BaseStruct):
id_: str = field(name="id")
profession: int
rarity: int
professionList: List[str]
rarityList: List[int]
extraEliteNum: int
extraFreeRarity: List[Union[int, None]]
extraCharIds: List[str]
class RelicStableUnlockParam(BaseStruct):
unlockCondDetail: str
unlockCnt: int
class RoguelikeItemData(BaseStruct):
id_: str = field(name="id")
name: str
description: Union[str, None]
usage: str
obtainApproach: str
iconId: str
type_: str = field(name="type")
rarity: str
value: int
sortId: int
unlockCond: Union[str, None]
unlockCondDesc: Union[str, None]
unlockCondParams: List[Union[str, None]]
stableUnlockCond: Union[RelicStableUnlockParam, None]
class RoguelikeItemTable(BaseStruct):
items: Dict[str, RoguelikeItemData]
recruitTickets: Dict[str, RoguelikeRecruitTicketFeature]
upgradeTickets: Dict[str, RoguelikeUpgradeTicketFeature]
relics: Dict[str, RoguelikeRelicFeature]
class RoguelikeConstTableEventTypeData(BaseStruct):
name: str
description: str
class RoguelikeConstTableCharUpgradeData(BaseStruct):
evolvePhase: int
skillLevel: int
skillSpecializeLevel: int
class RoguelikeConstTableRecruitData(BaseStruct):
recruitPopulation: int
upgradePopulation: int
class RoguelikeConstTablePlayerLevelData(BaseStruct):
exp: int
populationUp: int
squadCapacityUp: int
battleCharLimitUp: int
class RoguelikeConstTable(BaseStruct):
playerLevelTable: Dict[str, RoguelikeConstTablePlayerLevelData]
recruitPopulationTable: Dict[str, RoguelikeConstTableRecruitData]
charUpgradeTable: Dict[str, RoguelikeConstTableCharUpgradeData]
eventTypeTable: Dict[str, RoguelikeConstTableEventTypeData]
shopDialogs: List[str]
shopRelicDialogs: List[str]
shopTicketDialogs: List[str]
mimicEnemyIds: List[str]
clearZoneScores: List[int]
moveToNodeScore: int
clearNormalBattleScore: int
clearEliteBattleScore: int
clearBossBattleScore: int
gainRelicScore: int
gainCharacterScore: int
unlockRelicSpecialScore: int
squadCapacityMax: int
bossIds: List[str]
class RoguelikeTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
constTable: RoguelikeConstTable
itemTable: RoguelikeItemTable
stages: Dict[str, RoguelikeStageData]
zones: Dict[str, RoguelikeZoneData]
choices: Dict[str, RoguelikeChoiceData]
choiceScenes: Dict[str, RoguelikeChoiceSceneData]
modes: Dict[str, RoguelikeModeData]
endings: Dict[str, RoguelikeEndingData]
outBuffs: Dict[str, RoguelikeOutBuffData]

File diff suppressed because it is too large Load Diff

View File

@ -1,880 +0,0 @@
from typing import Dict, List, Union
from ..common import BaseStruct
class HomeEntryDisplayData(BaseStruct):
displayId: str
topicId: str
startTs: int
endTs: int
class SandboxPermBasicData(BaseStruct):
topicId: str
topicTemplate: str
topicName: str
topicStartTime: int
fullStoredTime: int
sortId: int
priceItemId: str
templateShopId: str
homeEntryDisplayData: List[HomeEntryDisplayData]
webBusType: str
medalGroupId: str
class SandboxV2NodeData(BaseStruct):
minDistance: float
class UnityEngineVector2(BaseStruct):
x: float
y: float
class SandboxV2MapZoneData(BaseStruct):
zoneId: str
hasBorder: bool
center: Union[UnityEngineVector2, None] = None
vertices: Union[List[UnityEngineVector2], None] = None
triangles: Union[List[List[int]], None] = None
class SandboxV2MapConfig(BaseStruct):
isRift: bool
isGuide: bool
cameraBoundMin: UnityEngineVector2
cameraBoundMax: UnityEngineVector2
cameraMaxNormalizedZoom: float
backgroundId: str
class SandboxV2MapData(BaseStruct):
nodes: Dict[str, SandboxV2NodeData]
zones: Dict[str, SandboxV2MapZoneData]
mapConfig: SandboxV2MapConfig
centerNodeId: str
monthModeNodeId: Union[str, None]
class SandboxV2ItemTrapData(BaseStruct):
itemId: str
trapId: str
trapPhase: int
trapLevel: int
skillIndex: int
skillLevel: int
buildingLevel: int
updatedItemId: Union[str, None]
minLevelItemId: str
baseItemName: str
itemType: str
itemTag: str
class SandboxV2ItemTrapTagData(BaseStruct):
tag: str
tagName: str
tagPic: str
sortId: int
class SandboxV2BuildingItemData(BaseStruct):
itemId: str
itemRarity: int
class SandboxV2CraftItemData(BaseStruct):
itemId: str
type: int
buildingUnlockDesc: str
materialItems: Dict[str, int]
upgradeItems: Union[Dict[str, int], None]
withdrawRatio: int
repairCost: int
craftGroupId: str
recipeLevel: int
isHidden: Union[bool, None] = None
class SandboxV2LivestockData(BaseStruct):
livestockItemId: str
shinyLivestockItemId: str
livestockEnemyId: str
class SandboxV2CraftGroupData(BaseStruct):
items: List[str]
class SandboxV2AlchemyMaterialData(BaseStruct):
itemId: str
count: int
class SandboxV2AlchemyRecipeData(BaseStruct):
recipeId: str
materials: List[SandboxV2AlchemyMaterialData]
itemId: str
onceAlchemyRatio: int
recipeLevel: int
unlockDesc: str
class SandboxV2DrinkMatData(BaseStruct):
id: str
type: str
count: int
class SandboxV2FoodMatData(BaseStruct):
id: str
type: str
sortId: int
attribute: Union[str, None] = None
buffDesc: Union[str, None] = None
class SandboxV2FoodRecipeData(BaseStruct):
foodId: str
mats: List[str]
class SandboxV2FoodData(BaseStruct):
id: str
attributes: List[str]
duration: int
itemName: str
itemUsage: str
sortId: int
enhancedUsage: Union[str, None] = None
generalName: Union[str, None] = None
enhancedName: Union[str, None] = None
recipes: Union[List[SandboxV2FoodRecipeData], None] = None
class SandboxV2NodeTypeData(BaseStruct):
nodeType: str
name: str
iconId: str
class SandboxV2NodeUpgradeData(BaseStruct):
nodeUpgradeId: str
name: str
description: str
upgradeDesc: str
upgradeTips: str
itemType: str
itemTag: str
itemCnt: int
itemRarity: int
class SandboxV2WeatherData(BaseStruct):
weatherId: str
name: str
weatherLevel: int
weatherType: str
weatherTypeName: str
weatherIconId: str
functionDesc: str
description: str
buffId: Union[str, None]
class SandboxV2StageData(BaseStruct):
stageId: str
levelId: str
code: str
name: str
description: str
actionCost: int
actionCostEnemyRush: int
class SandboxV2ZoneData(BaseStruct):
zoneId: str
zoneName: str
displayName: bool
appellation: Union[str, None]
class SandboxV2NodeBuffData(BaseStruct):
runeId: str
name: str
description: str
extra: str
iconId: str
class SandboxV2RewardItemConfigData(BaseStruct):
rewardItem: str
rewardType: str
class SandboxV2RewardData(BaseStruct):
rewardList: List[SandboxV2RewardItemConfigData]
class SandboxV2RewardCommonConfig(BaseStruct):
rewardItemId: str
rewardItemType: str
count: int
class SandboxV2RewardConfigGroupData(BaseStruct):
stageMapPreviewRewardDict: Dict[str, SandboxV2RewardData]
stageDetailPreviewRewardDict: Dict[str, SandboxV2RewardData]
trapRewardDict: Dict[str, SandboxV2RewardCommonConfig]
enemyRewardDict: Dict[str, SandboxV2RewardCommonConfig]
unitPreviewRewardDict: Dict[str, SandboxV2RewardData]
stageRewardDict: Dict[str, SandboxV2RewardData]
rushPreviewRewardDict: Dict[str, SandboxV2RewardData]
class SandboxV2FloatIconData(BaseStruct):
picId: str
picName: Union[str, None]
class SandboxV2EnemyRushTypeData(BaseStruct):
type: str
description: str
sortId: int
class SandboxV2BattleRushEnemyConfig(BaseStruct):
enemyKey: str
branchId: str
count: int
interval: float
preDelay: float
class SandboxV2BattleRushEnemyGroupConfig(BaseStruct):
enemyGroupKey: str
enemy: List[SandboxV2BattleRushEnemyConfig]
dynamicEnemy: List[str]
class RushEnemyDBRef(BaseStruct):
id: str
level: int
class SandboxV2BattleRushEnemyData(BaseStruct):
rushEnemyGroupConfigs: Dict[str, List[SandboxV2BattleRushEnemyGroupConfig]]
rushEnemyDbRef: List[RushEnemyDBRef]
class SandboxV2GameConst(BaseStruct):
mainMapId: str
baseTrapId: str
portableTrapId: str
doorTrapId: str
mineTrapId: str
neutralBossEnemyId: List[str]
nestTrapId: str
shopNpcName: str
daysBetweenAssessment: int
portableConstructUnlockLevel: int
outpostConstructUnlockLevel: int
maxEnemyCountSameTimeInRush: int
maxSaveCnt: int
firstSeasonDuration: int
seasonTransitionLoop: List[str]
seasonDurationLoop: List[int]
firstSeasonStartAngle: float
seasonTransitionAngleLoop: List[float]
seasonAngle: float
battleItemDesc: str
foodDesc: str
multipleSurvivalDayDesc: str
multipleTips: str
techProgressScore: int
otherEnemyRushName: str
surviveDayText: str
survivePeriodText: str
surviveScoreText: str
actionPointScoreText: str
nodeExploreDesc: str
dungeonExploreDesc: str
nodeCompleteDesc: str
noRiftDungeonDesc: str
baseRushedDesc: str
riftBaseDesc: str
riftBaseRushedDesc: str
dungeonTriggeredGuideQuestList: List[str]
class ItemBundle(BaseStruct):
id: str
count: int
type: str
class SandboxV2BasicConst(BaseStruct):
staminaItemId: str
goldItemId: str
dimensioncoinItemId: str
alwaysShowItemIdsConstruct: List[str]
alwaysShowItemIds: List[str]
bagBottomBarResType: List[str]
failedCookFood: str
maxFoodDuration: int
drinkCostOnce: int
drinkMakeLimit: int
specialMatWater: str
enhancedSubFoodmat: str
enhancedDuration: int
workbenchMakeLimit: int
logisticsPosLimit: int
logisticsUnlockLevel: int
logisticsDrinkCost: int
logisticsEvacuateTips: str
logisticsEvacuateWarning: str
baseRepairCost: int
portRepairCost: int
unitFenceLimit: int
cageId: str
fenceId: str
monthlyRushEntryText1: Union[str, None]
monthlyEntryUnlockText: str
monthlyEntryRiftText: str
monthlyRushIntro: str
monthlyCoin: ItemBundle
charRarityColorList: List[str]
squadCharCapacity: int
totalSquadCnt: int
toolboxCapacity: int
toolCntLimitInSquad: int
miniSquadCharCapacity: int
miniSquadDrinkCost: int
normalSquadDrinkCost: int
emptySquadDrinkCost: int
achieveTypeAll: str
constructModeBgmHome: str
battleBgmCollect: str
battleBgmHunt: str
battleBgmEnemyRush: str
battleBgmBossRush: str
imgLoadingNormalName: str
imgLoadingBaseName: str
imgUnloadingBaseName: str
class SandboxV2RiftConst(BaseStruct):
refreshRate: int
randomDungeonId: str
subTargetRewardId: str
dungeonSeasonId: str
fixedDungeonTypeName: str
randomDungeonTypeName: str
noTeamDescription: str
noTeamName: str
noTeamBackgroundId: str
noTeamSmallIconId: str
noTeamBigIconId: str
messengerEnemyId: str
riftRushEnemyGroupLimit: int
riftRushSpawnCd: int
class SandboxV2DevelopmentConst(BaseStruct):
techPointsTotal: int
class TipData(BaseStruct):
tip: str
weight: float
category: str
class RuneDataSelector(BaseStruct):
professionMask: int
buildableMask: int
charIdFilter: Union[List[str], None] = None
enemyIdFilter: Union[List[str], None] = None
enemyIdExcludeFilter: Union[List[str], None] = None
enemyLevelTypeFilter: Union[List[str], None] = None
skillIdFilter: Union[List[str], None] = None
tileKeyFilter: Union[List[str], None] = None
groupTagFilter: Union[List[str], None] = None
filterTagFilter: Union[List[str], None] = None
filterTagExcludeFilter: Union[List[str], None] = None
subProfessionExcludeFilter: Union[List[str], None] = None
mapTagFilter: Union[List[str], None] = None
class BlackboardDataPair(BaseStruct):
key: str
value: Union[float, None] = None
valueStr: Union[str, None] = None
class RuneData(BaseStruct):
key: str
selector: RuneDataSelector
blackboard: List[BlackboardDataPair]
class PackedRuneData(BaseStruct):
id: str
points: float
mutexGroupKey: Union[str, None]
description: str
runes: List[RuneData]
class LegacyInLevelRuneData(BaseException):
difficultyMask: int
key: str
professionMask: int
buildableMask: int
blackboard: List[BlackboardDataPair]
class SandboxV2QuestData(BaseStruct):
questId: str
questLine: str
questTitle: Union[str, None]
questDesc: Union[str, None]
questTargetDesc: Union[str, None]
isDisplay: bool
questRouteType: str
questLineType: str
questRouteParam: Union[str, None]
showProgressIndex: int
class SandboxV2NpcData(BaseStruct):
npcId: str
trapId: str
npcType: str
dialogIds: Dict[str, str]
npcLocation: Union[List[int], None]
npcOrientation: int
picId: str
picName: str
showPic: bool
reactSkillIndex: int
class SandboxV2DialogData(BaseStruct):
dialogId: str
avgId: str
class SandboxV2QuestLineData(BaseStruct):
questLineId: str
questLineTitle: str
questLineType: str
questLineBadgeType: int
questLineDesc: str
sortId: int
class SandboxV2GuideQuestData(BaseStruct):
questId: str
storyId: str
triggerKey: str
class SandboxV2DevelopmentData(BaseStruct):
techId: str
techType: str
positionX: int
positionY: int
frontNodeId: Union[str, None]
nextNodeIds: Union[List[str], None]
limitBaseLevel: int
tokenCost: int
techName: str
techIconId: str
nodeTitle: str
rawDesc: str
canBuffReserch: bool
class SandboxV2EventData(BaseStruct):
eventId: str
type: str
iconId: str
iconName: Union[str, None]
enterSceneId: str
class SandboxV2EventSceneData(BaseStruct):
eventSceneId: str
title: str
desc: str
choiceIds: List[str]
class SandboxV2EventChoiceData(BaseStruct):
choiceId: str
type: str
costAction: int
title: str
desc: str
expeditionId: Union[str, None]
class SandboxV2ExpeditionData(BaseStruct):
expeditionId: str
desc: str
effectDesc: str
costAction: int
costDrink: int
charCnt: int
profession: int
professions: List[str]
minEliteRank: int
duration: int
class SandboxV2EventEffectData(BaseStruct):
eventEffectId: str
buffId: str
duration: int
desc: str
class SandboxV2ShopGoodData(BaseStruct):
goodId: str
itemId: str
count: int
coinType: str
value: int
class SandboxV2ShopDialogData(BaseStruct):
seasonDialogs: Dict[str, List[str]]
afterBuyDialogs: List[str]
shopEmptyDialogs: List[str]
class SandboxV2LogisticsData(BaseStruct):
id: str
desc: str
noBuffDesc: str
iconId: str
profession: str
sortId: int
levelParams: List[str]
class SandboxV2LogisticsCharData(BaseStruct):
levelUpperLimit: int
charUpperLimit: int
class SandboxV2MonthRushData(BaseStruct):
monthlyRushId: str
startTime: int
endTime: int
isLast: bool
sortId: int
rushGroupKey: str
monthlyRushName: str
monthlyRushDes: str
weatherId: str
nodeId: str
conditionGroup: str
conditionDesc: str
rewardItemList: List[ItemBundle]
class SandboxV2RiftParamData(BaseStruct):
id: str
desc: str
iconId: str
bkColor: str
class SandboxV2RiftSubTargetData(BaseStruct):
id: str
name: str
desc: str
class SandboxV2RiftMainTargetData(BaseStruct):
id: str
title: str
desc: str
storyDesc: str
targetDayCount: int
targetType: str
questIconId: Union[str, None]
questIconName: Union[str, None]
class SandboxV2RiftGlobalEffectData(BaseStruct):
id: str
desc: str
class SandboxV2FixedRiftData(BaseStruct):
riftId: str
riftName: str
rewardGroupId: str
class SandboxV2RiftTeamBuffData(BaseStruct):
teamId: str
teamName: str
buffLevel: int
buffDesc: str
teamSmallIconId: str
teamBigIconId: str
teamDesc: str
teamBgId: str
class SandboxV2RiftDifficultyData(BaseStruct):
id: str
desc: str
difficultyLevel: int
rewardGroupId: str
class SandboxV2ArchiveQuestAvgData(BaseStruct):
avgId: str
avgName: str
class SandboxV2ArchiveQuestCgData(BaseStruct):
cgId: str
cgTitle: str
cgDesc: str
cgPath: str
class SandboxV2ArchiveQuestZoneData(BaseStruct):
zoneId: str
zoneName: str
zoneBgPicId: str
zoneNameIdEn: str
class SandboxV2ArchiveQuestData(BaseStruct):
id: str
sortId: int
questType: str
name: str
desc: str
avgDataList: List[SandboxV2ArchiveQuestAvgData]
cgDataList: List[SandboxV2ArchiveQuestCgData]
npcPicIdList: List[str]
zoneData: SandboxV2ArchiveQuestZoneData
class SandboxV2ArchiveAchievementData(BaseStruct):
id: str
achievementType: List[str]
raritySortId: int
sortId: int
name: str
desc: str
class SandboxV2ArchiveAchievementTypeData(BaseStruct):
achievementType: str
name: str
sortId: int
class SandboxV2ArchiveQuestTypeData(BaseStruct):
type: str
name: str
iconId: str
class SandboxV2ArchiveMusicUnlockData(BaseStruct):
musicId: str
unlockCondDesc: Union[str, None]
class SandboxV2BaseUpdateCondition(BaseStruct):
desc: str
limitCond: str
param: List[str]
class SandboxV2BaseUpdateFunctionPreviewDetailData(BaseStruct):
funcId: str
unlockType: str
typeTitle: str
desc: str
icon: str
darkMode: bool
sortId: int
displayType: str
class SandboxV2BaseFunctionPreviewData(BaseStruct):
previewId: str
previewValue: int
detailData: SandboxV2BaseUpdateFunctionPreviewDetailData
class SandboxV2BaseUpdateData(BaseStruct):
baseLevelId: str
baseLevel: int
conditions: List[SandboxV2BaseUpdateCondition]
items: Dict[str, int]
previewDatas: List[SandboxV2BaseFunctionPreviewData]
scoreFactor: str
portableRepairCost: int
entryCount: int
repairCost: int
class SandboxV2DevelopmentLineSegmentData(BaseStruct):
fromNodeId: str
passingNodeIds: List[str]
fromAxisPosX: int
fromAxisPosY: int
toAxisPosX: int
toAxisPosY: int
lineStyle: int
unlockBasementLevel: int
class SandboxV2BuildingNodeScoreData(BaseStruct):
nodeId: str
sortId: int
limitScore: int
class SandboxV2SeasonData(BaseStruct):
seasonType: str
name: str
functionDesc: str
description: str
color: str
class SandboxV2ConfirmIconData(BaseStruct):
iconType: str
iconPicId: str
class SandboxV2TutorialRepoCharData(BaseStruct):
instId: int
charId: str
evolvePhase: int
level: int
favorPoint: int
potentialRank: int
mainSkillLv: int
specSkillList: List[int]
class SandboxV2TutorialBasicConst(BaseStruct):
trainingQuestList: List[str]
class SandboxV2TutorialData(BaseStruct):
charRepoData: Dict[str, SandboxV2TutorialRepoCharData]
questData: Dict[str, SandboxV2QuestData]
guideQuestData: Dict[str, SandboxV2GuideQuestData]
questLineData: Dict[str, SandboxV2QuestLineData]
basicConst: SandboxV2TutorialBasicConst
class SandboxV2Data(BaseStruct):
mapData: Dict[str, SandboxV2MapData]
itemTrapData: Dict[str, SandboxV2ItemTrapData]
itemTrapTagData: Dict[str, SandboxV2ItemTrapTagData]
buildingItemData: Dict[str, SandboxV2BuildingItemData]
craftItemData: Dict[str, SandboxV2CraftItemData]
livestockProduceData: Dict[str, SandboxV2LivestockData]
craftGroupData: Dict[str, SandboxV2CraftGroupData]
alchemyRecipeData: Dict[str, SandboxV2AlchemyRecipeData]
drinkMatData: Dict[str, SandboxV2DrinkMatData]
foodMatData: Dict[str, SandboxV2FoodMatData]
foodData: Dict[str, SandboxV2FoodData]
nodeTypeData: Dict[str, SandboxV2NodeTypeData]
nodeUpgradeData: Dict[str, SandboxV2NodeUpgradeData]
weatherData: Dict[str, SandboxV2WeatherData]
stageData: Dict[str, SandboxV2StageData]
zoneData: Dict[str, SandboxV2ZoneData]
nodeBuffData: Dict[str, SandboxV2NodeBuffData]
rewardConfigData: SandboxV2RewardConfigGroupData
floatIconData: Dict[str, SandboxV2FloatIconData]
enemyRushTypeData: Dict[str, SandboxV2EnemyRushTypeData]
rushEnemyData: SandboxV2BattleRushEnemyData
gameConst: SandboxV2GameConst
basicConst: SandboxV2BasicConst
riftConst: SandboxV2RiftConst
developmentConst: SandboxV2DevelopmentConst
battleLoadingTips: List[TipData]
runeDatas: Dict[str, PackedRuneData]
itemRuneList: Union[Dict[str, List[LegacyInLevelRuneData]], None]
questData: Dict[str, SandboxV2QuestData]
npcData: Dict[str, SandboxV2NpcData]
dialogData: Dict[str, SandboxV2DialogData]
questLineData: Dict[str, SandboxV2QuestLineData]
questLineStoryData: Dict[str, str]
guideQuestData: Dict[str, SandboxV2GuideQuestData]
developmentData: Dict[str, SandboxV2DevelopmentData]
eventData: Dict[str, SandboxV2EventData]
eventSceneData: Dict[str, SandboxV2EventSceneData]
eventChoiceData: Dict[str, SandboxV2EventChoiceData]
expeditionData: Dict[str, SandboxV2ExpeditionData]
eventEffectData: Dict[str, SandboxV2EventEffectData]
shopGoodData: Dict[str, SandboxV2ShopGoodData]
shopDialogData: SandboxV2ShopDialogData
logisticsData: List[SandboxV2LogisticsData]
logisticsCharMapping: Dict[str, Dict[str, List[SandboxV2LogisticsCharData]]]
materialKeywordData: Dict[str, str]
monthRushData: List[SandboxV2MonthRushData]
riftTerrainParamData: Dict[str, SandboxV2RiftParamData]
riftClimateParamData: Dict[str, SandboxV2RiftParamData]
riftEnemyParamData: Dict[str, SandboxV2RiftParamData]
riftSubTargetData: Dict[str, SandboxV2RiftSubTargetData]
riftMainTargetData: Dict[str, SandboxV2RiftMainTargetData]
riftGlobalEffectData: Dict[str, SandboxV2RiftGlobalEffectData]
fixedRiftData: Dict[str, SandboxV2FixedRiftData]
riftTeamBuffData: Dict[str, List[SandboxV2RiftTeamBuffData]]
riftDifficultyData: Dict[str, SandboxV2RiftDifficultyData]
riftRewardDisplayData: Dict[str, List[str]]
enemyReplaceData: Dict[str, Dict[str, str]]
archiveQuestData: Dict[str, SandboxV2ArchiveQuestData]
achievementData: Dict[str, SandboxV2ArchiveAchievementData]
achievementTypeData: Dict[str, SandboxV2ArchiveAchievementTypeData]
archiveQuestTypeData: Dict[str, SandboxV2ArchiveQuestTypeData]
archiveMusicUnlockData: Dict[str, SandboxV2ArchiveMusicUnlockData]
baseUpdate: List[SandboxV2BaseUpdateData]
developmentLineSegmentDatas: List[SandboxV2DevelopmentLineSegmentData]
buildingNodeScoreData: Dict[str, SandboxV2BuildingNodeScoreData]
seasonData: Dict[str, SandboxV2SeasonData]
confirmIconData: List[SandboxV2ConfirmIconData]
shopUpdateTimeData: List[int]
tutorialData: SandboxV2TutorialData
class SandboxPermDetailData(BaseStruct):
SANDBOX_V2: Dict[str, SandboxV2Data]
class SandboxPermItemData(BaseStruct):
itemId: str
itemType: str
itemName: str
itemUsage: str
itemDesc: str
itemRarity: int
sortId: int
obtainApproach: str
class SandboxPermTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
basicInfo: Dict[str, SandboxPermBasicData]
detail: SandboxPermDetailData
itemData: Dict[str, SandboxPermItemData]

View File

@ -1,404 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class SandboxMapConstTable(BaseStruct):
directionNames: List[str]
homeNodeStageId: str
homeRushStageCode: str
homeRushStageName: str
homeRushDesc: str
crazyRevengeRushGroup: str
homeBuildModeBGM: str
class SandboxBaseConstTable(BaseStruct):
cookRegularCostItemId: str
cookRegularCostItemIdCnt: int
squadTabNameList: List[str]
charRarityColorList: List[str]
sumFoodLimitedCount: int
sumBuildingLimitedCount: int
sumTacticalLimitedCount: int
sumFoodMatLimitedCount: int
sumBuildingMatLimitedCount: int
sumStaminaPotLimitedCount: int
sumGoldLimitedCount: int
itemLimitedCount: int
blackBoxSlotCnt: int
scoutNodeUpgradeId: str
battleNodeUpgradeId: str
staminaPotCostOnce: int
staminaPotItemId: str
staminapotRedMinCnt: int
staminapotYellowMinCnt: int
staminapotGreenMinCnt: int
staminapotMaxPercentCnt: int
staminaPotActionPoint: int
goldItemId: str
toolboxSlotCapacity: int
toolboxSlotCnt: int
teamPopulationLimit: int
researchInformationDesc: str
settleFailDesc: str
settleAbortDesc: str
settleSucDesc: str
class TipData(BaseStruct):
tip: str
weight: Union[int, float]
category: str
class SandboxFoodProduceData(BaseStruct):
itemId: str
mainMaterialItems: List[str]
buffId: str
unlockDesc: str
class SandboxFoodmatBuffData(BaseStruct):
itemId: str
buffId: Union[str, None]
buffDesc: Union[str, None]
matType: str
sortId: int
class SandboxFoodStaminaData(BaseStruct):
itemId: str
potCnt: int
foodStaminaCnt: int
class SandboxBuildProduceData(BaseStruct):
itemProduceId: str
itemId: str
itemTypeText: str
materialItems: Dict[str, int]
class SandboxBuildGoldRatioData(BaseStruct):
itemId: str
ratio: int
effectDesc: str
class SandboxBuildingItemData(BaseStruct):
itemId: str
itemSubType: str
itemRarity: int
class SandboxBuildProduceUnlockData(BaseStruct):
itemId: str
buildingEffectDesc: str
buildingItemDesc: str
buildingUnlockDesc: str
class SandboxCraftItemData(BaseStruct):
itemId: str
sortId: int
getFrom: str
npcId: Union[str, None]
notObtainedDesc: str
itemType: str
class SandboxItemTrapData(BaseStruct):
itemId: str
trapId: str
trapPhase: int
trapLevel: int
skillIndex: int
skillLevel: int
class SandboxDevelopmentData(BaseStruct):
buffId: str
positionX: int
positionY: int
frontNodeId: Union[str, None]
nextNodeIds: Union[List[str], None]
buffLimitedId: str
tokenCost: int
canBuffResearch: bool
buffResearchDesc: Union[str, None]
buffName: str
buffIconId: str
nodeTitle: str
buffEffectDesc: str
class SandboxDevelopmentLimitData(BaseStruct):
buffLimitedId: str
positionX: int
buffCostLimitedCount: int
class SandboxItemToastData(BaseStruct):
itemType: str
toastDesc: str
color: str
class SandboxDevelopmentLineSegmentData(BaseStruct):
fromNodeId: str
passingNodeIds: List[str]
fromAxisPosX: int
fromAxisPosY: int
toAxisPosX: int
toAxisPosY: int
class SandboxRewardItemConfigData(BaseStruct):
rewardItem: str
rewardType: str
class SandboxRewardData(BaseStruct):
rewardList: List[SandboxRewardItemConfigData]
class SandboxRewardCommonConfig(BaseStruct):
rewardItemId: str
rewardItemType: str
count: int
dropType: Union[int, None] = None
class SandboxTrapRewardConfigData(SandboxRewardCommonConfig):
dropType: int
class SandboxRewardConfigGroupData(BaseStruct):
stagePreviewRewardDict: Dict[str, SandboxRewardData]
stageDefaultPreviewRewardDict: Dict[str, SandboxRewardData]
rushPreviewRewardDict: Dict[str, SandboxRewardData]
stageRewardDict: Dict[str, SandboxRewardData]
rushRewardDict: Dict[str, SandboxRewardData]
trapRewardDict: Dict[str, SandboxRewardCommonConfig]
enemyRewardDict: Dict[str, SandboxRewardCommonConfig]
keyWordData: Dict[str, str]
class SandboxStaminaData(BaseStruct):
levelUpperLimit: int
staminaUpperLimit: int
class SandboxNodeTypeData(BaseStruct):
nodeType: str
name: str
subName: str
iconId: str
class SandboxNodeUpgradeData(BaseStruct):
nodeUpdradeId: str
name: str
description: str
upgradeDesc: str
itemType: str
itemSubType: str
itemCnt: int
itemRarity: int
class SandboxWeatherData(BaseStruct):
weatherId: str
weatherType: str
weatherLevel: int
name: str
description: str
weatherTypeName: str
weatherTypeIconId: str
functionDesc: str
buffId: str
class SandboxStageData(BaseStruct):
stageId: str
levelId: str
code: str
name: str
loadingPicId: str
description: str
actionCost: int
powerCost: int
class SandboxEventData(BaseStruct):
eventSceneId: str
hasThumbtack: bool
class SandboxEventSceneData(BaseStruct):
choiceSceneId: str
type_: str = field(name="type")
title: str
description: str
choices: List[str]
class SandboxEventChoiceData(BaseStruct):
choiceId: str
type_: str = field(name="type")
costAction: int
finishScene: bool
title: str
description: str
class SandboxEventTypeData(BaseStruct):
eventType: str
iconId: str
class SandboxMissionData(BaseStruct):
missionId: str
desc: str
effectDesc: Union[str, None]
costAction: int
charCnt: int
professionIds: List[str]
profession: int
costStamina: int
class SandboxUnitData(BaseStruct):
id_: str = field(name="id")
name: str
class SandboxDailyDescTemplateData(BaseStruct):
type_: str = field(name="type")
templateDesc: List[str]
class RushEnemyConfig(BaseStruct):
enemyKey: str
branchId: str
count: int
interval: Union[int, float]
class RushEnemyGroupConfig(BaseStruct):
enemyGroupKey: str
weight: int
enemy: List[RushEnemyConfig]
dynamicEnemy: List[str]
class RushEnemyGroupRushEnemyDBRef(BaseStruct):
id_: str = field(name="id")
level: int
class RushEnemyGroup(BaseStruct):
rushEnemyGroupConfigs: Dict[str, List[RushEnemyGroupConfig]]
rushEnemyDbRef: List[RushEnemyGroupRushEnemyDBRef]
class RuneDataSelector(BaseStruct):
professionMask: int
buildableMask: int
charIdFilter: Union[List[str], None]
enemyIdFilter: Union[List[str], None]
enemyIdExcludeFilter: Union[List[str], None]
skillIdFilter: Union[List[str], None]
tileKeyFilter: Union[List[str], None]
groupTagFilter: Union[List[str], None]
filterTagFilter: Union[List[str], None]
subProfessionExcludeFilter: Union[List[str], None]
class Blackboard(BaseStruct):
key: str
value: Union[Union[int, float], None] = None
valueStr: Union[str, None] = None
class RuneData(BaseStruct):
key: str
selector: RuneDataSelector
blackboard: List[Blackboard]
class RuneTablePackedRuneData(BaseStruct):
id_: str = field(name="id")
points: Union[int, float]
mutexGroupKey: Union[str, None]
description: str
runes: List[RuneData]
class LegacyInLevelRuneData(BaseStruct):
difficultyMask: int
key: str
professionMask: int
buildableMask: int
blackboard: List[Blackboard]
class SandboxActTable(BaseStruct):
mapConstTable: SandboxMapConstTable
baseConstTable: SandboxBaseConstTable
battleLoadingTips: List[TipData]
foodProduceDatas: Dict[str, SandboxFoodProduceData]
foodmatDatas: Dict[str, SandboxFoodmatBuffData]
foodmatBuffDatas: Dict[str, SandboxFoodmatBuffData]
foodStaminaDatas: Dict[str, SandboxFoodStaminaData]
buildProduceDatas: Dict[str, SandboxBuildProduceData]
buildGoldRatioDatas: List[SandboxBuildGoldRatioData]
buildingItemDatas: Dict[str, SandboxBuildingItemData]
buildProduceUnlockDatas: Dict[str, SandboxBuildProduceUnlockData]
craftItemDatas: Dict[str, SandboxCraftItemData]
itemTrapDatas: Dict[str, SandboxItemTrapData]
trapDeployLimitDatas: Dict[str, int]
developmentDatas: Dict[str, SandboxDevelopmentData]
developmentLimitDatas: Dict[str, SandboxDevelopmentLimitData]
itemToastDatas: Dict[str, SandboxItemToastData]
developmentLineSegmentDatas: List[SandboxDevelopmentLineSegmentData]
rewardConfigDatas: SandboxRewardConfigGroupData
charStaminaMapping: Dict[str, Dict[str, List[SandboxStaminaData]]]
nodeTypeDatas: Dict[str, SandboxNodeTypeData]
nodeUpgradeDatas: Dict[str, SandboxNodeUpgradeData]
weatherDatas: Dict[str, SandboxWeatherData]
stageDatas: Dict[str, SandboxStageData]
eventDatas: Dict[str, SandboxEventData]
eventSceneDatas: Dict[str, SandboxEventSceneData]
eventChoiceDatas: Dict[str, SandboxEventChoiceData]
eventTypeDatas: Dict[str, SandboxEventTypeData]
missionDatas: Dict[str, SandboxMissionData]
unitData: Dict[str, SandboxUnitData]
dailyDescTemplateDatas: Dict[str, SandboxDailyDescTemplateData]
rushAvgDict: Dict[str, str]
rushEnemyGroup: RushEnemyGroup
runeDatas: Dict[str, RuneTablePackedRuneData]
itemRuneList: Dict[str, List[LegacyInLevelRuneData]]
class SandboxItemData(BaseStruct):
itemId: str
itemType: str
itemName: str
itemUsage: str
itemDesc: str
itemRarity: int
sortId: int
recommendTypeList: Union[List[str], None]
recommendPriority: int
obtainApproach: str
class SandboxTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
sandboxActTables: Dict[str, SandboxActTable]
itemDatas: Dict[str, SandboxItemData]

View File

@ -1,161 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class ShopRecommendData(BaseStruct):
imgId: str
slotIndex: int
cmd: str
param1: Union[str, None]
param2: Union[str, None]
skinId: Union[str, None]
class ShopRecommendGroup(BaseStruct):
recommendGroup: List[int]
dataList: List[ShopRecommendData]
class ShopKeeperWord(BaseStruct):
id_: str = field(name="id")
text: str
class ShopRecommendTemplateNormalGiftParam(BaseStruct):
showStartTs: int
showEndTs: int
goodId: str
giftPackageName: str
price: int
logoId: str
color: str
haveMark: bool
availCount: int
class ShopRecommendTemplateNormalSkinParam(BaseStruct):
showStartTs: int
showEndTs: int
skinIds: List[str]
skinGroupName: str
brandIconId: str
colorBack: str
colorText: str
text: str
class ShopRecommendTemplateNormalFurnParam(BaseStruct):
showStartTs: int
showEndTs: int
furnPackId: str
isNew: bool
isPackSell: bool
count: int
colorBack: str
colorText: str
actId: Union[str, None] = None
class ShopRecommendTemplateReturnSkinParam(BaseStruct):
showStartTs: int
showEndTs: int
class ShopRecommendTemplateParam(BaseStruct):
normalGiftParam: Union[ShopRecommendTemplateNormalGiftParam, None] = None
normalSkinParam: Union[ShopRecommendTemplateNormalSkinParam, None] = None
normalFurnParam: Union[ShopRecommendTemplateNormalFurnParam, None] = None
returnSkinParam: Union[ShopRecommendTemplateReturnSkinParam, None] = None
class ShopRecommendItem(BaseStruct):
tagId: str
displayType: str
tagName: str
itemTag: str
orderNum: int
startDatetime: int
endDatetime: int
groupList: List[ShopRecommendGroup]
tagWord: ShopKeeperWord
templateType: str
templateParam: Union[ShopRecommendTemplateParam, None]
class ShopCreditUnlockItem(BaseStruct):
sortId: int
unlockNum: int
charId: str
class ShopCreditUnlockGroup(BaseStruct):
id_: str = field(name="id")
index: str
startDateTime: int
charDict: List[ShopCreditUnlockItem]
class ShopClientDataShopKeeperData(BaseStruct):
welcomeWords: List[ShopKeeperWord]
clickWords: List[ShopKeeperWord]
class ShopCarouselDataItem(BaseStruct):
spriteId: str
startTime: int
endTime: int
cmd: str
param1: Union[str, None]
skinId: str
furniId: str
class ShopCarouselData(BaseStruct):
items: List[ShopCarouselDataItem]
class ChooseShopRelation(BaseStruct):
goodId: str
optionList: List[str]
class ShopClientGPData(BaseStruct):
goodId: str
displayName: str
condTrigPackageType: str
class LMTGSShopSchedule(BaseStruct):
gachaPoolId: str
LMTGSId: str
iconColor: str
iconBackColor: str
startTime: int
endTime: int
storeTextColor: Union[str, None] = None
class LMTGSShopOverlaySchedule(BaseStruct):
gachaPoolId1: str
gachaPoolId2: str
picId: str
class ShopClientTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
recommendList: List[ShopRecommendItem]
creditUnlockGroup: Dict[str, ShopCreditUnlockGroup]
shopKeeperData: ShopClientDataShopKeeperData
carousels: List[ShopCarouselData]
chooseShopRelations: List[ChooseShopRelation]
shopUnlockDict: Dict[str, str]
extraQCShopRule: List[str]
repQCShopRule: List[str]
shopGPDataDict: Dict[str, ShopClientGPData]
shopMonthlySubGoodId: str
ls: List[LMTGSShopSchedule]
os: List[LMTGSShopOverlaySchedule]

View File

@ -1,51 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class SpData(BaseStruct):
spType: int
levelUpCost: Union[List[ItemBundle], None]
maxChargeTime: int
spCost: int
initSp: int
increment: Union[int, float]
class Blackboard(BaseStruct):
key: str
value: Union[Union[int, float], None] = None
valueStr: Union[str, None] = None
class SkillDataBundleLevelData(BaseStruct):
name: str
rangeId: Union[str, None]
description: Union[str, None]
skillType: int
durationType: int
spData: SpData
prefabId: Union[str, None]
duration: Union[int, float]
blackboard: List[Blackboard]
class SkillDataBundle(BaseStruct):
skillId: str
iconId: Union[str, None]
hidden: bool
levels: List[SkillDataBundleLevelData]
class SkillTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
skills: Dict[str, SkillDataBundle]

View File

@ -1,91 +0,0 @@
from typing import Dict, List, Union
from ..common import BaseStruct
class CharSkinDataTokenSkinInfo(BaseStruct):
tokenId: str
tokenSkinId: str
class CharSkinDataBattleSkin(BaseStruct):
overwritePrefab: bool
skinOrPrefabId: Union[str, None]
class CharSkinDataDisplaySkin(BaseStruct):
skinName: Union[str, None]
colorList: Union[List[str], None]
titleList: Union[List[str], None]
modelName: Union[str, None]
drawerList: Union[List[str], None]
designerList: Union[List[str], None]
skinGroupId: Union[str, None]
skinGroupName: Union[str, None]
skinGroupSortIndex: int
content: Union[str, None]
dialog: Union[str, None]
usage: Union[str, None]
description: Union[str, None]
obtainApproach: Union[str, None]
sortId: int
displayTagId: Union[str, None]
getTime: int
onYear: int
onPeriod: int
class CharSkinData(BaseStruct):
skinId: str
charId: str
tokenSkinMap: Union[List[CharSkinDataTokenSkinInfo], None]
illustId: Union[str, None]
dynIllustId: Union[str, None]
avatarId: str
portraitId: Union[str, None]
dynPortraitId: Union[str, None]
dynEntranceId: Union[str, None]
buildingId: Union[str, None]
battleSkin: CharSkinDataBattleSkin
isBuySkin: bool
tmplId: Union[str, None]
voiceId: Union[str, None]
voiceType: str
displaySkin: CharSkinDataDisplaySkin
class CharSkinGroupInfo(BaseStruct):
skinGroupId: str
publishTime: int
class CharSkinKvImgInfo(BaseStruct):
kvImgId: str
linkedSkinGroupId: str
class CharSkinBrandInfo(BaseStruct):
brandId: str
groupList: List[CharSkinGroupInfo]
kvImgIdList: List[CharSkinKvImgInfo]
brandName: str
brandCapitalName: str
description: str
publishTime: int
sortId: int
class SpecialSkinInfo(BaseStruct):
skinId: str
startTime: int
endTime: int
class SkinTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
charSkins: Dict[str, CharSkinData]
buildinEvolveMap: Dict[str, Dict[str, str]]
buildinPatchMap: Dict[str, Dict[str, str]]
brandList: Dict[str, CharSkinBrandInfo]
specialSkinInfoList: List[SpecialSkinInfo]

View File

@ -1,263 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class StageDataConditionDesc(BaseStruct):
stageId: str
completeState: int
class StageDataDisplayRewards(BaseStruct):
type_: str = field(name="type")
id_: str = field(name="id")
dropType: int
class StageDataDisplayDetailRewards(BaseStruct):
occPercent: int
type_: str = field(name="type")
id_: str = field(name="id")
dropType: int
class StageDataStageDropInfo(BaseStruct):
firstPassRewards: None
firstCompleteRewards: None
passRewards: None
completeRewards: None
displayRewards: List[StageDataDisplayRewards]
displayDetailRewards: List[StageDataDisplayDetailRewards]
class ExtraCondition(BaseStruct):
index: int
template: str
unlockParam: List[str]
class ProgressInfo(BaseStruct):
progressType: str
descList: Union[Dict[str, str], None]
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class ExtraInfo(BaseStruct):
stageId: str
rewards: List[ItemBundle]
progressInfo: ProgressInfo
class StageData(BaseStruct):
stageType: str
difficulty: str
performanceStageFlag: str
diffGroup: str
unlockCondition: List[StageDataConditionDesc]
stageId: str
levelId: Union[str, None]
zoneId: str
code: str
name: Union[str, None]
description: Union[str, None]
hardStagedId: Union[str, None]
dangerLevel: Union[str, None]
dangerPoint: Union[int, float]
loadingPicId: str
canPractice: bool
canBattleReplay: bool
apCost: int
apFailReturn: int
etItemId: Union[str, None]
etCost: int
etFailReturn: int
etButtonStyle: Union[str, None]
apProtectTimes: int
diamondOnceDrop: int
practiceTicketCost: int
dailyStageDifficulty: int
expGain: int
goldGain: int
loseExpGain: int
loseGoldGain: int
passFavor: int
completeFavor: int
slProgress: int
displayMainItem: Union[str, None]
hilightMark: bool
bossMark: bool
isPredefined: bool
isHardPredefined: bool
isSkillSelectablePredefined: bool
isStoryOnly: bool
appearanceStyle: int
stageDropInfo: StageDataStageDropInfo
startButtonOverrideId: Union[str, None]
isStagePatch: bool
mainStageId: Union[str, None]
canContinuousBattle: Union[bool, None] = None
canUseCharm: Union[bool, None] = None
canUseTech: Union[bool, None] = None
canUseTrapTool: Union[bool, None] = None
canUseBattlePerformance: Union[bool, None] = None
extraCondition: Union[List[ExtraCondition], None] = None
extraInfo: Union[List[ExtraInfo], None] = None
class RuneStageGroupDataRuneStageInst(BaseStruct):
stageId: str
activePackedRuneIds: List[str]
class RuneStageGroupData(BaseStruct):
groupId: str
activeRuneStages: List[RuneStageGroupDataRuneStageInst]
startTs: int
endTs: int
class MapThemeData(BaseStruct):
themeId: str
unitColor: str
buildableColor: Union[str, None]
themeType: Union[str, None]
trapTintColor: Union[str, None]
class TileAppendInfo(BaseStruct):
tileKey: str
name: str
description: str
isFunctional: bool
class WeeklyForceOpenTable(BaseStruct):
id_: str = field(name="id")
startTime: int
endTime: int
forceOpenList: List[str]
class TimelyDropTimeInfo(BaseStruct):
startTs: int
endTs: int
stagePic: Union[str, None]
dropPicId: Union[str, None]
stageUnlock: str
entranceDownPicId: Union[str, None]
entranceUpPicId: Union[str, None]
timelyGroupId: str
weeklyPicId: Union[str, None]
apSupplyOutOfDateDict: Dict[str, int]
class OverrideDropInfo(BaseStruct):
itemId: str
startTs: int
endTs: int
zoneRange: str
times: int
name: str
egName: str
desc1: str
desc2: str
desc3: str
dropTag: str
dropTypeDesc: str
dropInfo: Dict[str, StageDataStageDropInfo]
class TimelyDropInfo(BaseStruct):
dropInfo: Dict[str, StageDataStageDropInfo]
class StageValidInfo(BaseStruct):
startTs: int
endTs: int
class StageFogInfo(BaseStruct):
lockId: str
fogType: str
stageId: str
lockName: str
lockDesc: str
unlockItemId: str
unlockItemType: str
unlockItemNum: int
preposedStageId: str
preposedLockId: Union[str, None]
class StageStartCondRequireChar(BaseStruct):
charId: str
evolvePhase: int
class StageStartCond(BaseStruct):
requireChars: List[StageStartCondRequireChar]
excludeAssists: List[str]
isNotPass: bool
class StageDiffGroupTable(BaseStruct):
normalId: str
toughId: Union[str, None]
easyId: str
class StoryStageShowGroup(BaseStruct):
displayRecordId: str
stageId: str
accordingStageId: Union[str, None]
diffGroup: int
class SpecialBattleFinishStageData(BaseStruct):
stageId: str
skipAccomplishPerform: bool
class RecordRewardServerData(BaseStruct):
stageId: str
rewards: List[ItemBundle]
class ApProtectZoneInfoTimeRange(BaseStruct):
startTs: int
endTs: int
class ApProtectZoneInfo(BaseStruct):
zoneId: str
timeRanges: List[ApProtectZoneInfoTimeRange]
class StageTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
stages: Dict[str, StageData]
runeStageGroups: Dict[str, RuneStageGroupData]
mapThemes: Dict[str, MapThemeData]
tileInfo: Dict[str, TileAppendInfo]
forceOpenTable: Dict[str, WeeklyForceOpenTable]
timelyStageDropInfo: Dict[str, TimelyDropTimeInfo]
overrideDropInfo: Dict[str, OverrideDropInfo]
timelyTable: Dict[str, TimelyDropInfo]
stageValidInfo: Dict[str, StageValidInfo]
stageFogInfo: Dict[str, StageFogInfo]
stageStartConds: Dict[str, StageStartCond]
diffGroupTable: Dict[str, StageDiffGroupTable]
storyStageShowGroup: Dict[str, Dict[str, StoryStageShowGroup]]
specialBattleFinishStageData: Dict[str, SpecialBattleFinishStageData]
recordRewardData: Union[Dict[str, RecordRewardServerData], None]
apProtectZoneInfo: Dict[str, ApProtectZoneInfo]
actCustomStageDatas: Dict[str, Dict[str, str]]
spNormalStageIdFor4StarList: List[str]

View File

@ -1,236 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class MiniActTrialDataRuleData(BaseStruct):
ruleType: str
ruleText: str
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class MiniActTrialDataMiniActTrialRewardData(BaseStruct):
trialRewardId: str
orderId: int
actId: str
targetStoryCount: int
item: ItemBundle
class MiniActTrialDataMiniActTrialSingleData(BaseStruct):
actId: str
rewardStartTime: int
themeColor: str
rewardList: List[MiniActTrialDataMiniActTrialRewardData]
class MiniActTrialData(BaseStruct):
preShowDays: int
ruleDataList: List[MiniActTrialDataRuleData]
miniActTrialDataMap: Dict[str, MiniActTrialDataMiniActTrialSingleData]
class ActArchiveResDataPicArchiveResItemData(BaseStruct):
id_: str = field(name="id")
desc: str
assetPath: str
type_: str = field(name="type")
subType: Union[str, None]
picDescription: str
kvId: Union[str, None]
class ActArchiveResDataAudioArchiveResItemData(BaseStruct):
id_: str = field(name="id")
desc: str
name: str
class ActArchiveResDataAvgArchiveResItemData(BaseStruct):
id_: str = field(name="id")
desc: str
breifPath: Union[str, None]
contentPath: str
imagePath: str
rawBrief: Union[str, None]
titleIconPath: Union[str, None]
class ActArchiveResDataStoryArchiveResItemData(BaseStruct):
id_: str = field(name="id")
desc: str
date: Union[str, None]
pic: str
text: str
titlePic: Union[str, None]
class ActArchiveResDataNewsFormatData(BaseStruct):
typeId: str
typeName: str
typeLogo: str
typeMainLogo: str
typeMainSealing: str
class ActArchiveResDataActivityNewsLine(BaseStruct):
lineType: int
content: str
class ActArchiveResDataNewsArchiveResItemData(BaseStruct):
id_: str = field(name="id")
desc: str
newsType: str
newsFormat: ActArchiveResDataNewsFormatData
newsText: str
newsAuthor: str
paramP0: int
paramK: int
paramR: float
newsLines: List[ActArchiveResDataActivityNewsLine]
class ActArchiveResDataLandmarkArchiveResItemData(BaseStruct):
landmarkId: str
landmarkName: str
landmarkPic: str
landmarkDesc: str
landmarkEngName: str
class ActArchiveResDataLogArchiveResItemData(BaseStruct):
logId: str
logDesc: str
class ActArchiveResDataChallengeBookArchiveResItemData(BaseStruct):
storyId: str
titleName: str
storyName: str
textId: str
class ActArchiveResData(BaseStruct):
pics: Dict[str, ActArchiveResDataPicArchiveResItemData]
audios: Dict[str, ActArchiveResDataAudioArchiveResItemData]
avgs: Dict[str, ActArchiveResDataAvgArchiveResItemData]
stories: Dict[str, ActArchiveResDataStoryArchiveResItemData]
news: Dict[str, ActArchiveResDataNewsArchiveResItemData]
landmarks: Dict[str, ActArchiveResDataLandmarkArchiveResItemData]
logs: Dict[str, ActArchiveResDataLogArchiveResItemData]
challengeBooks: Dict[str, ActArchiveResDataChallengeBookArchiveResItemData]
class ActArchiveTimelineItemData(BaseStruct):
timelineId: str
timelineSortId: int
timelineTitle: str
timelineDes: str
picIdList: Union[List[str], None] = None
audioIdList: Union[List[str], None] = None
avgIdList: Union[List[str], None] = None
storyIdList: Union[List[str], None] = None
newsIdList: Union[List[str], None] = None
class ActArchiveTimelineData(BaseStruct):
timelineList: List[ActArchiveTimelineItemData]
class ActArchiveMusicItemData(BaseStruct):
musicId: str
musicSortId: int
class ActArchiveMusicData(BaseStruct):
musics: Dict[str, ActArchiveMusicItemData]
class ActArchivePicItemData(BaseStruct):
picId: str
picSortId: int
class ActArchivePicData(BaseStruct):
pics: Dict[str, ActArchivePicItemData]
class ActArchiveStoryItemData(BaseStruct):
storyId: str
storySortId: int
class ActArchiveStoryData(BaseStruct):
stories: Dict[str, ActArchiveStoryItemData]
class ActArchiveAvgItemData(BaseStruct):
avgId: str
avgSortId: int
class ActArchiveAvgData(BaseStruct):
avgs: Dict[str, ActArchiveAvgItemData]
class ActArchiveNewsItemData(BaseStruct):
newsId: str
newsSortId: int
class ActArchiveNewsData(BaseStruct):
news: Dict[str, ActArchiveNewsItemData]
class ActArchiveLandmarkItemData(BaseStruct):
landmarkId: str
landmarkSortId: int
class ActArchiveChapterLogData(BaseStruct):
chapterName: str
displayId: str
unlockDes: str
logs: List[str]
chapterIcon: str
class ActArchiveChallengeBookItemData(BaseStruct):
storyId: str
sortId: int
class ActArchiveChallengeBookData(BaseStruct):
stories: Dict[str, ActArchiveChallengeBookItemData]
class ActArchiveComponentData(BaseStruct):
pic: Union[ActArchivePicData, None] = None
timeline: Union[ActArchiveTimelineData, None] = None
music: Union[ActArchiveMusicData, None] = None
story: Union[ActArchiveStoryData, None] = None
avg: Union[ActArchiveAvgData, None] = None
news: Union[ActArchiveNewsData, None] = None
landmark: Union[Dict[str, ActArchiveLandmarkItemData], None] = None
log: Union[Dict[str, ActArchiveChapterLogData], None] = None
challengeBook: Union[ActArchiveChallengeBookData, None] = None
class ActArchiveComponentTable(BaseStruct):
components: Dict[str, ActArchiveComponentData]
class StoryReviewMetaTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
miniActTrialData: MiniActTrialData
actArchiveResData: ActArchiveResData
actArchiveData: ActArchiveComponentTable

View File

@ -1,65 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class StoryDataConditionStageCondition(BaseStruct):
stageId: str
minState: int
maxState: int
class StoryReviewInfoClientData(BaseStruct):
storyReviewType: int
storyId: str
storyGroup: str
storySort: int
storyDependence: Union[str, None]
storyCanShow: int
storyCode: Union[str, None]
storyName: str
storyPic: Union[str, None]
storyInfo: str
storyCanEnter: int
storyTxt: str
avgTag: str
unLockType: str
costItemType: str
costItemId: Union[str, None]
costItemCount: int
stageCount: int
requiredStages: Union[List[StoryDataConditionStageCondition], None]
class StoryReviewGroupClientData(BaseStruct):
id_: str = field(name="id")
name: str
entryType: str
actType: str
startTime: int
endTime: int
startShowTime: int
endShowTime: int
remakeStartTime: int
remakeEndTime: int
storyEntryPicId: Union[str, None]
storyPicId: Union[str, None]
storyMainColor: Union[str, None]
customType: int
storyCompleteMedalId: Union[str, None]
rewards: Union[List[ItemBundle], None]
infoUnlockDatas: List[StoryReviewInfoClientData]
class StoryReviewTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
storyreviewtable: Dict[str, StoryReviewGroupClientData]

View File

@ -1,51 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class StoryDataTrigger(BaseStruct):
type_: str = field(name="type")
key: Union[str, None]
useRegex: bool
class StoryDataConditionStageCondition(BaseStruct):
stageId: str
minState: int
maxState: int
class StoryDataCondition(BaseStruct):
minProgress: int
maxProgress: int
minPlayerLevel: int
requiredFlags: List[str]
excludedFlags: List[str]
requiredStages: List[StoryDataConditionStageCondition]
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class StoryData(BaseStruct):
id_: str = field(name="id")
needCommit: bool
repeatable: bool
disabled: bool
videoResource: bool
trigger: StoryDataTrigger
condition: Union[StoryDataCondition, None]
setProgress: int
setFlags: Union[List[str], None]
completedRewards: Union[List[ItemBundle], None]
class StoryTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
stories: Dict[str, StoryData]

View File

@ -1,40 +0,0 @@
from typing import List, Union
from msgspec import field
from ..common import BaseStruct
class RuneDataSelector(BaseStruct):
professionMask: int
buildableMask: int
charIdFilter: Union[List[str], None]
enemyIdFilter: Union[List[str], None]
skillIdFilter: Union[List[str], None]
tileKeyFilter: Union[List[str], None]
class Blackboard(BaseStruct):
key: str
value: Union[float, None] = None
valueStr: Union[str, None] = None
class RuneData(BaseStruct):
key: str
selector: RuneDataSelector
blackboard: List[Blackboard]
class PackedRuneData(BaseStruct):
id_: str = field(name="id")
points: float
mutexGroupKey: Union[str, None]
description: str
runes: List[RuneData]
class TechBuffTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
runes: List[PackedRuneData]

View File

@ -1,23 +0,0 @@
from typing import List
from ..common import BaseStruct
class TipData(BaseStruct):
tip: str
weight: float
category: str
class WorldViewTip(BaseStruct):
title: str
description: str
backgroundPicId: str
weight: float
class TipTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
tips: List[TipData]
worldViewTips: List[WorldViewTip]

View File

@ -1,176 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class CharacterDataUnlockCondition(BaseStruct):
phase: int
level: int
class Blackboard(BaseStruct):
key: str
value: Union[float, None] = None
valueStr: Union[str, None] = None
class CharacterDataTraitData(BaseStruct):
unlockCondition: CharacterDataUnlockCondition
requiredPotentialRank: int
blackboard: List[Blackboard]
overrideDescripton: Union[str, None]
prefabKey: Union[str, None]
rangeId: Union[str, None]
class CharacterDataTraitDataBundle(BaseStruct):
candidates: List[CharacterDataTraitData]
class AttributesData(BaseStruct):
maxHp: int
atk: int
def_: int = field(name="def")
magicResistance: float
cost: int
blockCnt: int
moveSpeed: float
attackSpeed: float
baseAttackTime: float
respawnTime: int
hpRecoveryPerSec: float
spRecoveryPerSec: float
maxDeployCount: int
maxDeckStackCnt: int
tauntLevel: int
massLevel: int
baseForceLevel: int
stunImmune: bool
silenceImmune: bool
sleepImmune: bool
frozenImmune: bool
levitateImmune: bool
disarmedCombatImmune: bool
class CharacterDataAttributesKeyFrame(BaseStruct):
level: int
data: AttributesData
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class CharacterDataPhaseData(BaseStruct):
characterPrefabKey: str
rangeId: Union[str, None]
maxLevel: int
attributesKeyFrames: List[CharacterDataAttributesKeyFrame]
evolveCost: Union[List[ItemBundle], None]
class CharacterDataMainSkillSpecializeLevelData(BaseStruct):
unlockCond: CharacterDataUnlockCondition
lvlUpTime: int
levelUpCost: Union[List[ItemBundle], None]
class CharacterDataMainSkill(BaseStruct):
skillId: Union[str, None]
overridePrefabKey: Union[str, None]
overrideTokenKey: Union[str, None]
levelUpCostCond: List[CharacterDataMainSkillSpecializeLevelData]
unlockCond: CharacterDataUnlockCondition
class TalentData(BaseStruct):
unlockCondition: CharacterDataUnlockCondition
requiredPotentialRank: int
prefabKey: str
name: Union[str, None]
description: Union[str, None]
rangeId: Union[str, None]
blackboard: List[Blackboard]
class CharacterDataTalentDataBundle(BaseStruct):
candidates: Union[List[TalentData], None]
class AttributeModifierDataAttributeModifier(BaseStruct):
attributeType: int
formulaItem: int
value: float
loadFromBlackboard: bool
fetchBaseValueFromSourceEntity: bool
class AttributeModifierData(BaseStruct):
abnormalFlags: Union[List[str], None]
abnormalImmunes: Union[List[str], None]
abnormalAntis: Union[List[str], None]
abnormalCombos: Union[List[str], None]
abnormalComboImmunes: Union[List[str], None]
attributeModifiers: List[AttributeModifierDataAttributeModifier]
class ExternalBuff(BaseStruct):
attributes: AttributeModifierData
class CharacterDataPotentialRank(BaseStruct):
type_: int = field(name="type")
description: str
buff: Union[ExternalBuff, None]
equivalentCost: Union[ItemBundle, None]
class CharacterDataSkillLevelCost(BaseStruct):
unlockCond: CharacterDataUnlockCondition
lvlUpCost: Union[List[ItemBundle], None]
class TokenCharacterData(BaseStruct):
name: str
description: Union[str, None]
canUseGeneralPotentialItem: bool
canUseActivityPotentialItem: bool
potentialItemId: Union[str, None]
activityPotentialItemId: Union[str, None]
nationId: Union[str, None]
groupId: Union[str, None]
teamId: Union[str, None]
displayNumber: Union[str, None]
appellation: str
position: str
tagList: Union[List[str], None]
itemUsage: Union[str, None]
itemDesc: Union[str, None]
itemObtainApproach: Union[str, None]
isNotObtainable: bool
isSpChar: bool
maxPotentialLevel: int
rarity: int
profession: str
subProfessionId: str
trait: Union[CharacterDataTraitDataBundle, None]
phases: List[CharacterDataPhaseData]
skills: Union[List[CharacterDataMainSkill], None]
talents: Union[List[CharacterDataTalentDataBundle], None]
potentialRanks: Union[List[CharacterDataPotentialRank], None]
favorKeyFrames: Union[List[CharacterDataAttributesKeyFrame], None]
allSkillLvlup: Union[List[CharacterDataSkillLevelCost], None]
minPowerId: str
maxPowerId: str
tokenKey: Union[str, None] = None
class TokenTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
tokens: Dict[str, TokenCharacterData]

View File

@ -1,67 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class UnlockCondition(BaseStruct):
phase: int
level: int
class TraitDescBundle(BaseStruct):
unlockCondition: UnlockCondition
requiredPotentialRank: int
overrideDescription: None
additiveDescription: str
class UniEquipData(BaseStruct):
uniEquipId: str
uniEquipName: str
uniEquipIcon: str
uniEquipDesc: str
typeIcon: str
typeName: str
showEvolvePhase: int
unlockEvolvePhase: int
charId: str
tmplId: None
showLevel: int
unlockLevel: int
unlockFavorPercent: int
missionList: List[str]
itemCost: Union[List[ItemBundle], None]
type_: str = field(name="type")
traitDescBundle: List[TraitDescBundle]
class UniEquipMissionData(BaseStruct):
template: Union[str, None]
desc: Union[str, None]
paramList: List[str]
uniEquipMissionId: str
uniEquipMissionSort: int
uniEquipId: str
class SubProfessionData(BaseStruct):
subProfessionId: str
subProfessionName: str
subProfessionCatagory: int
class UniequipData(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
equipDict: Dict[str, UniEquipData]
missionList: Dict[str, UniEquipMissionData]
subProfDict: Dict[str, SubProfessionData]
charEquip: Dict[str, List[str]]

View File

@ -1,70 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class UniEquipData(BaseStruct):
uniEquipId: str
uniEquipName: str
uniEquipIcon: str
uniEquipDesc: str
typeIcon: str
typeName1: str
typeName2: Union[str, None]
equipShiningColor: str
showEvolvePhase: int
unlockEvolvePhase: int
charId: str
tmplId: Union[str, None]
showLevel: int
unlockLevel: int
unlockFavorPoint: int
missionList: List[str]
itemCost: Union[Dict[str, List[ItemBundle]], None]
type_: str = field(name="type")
uniEquipGetTime: int
charEquipOrder: int
class UniEquipMissionData(BaseStruct):
template: str
desc: str
paramList: List[str]
uniEquipMissionId: str
uniEquipMissionSort: int
uniEquipId: str
jumpStageId: Union[str, None]
class SubProfessionData(BaseStruct):
subProfessionId: str
subProfessionName: str
subProfessionCatagory: int
class UniEquipTrack(BaseStruct):
charId: str
equipId: str
class UniEquipTimeInfo(BaseStruct):
timeStamp: int
trackList: List[UniEquipTrack]
class UniEquipTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
equipDict: Dict[str, UniEquipData]
missionList: Dict[str, UniEquipMissionData]
subProfDict: Dict[str, SubProfessionData]
charEquip: Dict[str, List[str]]
equipTrackDict: List[UniEquipTimeInfo]

View File

@ -1,112 +0,0 @@
from typing import Dict, List, Union
from msgspec import field
from ..common import BaseStruct
class ZoneData(BaseStruct):
zoneID: str
zoneIndex: int
type_: str = field(name="type")
zoneNameFirst: Union[str, None]
zoneNameSecond: Union[str, None]
zoneNameTitleCurrent: Union[str, None]
zoneNameTitleUnCurrent: Union[str, None]
zoneNameTitleEx: Union[str, None]
zoneNameThird: Union[str, None]
lockedText: Union[str, None]
canPreview: bool
class WeeklyZoneData(BaseStruct):
daysOfWeek: List[int]
type_: str = field(name="type")
class ZoneValidInfo(BaseStruct):
startTs: int
endTs: int
class MainlineZoneData(BaseStruct):
zoneId: str
chapterId: str
preposedZoneId: Union[str, None]
zoneIndex: int
startStageId: str
endStageId: str
mainlneBgName: str
recapId: str
recapPreStageId: str
buttonName: str
buttonStyle: str
spoilAlert: bool
zoneOpenTime: int
diffGroup: List[int]
class ItemBundle(BaseStruct):
id_: str = field(name="id")
count: int
type_: str = field(name="type")
class RecordRewardInfo(BaseStruct):
bindStageId: str
stageDiff1: int
stageDiff: int
picRes: Union[str, None]
textPath: Union[str, None]
textDesc: Union[str, None]
recordReward: Union[List[ItemBundle], None]
class ZoneRecordData(BaseStruct):
recordId: str
zoneId: str
recordTitleName: str
preRecordId: Union[str, None]
nodeTitle1: Union[str, None]
nodeTitle2: Union[str, None]
rewards: List[RecordRewardInfo]
class ZoneRecordUnlockData(BaseStruct):
noteId: str
zoneId: str
initialName: str
finalName: Union[str, None]
accordingExposeId: Union[str, None]
initialDes: str
finalDes: Union[str, None]
remindDes: Union[str, None]
class ZoneRecordGroupData(BaseStruct):
zoneId: str
records: List[ZoneRecordData]
unlockData: ZoneRecordUnlockData
class ZoneRecordMissionData(BaseStruct):
missionId: str
recordStageId: str
templateDesc: str
desc: str
class ZoneMetaData(BaseStruct):
ZoneRecordMissionData: Dict[str, ZoneRecordMissionData]
class ZoneTable(BaseStruct):
__version__ = "24-02-02-10-18-07-831ad8"
zones: Dict[str, ZoneData]
weeklyAdditionInfo: Dict[str, WeeklyZoneData]
zoneValidInfo: Dict[str, ZoneValidInfo]
mainlineAdditionInfo: Dict[str, MainlineZoneData]
zoneRecordGroupedData: Dict[str, ZoneRecordGroupData]
zoneRecordRewardData: Dict[str, List[str]]
zoneMetaData: ZoneMetaData

View File

@ -1,5 +1,3 @@
from typing import Dict, List, Union
from msgspec import Struct, field from msgspec import Struct, field
@ -37,17 +35,17 @@ class ArknightsAttendanceAwardResource(Struct):
name: str name: str
rarity: int rarity: int
sortId: int sortId: int
otherSource: List[str] otherSource: list[str]
classifyType: str classifyType: str
stageDropList: List[ArknightsAttendanceStageDropListItem] stageDropList: list[ArknightsAttendanceStageDropListItem]
buildingProductList: List[ArknightsAttendanceBuildingProductListItem] buildingProductList: list[ArknightsAttendanceBuildingProductListItem]
class ArknightsAttendanceCalendarModel(Struct): class ArknightsAttendanceCalendarModel(Struct):
currentTs: str currentTs: str
calendar: List[ArknightsAttendanceCalendar] calendar: list[ArknightsAttendanceCalendar]
records: List[Union[ArknightsAttendanceRecord, None]] records: list[ArknightsAttendanceRecord | None]
resourceInfoMap: Dict[str, ArknightsAttendanceAwardResource] resourceInfoMap: dict[str, ArknightsAttendanceAwardResource]
################ ################
@ -61,7 +59,7 @@ class ArknightsAttendanceAward(Struct):
class ArknightsAttendanceModel(Struct): class ArknightsAttendanceModel(Struct):
ts: str ts: str
awards: List[ArknightsAttendanceAward] awards: list[ArknightsAttendanceAward]
resourceInfoMap: dict resourceInfoMap: dict
@ -116,7 +114,7 @@ class UserGameStatus(Struct):
charCnt: int charCnt: int
furnitureCnt: int furnitureCnt: int
skinCnt: int skinCnt: int
avatar: Union[UserGameStatusAvatar, None] = None avatar: UserGameStatusAvatar | None = None
class UserMeInfoRts(Struct): class UserMeInfoRts(Struct):
@ -137,7 +135,7 @@ class UserMeInfo(Struct):
avatar: str avatar: str
backgroundCode: int backgroundCode: int
isCreator: bool isCreator: bool
creatorIdentifiers: List[str] creatorIdentifiers: list[str]
status: int status: int
operationStatus: int operationStatus: int
identity: int identity: int
@ -152,7 +150,7 @@ class UserMeInfo(Struct):
class ArknightsUserMeModel(Struct, omit_defaults=True): class ArknightsUserMeModel(Struct, omit_defaults=True):
user: UserMeInfo user: UserMeInfo
userRts: UserMeInfoRts userRts: UserMeInfoRts
userSanctionList: List[str] userSanctionList: list[str]
gameStatus: UserGameStatus gameStatus: UserGameStatus
moderator: UserMeModerator moderator: UserMeModerator
userInfoApply: UserMeInfoApply userInfoApply: UserMeInfoApply
@ -180,7 +178,7 @@ class PlayerManufactureFormulaInfo(Struct):
count: int count: int
weight: int weight: int
costPoint: int costPoint: int
costs: Union[List[PlayerManufactureFormulaCostsInfo], None] = None costs: list[PlayerManufactureFormulaCostsInfo] | None = None
class PlayerEquipmentInfo(Struct): class PlayerEquipmentInfo(Struct):
@ -188,9 +186,9 @@ class PlayerEquipmentInfo(Struct):
name: str name: str
typeIcon: str typeIcon: str
shiningColor: str shiningColor: str
desc: Union[str, None] = None desc: str | None = None
typeName1: Union[str, None] = None typeName1: str | None = None
typeName2: Union[str, None] = None typeName2: str | None = None
class PlayerCampaignZoneInfo(Struct): class PlayerCampaignZoneInfo(Struct):
@ -221,8 +219,8 @@ class PlayerTowerInfo(Struct):
name: str name: str
subName: str subName: str
picUrl: str picUrl: str
hasHard: Union[bool, None] = None hasHard: bool | None = None
stageNum: Union[int, None] = None stageNum: int | None = None
class PlayerZoneInfo(Struct): class PlayerZoneInfo(Struct):
@ -238,9 +236,9 @@ class PlayerActivityInfo(Struct):
rewardEndTime: int rewardEndTime: int
isReplicate: bool isReplicate: bool
type_: str = field(name="type") type_: str = field(name="type")
dropItemIds: List[str] dropItemIds: list[str]
shopGoodItemIds: List[str] shopGoodItemIds: list[str]
favorUpList: List[str] favorUpList: list[str]
picUrl: str picUrl: str
@ -257,13 +255,13 @@ class PlayerSkinInfo(Struct):
displayTagId: str displayTagId: str
name: str name: str
charId: str charId: str
brandName: Union[str, None] = None brandName: str | None = None
brandCapitalName: Union[str, None] = None brandCapitalName: str | None = None
illustId: Union[str, None] = None illustId: str | None = None
dynIllustId: Union[str, None] = None dynIllustId: str | None = None
avatarId: Union[str, None] = None avatarId: str | None = None
portraitId: Union[str, None] = None portraitId: str | None = None
skinGroupId: Union[str, None] = None skinGroupId: str | None = None
class PlayerCharInfo(Struct): class PlayerCharInfo(Struct):
@ -287,14 +285,14 @@ class ActivityZone(Struct):
zoneReplicaId: str zoneReplicaId: str
clearedStage: int clearedStage: int
totalStage: int totalStage: int
stageStatus: Union[List[ActivityZoneStageStatus], None] = None stageStatus: list[ActivityZoneStageStatus] | None = None
class PlayerActivity(Struct): class PlayerActivity(Struct):
actId: str actId: str
actReplicaId: str actReplicaId: str
zones: List[ActivityZone] zones: list[ActivityZone]
type_: Union[str, None] = field(name="type", default=None) type_: str | None = field(name="type", default=None)
class RewoardItem(Struct): class RewoardItem(Struct):
@ -316,12 +314,12 @@ class RogueRecord(Struct):
rogueId: str rogueId: str
relicCnt: int relicCnt: int
bank: BankItem bank: BankItem
mission: Union[RewoardItem, None] = None mission: RewoardItem | None = None
clearTime: Union[int, None] = None clearTime: int | None = None
class PlayerRogue(Struct): class PlayerRogue(Struct):
records: List[RogueRecord] records: list[RogueRecord]
class TowerReward(Struct): class TowerReward(Struct):
@ -333,14 +331,14 @@ class TowerReward(Struct):
class TowerRecord(Struct): class TowerRecord(Struct):
towerId: str towerId: str
best: int best: int
hasHard: Union[bool, None] = None hasHard: bool | None = None
stageNum: Union[int, None] = None stageNum: int | None = None
unlockHard: Union[bool, None] = None unlockHard: bool | None = None
hardBest: Union[int, None] = None hardBest: int | None = None
class PlayerTower(Struct): class PlayerTower(Struct):
records: List[TowerRecord] records: list[TowerRecord]
reward: TowerReward reward: TowerReward
@ -355,7 +353,7 @@ class CampaignRecord(Struct):
class PlayerCampaign(Struct): class PlayerCampaign(Struct):
records: List[CampaignRecord] records: list[CampaignRecord]
reward: CampaignReward reward: CampaignReward
@ -368,8 +366,8 @@ class PlayerRecruit(Struct):
startTs: int startTs: int
finishTs: int finishTs: int
state: int state: int
duration: Union[int, None] = None duration: int | None = None
selectTags: Union[List[RecruitTag], None] = None selectTags: list[RecruitTag] | None = None
class BuildingTrainingTrainee(Struct): class BuildingTrainingTrainee(Struct):
@ -390,7 +388,7 @@ class BuildingClue(Struct):
received: int received: int
dailyReward: bool dailyReward: bool
needReceive: int needReceive: int
board: List[str] board: list[str]
sharing: bool sharing: bool
shareCompleteTime: int shareCompleteTime: int
@ -418,7 +416,7 @@ class BuildingControl(Struct):
slotId: str slotId: str
slotState: int slotState: int
level: int level: int
chars: List[BuildingChar] chars: list[BuildingChar]
class BuildingCorridor(Struct): class BuildingCorridor(Struct):
@ -452,14 +450,14 @@ class BuildingTraining(Struct):
lastUpdateTime: int lastUpdateTime: int
remainSecs: int remainSecs: int
slotState: int slotState: int
trainee: Union[BuildingTrainingTrainee, None] trainee: BuildingTrainingTrainee | None
trainer: Union[BuildingTrainingTrainer, None] trainer: BuildingTrainingTrainer | None
class BuildingHire(Struct): class BuildingHire(Struct):
slotId: str slotId: str
level: int level: int
chars: List[BuildingChar] chars: list[BuildingChar]
state: int state: int
refreshCount: int refreshCount: int
completeWorkTime: int completeWorkTime: int
@ -469,7 +467,7 @@ class BuildingHire(Struct):
class BuildingMeeting(Struct): class BuildingMeeting(Struct):
slotId: str slotId: str
level: int level: int
chars: List[BuildingChar] chars: list[BuildingChar]
clue: BuildingClue clue: BuildingClue
lastUpdateTime: int lastUpdateTime: int
completeWorkTime: int completeWorkTime: int
@ -478,7 +476,7 @@ class BuildingMeeting(Struct):
class BuildingDormitories(Struct): class BuildingDormitories(Struct):
slotId: str slotId: str
level: int level: int
chars: List[BuildingChar] chars: list[BuildingChar]
comfort: int comfort: int
@ -491,7 +489,7 @@ class BuildingStockDelivery(Struct):
class BuildingStock(Struct): class BuildingStock(Struct):
instId: int instId: int
type_: str = field(name="type") type_: str = field(name="type")
delivery: List[BuildingStockDelivery] delivery: list[BuildingStockDelivery]
gain: BuildingStockDelivery gain: BuildingStockDelivery
isViolated: bool isViolated: bool
@ -499,18 +497,18 @@ class BuildingStock(Struct):
class BuildingTradings(Struct): class BuildingTradings(Struct):
slotId: str slotId: str
level: int level: int
chars: List[BuildingChar] chars: list[BuildingChar]
completeWorkTime: int completeWorkTime: int
lastUpdateTime: int lastUpdateTime: int
strategy: str strategy: str
stock: List[BuildingStock] stock: list[BuildingStock]
stockLimit: int stockLimit: int
class BuildingManufactures(Struct): class BuildingManufactures(Struct):
slotId: str slotId: str
level: int level: int
chars: List[BuildingChar] chars: list[BuildingChar]
completeWorkTime: int completeWorkTime: int
lastUpdateTime: int lastUpdateTime: int
formulaId: str formulaId: str
@ -524,7 +522,7 @@ class BuildingManufactures(Struct):
class BuildingPower(Struct): class BuildingPower(Struct):
slotId: str slotId: str
level: int level: int
chars: List[BuildingChar] chars: list[BuildingChar]
class BuildingTiredChar(Struct): class BuildingTiredChar(Struct):
@ -538,19 +536,19 @@ class BuildingTiredChar(Struct):
class PlayerBuilding(Struct): class PlayerBuilding(Struct):
tiredChars: Union[List[BuildingTiredChar], None] tiredChars: list[BuildingTiredChar] | None
powers: Union[List[BuildingPower], None] powers: list[BuildingPower] | None
manufactures: Union[List[BuildingManufactures], None] manufactures: list[BuildingManufactures] | None
tradings: Union[List[BuildingTradings], None] tradings: list[BuildingTradings] | None
dormitories: Union[List[BuildingDormitories], None] dormitories: list[BuildingDormitories] | None
meeting: Union[BuildingMeeting, None] meeting: BuildingMeeting | None
hire: Union[BuildingHire, None] hire: BuildingHire | None
labor: BuildingLabor labor: BuildingLabor
furniture: BuildingFurniture furniture: BuildingFurniture
elevators: List[BuildingElevator] elevators: list[BuildingElevator]
corridors: Union[List[BuildingCorridor], None] corridors: list[BuildingCorridor] | None
control: BuildingControl control: BuildingControl
training: Union[BuildingTraining, None] = None training: BuildingTraining | None = None
class PlayerInfoSkin(Struct): class PlayerInfoSkin(Struct):
@ -576,8 +574,8 @@ class PlayerInfoChar(Struct):
evolvePhase: int evolvePhase: int
potentialRank: int potentialRank: int
mainSkillLvl: int mainSkillLvl: int
skills: Union[List[PlayerInfoCharSkill], None] skills: list[PlayerInfoCharSkill] | None
equip: Union[List[PlayerInfoCharEquip], None] equip: list[PlayerInfoCharEquip] | None
favorPercent: int favorPercent: int
defaultSkillId: str defaultSkillId: str
gainTime: int gainTime: int
@ -599,14 +597,14 @@ class PlayerAssistChar(Struct):
skillId: str skillId: str
mainSkillLvl: int mainSkillLvl: int
specializeLevel: int specializeLevel: int
equip: Union[PlayerAssistCharEquip, None] equip: PlayerAssistCharEquip | None
class PlayerMedal(Struct): class PlayerMedal(Struct):
type_: str = field(name="type") type_: str = field(name="type")
template: str template: str
templateMedalList: List[str] templateMedalList: list[str]
customMedalLayout: List[Union[str, None]] customMedalLayout: list[str | None]
total: int total: int
@ -649,7 +647,7 @@ class PlayerStatus(Struct):
furnitureCnt: int furnitureCnt: int
skinCnt: int skinCnt: int
exp: PlayerStatusExp exp: PlayerStatusExp
avatar: Union[PlayerStatusAvatar, None] = None avatar: PlayerStatusAvatar | None = None
class DisplayShowConfig(Struct): class DisplayShowConfig(Struct):
@ -702,12 +700,12 @@ class PlayerSandboxList(Struct):
maxDay: int maxDay: int
maxDayChallenge: int maxDayChallenge: int
mainQuest: int mainQuest: int
subQuest: List[Union[PlayerSandboxSubQuest, None]] subQuest: list[PlayerSandboxSubQuest | None]
baseLv: int baseLv: int
unlockNode: int unlockNode: int
enemyKill: int enemyKill: int
createRift: int createRift: int
fixRift: List[int] fixRift: list[int]
picUrl: str picUrl: str
@ -715,35 +713,35 @@ class ArknightsPlayerInfoModel(Struct, omit_defaults=True, gc=False):
currentTs: int currentTs: int
showConfig: DisplayShowConfig showConfig: DisplayShowConfig
status: PlayerStatus status: PlayerStatus
assistChars: List[PlayerAssistChar] assistChars: list[PlayerAssistChar]
chars: List[PlayerInfoChar] chars: list[PlayerInfoChar]
skins: List[PlayerInfoSkin] skins: list[PlayerInfoSkin]
building: PlayerBuilding building: PlayerBuilding
recruit: List[PlayerRecruit] recruit: list[PlayerRecruit]
campaign: PlayerCampaign campaign: PlayerCampaign
tower: PlayerTower tower: PlayerTower
rogue: PlayerRogue rogue: PlayerRogue
routine: PlayerRoutine routine: PlayerRoutine
activity: List[PlayerActivity] activity: list[PlayerActivity]
charInfoMap: Dict[str, PlayerCharInfo] charInfoMap: dict[str, PlayerCharInfo]
skinInfoMap: Dict[str, PlayerSkinInfo] skinInfoMap: dict[str, PlayerSkinInfo]
stageInfoMap: Dict[str, PlayerStageInfo] stageInfoMap: dict[str, PlayerStageInfo]
activityInfoMap: Dict[str, PlayerActivityInfo] activityInfoMap: dict[str, PlayerActivityInfo]
towerInfoMap: Dict[str, PlayerTowerInfo] towerInfoMap: dict[str, PlayerTowerInfo]
rogueInfoMap: Dict[str, PlayerRogueInfo] rogueInfoMap: dict[str, PlayerRogueInfo]
campaignInfoMap: Dict[str, PlayerCampaignInfo] campaignInfoMap: dict[str, PlayerCampaignInfo]
campaignZoneInfoMap: Dict[str, PlayerCampaignZoneInfo] campaignZoneInfoMap: dict[str, PlayerCampaignZoneInfo]
equipmentInfoMap: Dict[str, PlayerEquipmentInfo] equipmentInfoMap: dict[str, PlayerEquipmentInfo]
manufactureFormulaInfoMap: Dict[str, PlayerManufactureFormulaInfo] manufactureFormulaInfoMap: dict[str, PlayerManufactureFormulaInfo]
charAssets: List[Union[str, None]] charAssets: list[str | None]
skinAssets: List[Union[str, None]] skinAssets: list[str | None]
activityBannerList: Dict[str, List[PlayerActivityBannerList]] activityBannerList: dict[str, list[PlayerActivityBannerList]]
bossRush: List[Union[PlayerBossRustList, None]] bossRush: list[PlayerBossRustList | None]
bannerList: List[Union[PlayerBannerList, None]] bannerList: list[PlayerBannerList | None]
sandbox: List[Union[PlayerSandboxList, None]] sandbox: list[PlayerSandboxList | None]
medal: Union[PlayerMedal, None] = None medal: PlayerMedal | None = None
zoneInfoMap: Union[Dict[str, PlayerZoneInfo], None] = None zoneInfoMap: dict[str, PlayerZoneInfo] | None = None
medalInfoMap: Union[Dict[str, PlayerMedalInfo], None] = None medalInfoMap: dict[str, PlayerMedalInfo] | None = None
################ ################

215
pdm.lock generated
View File

@ -5,10 +5,10 @@
groups = ["default", "dev"] groups = ["default", "dev"]
strategy = [] strategy = []
lock_version = "4.5.0" lock_version = "4.5.0"
content_hash = "sha256:9d184cabd7da10f30ef3d9a026d1c594ded6b1ae21ef3a31b7278becd87cdb3f" content_hash = "sha256:e7ff881ba70a1db89bad753a0cdfd1074e5c9bb4f1f618cab54b67656af27a9d"
[[metadata.targets]] [[metadata.targets]]
requires_python = "~=3.10" requires_python = "~=3.11"
[[package]] [[package]]
name = "annotated-types" name = "annotated-types"
@ -25,18 +25,18 @@ files = [
[[package]] [[package]]
name = "anyio" name = "anyio"
version = "3.7.1" version = "4.8.0"
requires_python = ">=3.7" requires_python = ">=3.9"
summary = "High level compatibility layer for multiple asynchronous event loop implementations" summary = "High level compatibility layer for multiple asynchronous event loop implementations"
dependencies = [ dependencies = [
"exceptiongroup; python_version < \"3.11\"", "exceptiongroup>=1.0.2; python_version < \"3.11\"",
"idna>=2.8", "idna>=2.8",
"sniffio>=1.1", "sniffio>=1.1",
"typing-extensions; python_version < \"3.8\"", "typing-extensions>=4.5; python_version < \"3.13\"",
] ]
files = [ files = [
{file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"},
{file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"},
] ]
[[package]] [[package]]
@ -48,18 +48,6 @@ dependencies = [
"pycparser", "pycparser",
] ]
files = [ files = [
{file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"},
{file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"},
{file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"},
{file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"},
{file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"},
{file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"},
{file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"},
{file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"},
{file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"},
{file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"},
{file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"},
{file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"},
{file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"},
{file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"},
{file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"},
@ -99,75 +87,67 @@ files = [
[[package]] [[package]]
name = "cryptography" name = "cryptography"
version = "44.0.0" version = "44.0.2"
requires_python = "!=3.9.0,!=3.9.1,>=3.7" requires_python = "!=3.9.0,!=3.9.1,>=3.7"
summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
dependencies = [ dependencies = [
"cffi>=1.12; platform_python_implementation != \"PyPy\"", "cffi>=1.12; platform_python_implementation != \"PyPy\"",
] ]
files = [ files = [
{file = "cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123"}, {file = "cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7"},
{file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092"}, {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1"},
{file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f"}, {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb"},
{file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb"}, {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843"},
{file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b"}, {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5"},
{file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543"}, {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c"},
{file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e"}, {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a"},
{file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e"}, {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308"},
{file = "cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053"}, {file = "cryptography-44.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688"},
{file = "cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd"}, {file = "cryptography-44.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7"},
{file = "cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591"}, {file = "cryptography-44.0.2-cp37-abi3-win32.whl", hash = "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79"},
{file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7"}, {file = "cryptography-44.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa"},
{file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc"}, {file = "cryptography-44.0.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3"},
{file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289"}, {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639"},
{file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7"}, {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd"},
{file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c"}, {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181"},
{file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64"}, {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea"},
{file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285"}, {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699"},
{file = "cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417"}, {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9"},
{file = "cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede"}, {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23"},
{file = "cryptography-44.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731"}, {file = "cryptography-44.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922"},
{file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4"}, {file = "cryptography-44.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4"},
{file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756"}, {file = "cryptography-44.0.2-cp39-abi3-win32.whl", hash = "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5"},
{file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c"}, {file = "cryptography-44.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6"},
{file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa"}, {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d"},
{file = "cryptography-44.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c"}, {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471"},
{file = "cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02"}, {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615"},
] {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390"},
{file = "cryptography-44.0.2.tar.gz", hash = "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0"},
[[package]]
name = "exceptiongroup"
version = "1.1.3"
requires_python = ">=3.7"
summary = "Backport of PEP 654 (exception groups)"
files = [
{file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"},
{file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"},
] ]
[[package]] [[package]]
name = "fastapi" name = "fastapi"
version = "0.115.6" version = "0.115.11"
requires_python = ">=3.8" requires_python = ">=3.8"
summary = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" summary = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
dependencies = [ dependencies = [
"pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4", "pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4",
"starlette<0.42.0,>=0.40.0", "starlette<0.47.0,>=0.40.0",
"typing-extensions>=4.8.0", "typing-extensions>=4.8.0",
] ]
files = [ files = [
{file = "fastapi-0.115.6-py3-none-any.whl", hash = "sha256:e9240b29e36fa8f4bb7290316988e90c381e5092e0cbe84e7818cc3713bcf305"}, {file = "fastapi-0.115.11-py3-none-any.whl", hash = "sha256:32e1541b7b74602e4ef4a0260ecaf3aadf9d4f19590bba3e1bf2ac4666aa2c64"},
{file = "fastapi-0.115.6.tar.gz", hash = "sha256:9ec46f7addc14ea472958a96aae5b5de65f39721a46aaf5705c480d9a8b76654"}, {file = "fastapi-0.115.11.tar.gz", hash = "sha256:cc81f03f688678b92600a65a5e618b93592c65005db37157147204d8924bf94f"},
] ]
[[package]] [[package]]
name = "idna" name = "idna"
version = "3.4" version = "3.10"
requires_python = ">=3.5" requires_python = ">=3.6"
summary = "Internationalized Domain Names in Applications (IDNA)" summary = "Internationalized Domain Names in Applications (IDNA)"
files = [ files = [
{file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
{file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
] ]
[[package]] [[package]]
@ -176,13 +156,6 @@ version = "0.19.0"
requires_python = ">=3.9" requires_python = ">=3.9"
summary = "A fast serialization and validation library, with builtin support for JSON, MessagePack, YAML, and TOML." summary = "A fast serialization and validation library, with builtin support for JSON, MessagePack, YAML, and TOML."
files = [ files = [
{file = "msgspec-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d8dd848ee7ca7c8153462557655570156c2be94e79acec3561cf379581343259"},
{file = "msgspec-0.19.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0553bbc77662e5708fe66aa75e7bd3e4b0f209709c48b299afd791d711a93c36"},
{file = "msgspec-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe2c4bf29bf4e89790b3117470dea2c20b59932772483082c468b990d45fb947"},
{file = "msgspec-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e87ecfa9795ee5214861eab8326b0e75475c2e68a384002aa135ea2a27d909"},
{file = "msgspec-0.19.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3c4ec642689da44618f68c90855a10edbc6ac3ff7c1d94395446c65a776e712a"},
{file = "msgspec-0.19.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2719647625320b60e2d8af06b35f5b12d4f4d281db30a15a1df22adb2295f633"},
{file = "msgspec-0.19.0-cp310-cp310-win_amd64.whl", hash = "sha256:695b832d0091edd86eeb535cd39e45f3919f48d997685f7ac31acb15e0a2ed90"},
{file = "msgspec-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa77046904db764b0462036bc63ef71f02b75b8f72e9c9dd4c447d6da1ed8f8e"}, {file = "msgspec-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa77046904db764b0462036bc63ef71f02b75b8f72e9c9dd4c447d6da1ed8f8e"},
{file = "msgspec-0.19.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:047cfa8675eb3bad68722cfe95c60e7afabf84d1bd8938979dd2b92e9e4a9551"}, {file = "msgspec-0.19.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:047cfa8675eb3bad68722cfe95c60e7afabf84d1bd8938979dd2b92e9e4a9551"},
{file = "msgspec-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e78f46ff39a427e10b4a61614a2777ad69559cc8d603a7c05681f5a595ea98f7"}, {file = "msgspec-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e78f46ff39a427e10b4a61614a2777ad69559cc8d603a7c05681f5a595ea98f7"},
@ -219,7 +192,7 @@ files = [
[[package]] [[package]]
name = "pydantic" name = "pydantic"
version = "2.10.4" version = "2.10.6"
requires_python = ">=3.8" requires_python = ">=3.8"
summary = "Data validation using Python type hints" summary = "Data validation using Python type hints"
dependencies = [ dependencies = [
@ -228,8 +201,8 @@ dependencies = [
"typing-extensions>=4.12.2", "typing-extensions>=4.12.2",
] ]
files = [ files = [
{file = "pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d"}, {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"},
{file = "pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"},
] ]
[[package]] [[package]]
@ -241,19 +214,6 @@ dependencies = [
"typing-extensions!=4.7.0,>=4.6.0", "typing-extensions!=4.7.0,>=4.6.0",
] ]
files = [ files = [
{file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"},
{file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"},
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"},
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"},
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"},
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"},
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"},
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"},
{file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"},
{file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"},
{file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"},
{file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"},
{file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"},
{file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"},
{file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"},
{file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"},
@ -296,66 +256,71 @@ files = [
{file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"},
{file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"},
{file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"},
{file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"},
] ]
[[package]] [[package]]
name = "ruff" name = "ruff"
version = "0.8.4" version = "0.9.9"
requires_python = ">=3.7" requires_python = ">=3.7"
summary = "An extremely fast Python linter and code formatter, written in Rust." summary = "An extremely fast Python linter and code formatter, written in Rust."
files = [ files = [
{file = "ruff-0.8.4-py3-none-linux_armv6l.whl", hash = "sha256:58072f0c06080276804c6a4e21a9045a706584a958e644353603d36ca1eb8a60"}, {file = "ruff-0.9.9-py3-none-linux_armv6l.whl", hash = "sha256:628abb5ea10345e53dff55b167595a159d3e174d6720bf19761f5e467e68d367"},
{file = "ruff-0.8.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ffb60904651c00a1e0b8df594591770018a0f04587f7deeb3838344fe3adabac"}, {file = "ruff-0.9.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b6cd1428e834b35d7493354723543b28cc11dc14d1ce19b685f6e68e07c05ec7"},
{file = "ruff-0.8.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ddf5d654ac0d44389f6bf05cee4caeefc3132a64b58ea46738111d687352296"}, {file = "ruff-0.9.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5ee162652869120ad260670706f3cd36cd3f32b0c651f02b6da142652c54941d"},
{file = "ruff-0.8.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e248b1f0fa2749edd3350a2a342b67b43a2627434c059a063418e3d375cfe643"}, {file = "ruff-0.9.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3aa0f6b75082c9be1ec5a1db78c6d4b02e2375c3068438241dc19c7c306cc61a"},
{file = "ruff-0.8.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf197b98ed86e417412ee3b6c893f44c8864f816451441483253d5ff22c0e81e"}, {file = "ruff-0.9.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:584cc66e89fb5f80f84b05133dd677a17cdd86901d6479712c96597a3f28e7fe"},
{file = "ruff-0.8.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c41319b85faa3aadd4d30cb1cffdd9ac6b89704ff79f7664b853785b48eccdf3"}, {file = "ruff-0.9.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf3369325761a35aba75cd5c55ba1b5eb17d772f12ab168fbfac54be85cf18c"},
{file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9f8402b7c4f96463f135e936d9ab77b65711fcd5d72e5d67597b543bbb43cf3f"}, {file = "ruff-0.9.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3403a53a32a90ce929aa2f758542aca9234befa133e29f4933dcef28a24317be"},
{file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e56b3baa9c23d324ead112a4fdf20db9a3f8f29eeabff1355114dd96014604"}, {file = "ruff-0.9.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:18454e7fa4e4d72cffe28a37cf6a73cb2594f81ec9f4eca31a0aaa9ccdfb1590"},
{file = "ruff-0.8.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:736272574e97157f7edbbb43b1d046125fce9e7d8d583d5d65d0c9bf2c15addf"}, {file = "ruff-0.9.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fadfe2c88724c9617339f62319ed40dcdadadf2888d5afb88bf3adee7b35bfb"},
{file = "ruff-0.8.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fe710ab6061592521f902fca7ebcb9fabd27bc7c57c764298b1c1f15fff720"}, {file = "ruff-0.9.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6df104d08c442a1aabcfd254279b8cc1e2cbf41a605aa3e26610ba1ec4acf0b0"},
{file = "ruff-0.8.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:13e9ec6d6b55f6da412d59953d65d66e760d583dd3c1c72bf1f26435b5bfdbae"}, {file = "ruff-0.9.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d7c62939daf5b2a15af48abbd23bea1efdd38c312d6e7c4cedf5a24e03207e17"},
{file = "ruff-0.8.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:97d9aefef725348ad77d6db98b726cfdb075a40b936c7984088804dfd38268a7"}, {file = "ruff-0.9.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9494ba82a37a4b81b6a798076e4a3251c13243fc37967e998efe4cce58c8a8d1"},
{file = "ruff-0.8.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ab78e33325a6f5374e04c2ab924a3367d69a0da36f8c9cb6b894a62017506111"}, {file = "ruff-0.9.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4efd7a96ed6d36ef011ae798bf794c5501a514be369296c672dab7921087fa57"},
{file = "ruff-0.8.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8ef06f66f4a05c3ddbc9121a8b0cecccd92c5bf3dd43b5472ffe40b8ca10f0f8"}, {file = "ruff-0.9.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ab90a7944c5a1296f3ecb08d1cbf8c2da34c7e68114b1271a431a3ad30cb660e"},
{file = "ruff-0.8.4-py3-none-win32.whl", hash = "sha256:552fb6d861320958ca5e15f28b20a3d071aa83b93caee33a87b471f99a6c0835"}, {file = "ruff-0.9.9-py3-none-win32.whl", hash = "sha256:6b4c376d929c25ecd6d87e182a230fa4377b8e5125a4ff52d506ee8c087153c1"},
{file = "ruff-0.8.4-py3-none-win_amd64.whl", hash = "sha256:f21a1143776f8656d7f364bd264a9d60f01b7f52243fbe90e7670c0dfe0cf65d"}, {file = "ruff-0.9.9-py3-none-win_amd64.whl", hash = "sha256:837982ea24091d4c1700ddb2f63b7070e5baec508e43b01de013dc7eff974ff1"},
{file = "ruff-0.8.4-py3-none-win_arm64.whl", hash = "sha256:9183dd615d8df50defa8b1d9a074053891ba39025cf5ae88e8bcb52edcc4bf08"}, {file = "ruff-0.9.9-py3-none-win_arm64.whl", hash = "sha256:3ac78f127517209fe6d96ab00f3ba97cafe38718b23b1db3e96d8b2d39e37ddf"},
{file = "ruff-0.8.4.tar.gz", hash = "sha256:0d5f89f254836799af1615798caa5f80b7f935d7a670fad66c5007928e57ace8"}, {file = "ruff-0.9.9.tar.gz", hash = "sha256:0062ed13f22173e85f8f7056f9a24016e692efeea8704d1a5e8011b8aa850933"},
] ]
[[package]] [[package]]
name = "sniffio" name = "sniffio"
version = "1.3.0" version = "1.3.1"
requires_python = ">=3.7" requires_python = ">=3.7"
summary = "Sniff out which async library your code is running under" summary = "Sniff out which async library your code is running under"
files = [ files = [
{file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
{file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
] ]
[[package]] [[package]]
name = "starlette" name = "starlette"
version = "0.41.3" version = "0.46.0"
requires_python = ">=3.8" requires_python = ">=3.9"
summary = "The little ASGI library that shines." summary = "The little ASGI library that shines."
dependencies = [ dependencies = [
"anyio<5,>=3.4.0", "anyio<5,>=3.6.2",
"typing-extensions>=3.10.0; python_version < \"3.10\"", "typing-extensions>=3.10.0; python_version < \"3.10\"",
] ]
files = [ files = [
{file = "starlette-0.41.3-py3-none-any.whl", hash = "sha256:44cedb2b7c77a9de33a8b74b2b90e9f50d11fcf25d8270ea525ad71a25374ff7"}, {file = "starlette-0.46.0-py3-none-any.whl", hash = "sha256:913f0798bd90ba90a9156383bcf1350a17d6259451d0d8ee27fc0cf2db609038"},
{file = "starlette-0.41.3.tar.gz", hash = "sha256:0e4ab3d16522a255be6b28260b938eae2482f98ce5cc934cb08dce8dc3ba5835"}, {file = "starlette-0.46.0.tar.gz", hash = "sha256:b359e4567456b28d473d0193f34c0de0ed49710d75ef183a74a5ce0499324f50"},
]
[[package]]
name = "torappu-excel"
version = "0.1.1"
requires_python = ">=3.11"
summary = "Torappu Client Excel Model Library"
dependencies = [
"msgspec>=0.19.0",
"typing-extensions>=4.12.2",
]
files = [
{file = "torappu_excel-0.1.1-py3-none-any.whl", hash = "sha256:42f017c2ebfe50c8b659ab379679287321dacd0ecd69fad98ecb0f90231fd7f2"},
{file = "torappu_excel-0.1.1.tar.gz", hash = "sha256:abc0ce55f0bd46862281773523f8f5111e40180d0ad9b7f5c1c48cfda7d23475"},
] ]
[[package]] [[package]]

View File

@ -7,17 +7,19 @@ authors = [
] ]
dependencies = [ dependencies = [
"msgspec>=0.19.0", "msgspec>=0.19.0",
"pydantic>=2.10.4", "pydantic>=2.10.6",
"fastapi>=0.115.6", "fastapi>=0.115.11",
"cryptography>=44.0.0", "cryptography>=44.0.2",
"torappu-excel>=0.1.1"
] ]
requires-python = ">=3.10,<4.0" requires-python = ">=3.11,<4.0"
readme = "README.md" readme = "README.md"
license = {text = "GPL-3.0-or-later"} license = {text = "GPL-3.0-or-later"}
gscore_auto_update_dep = ["torappu-excel>=0.1.1"]
[tool.pdm.dev-dependencies] [tool.pdm.dev-dependencies]
dev = [ dev = [
"ruff>=0.8.4", "ruff>=0.9.9",
] ]
[build-system] [build-system]
@ -25,8 +27,8 @@ requires = ["pdm-backend"]
build-backend = "pdm.backend" build-backend = "pdm.backend"
[tool.ruff] [tool.ruff]
line-length = 98 line-length = 120
target-version = "py38" target-version = "py311"
[tool.ruff.lint] [tool.ruff.lint]
select = [ select = [