format and bug fix

This commit is contained in:
baiqwerdvd 2024-03-11 16:42:47 +08:00
parent 401244c50e
commit e8e54dd79d
90 changed files with 1289 additions and 1149 deletions

View File

@ -12,55 +12,55 @@ from ..utils.ark_prefix import PREFIX
from .draw_ap_card import get_ap_img from .draw_ap_card import get_ap_img
from .notice import get_notice_list from .notice import get_notice_list
sv_get_ap = SV('ark查询体力') sv_get_ap = SV("ark查询体力")
sv_get_ap_admin = SV('ark强制推送', pm=1) sv_get_ap_admin = SV("ark强制推送", pm=1)
@sv_get_ap_admin.on_fullmatch((f'{PREFIX}强制推送体力提醒')) # noqa: UP034 @sv_get_ap_admin.on_fullmatch((f"{PREFIX}强制推送体力提醒")) # noqa: UP034
async def force_notice_job(bot: Bot, ev: Event): async def force_notice_job(bot: Bot, ev: Event):
await bot.logger.info('开始执行[ark强制推送体力信息]') await bot.logger.info("开始执行[ark强制推送体力信息]")
await ark_notice_job() await ark_notice_job()
@scheduler.scheduled_job('cron', minute='*/30') @scheduler.scheduled_job("cron", minute="*/30")
async def ark_notice_job(): async def ark_notice_job():
result = await get_notice_list() result = await get_notice_list()
logger.info('[ark推送检查]完成!等待消息推送中...') logger.info("[ark推送检查]完成!等待消息推送中...")
logger.debug(result) logger.debug(result)
# 执行私聊推送 # 执行私聊推送
for bot_id in result: for bot_id in result:
for BOT_ID in gss.active_bot: for BOT_ID in gss.active_bot:
bot = gss.active_bot[BOT_ID] bot = gss.active_bot[BOT_ID]
for user_id in result[bot_id]['direct']: for user_id in result[bot_id]["direct"]:
msg = result[bot_id]['direct'][user_id] msg = result[bot_id]["direct"][user_id]
await bot.target_send(msg, 'direct', user_id, bot_id, '', '') await bot.target_send(msg, "direct", user_id, bot_id, "", "")
await asyncio.sleep(0.5) await asyncio.sleep(0.5)
logger.info('[ark推送检查] 私聊推送完成') logger.info("[ark推送检查] 私聊推送完成")
for gid in result[bot_id]['group']: for gid in result[bot_id]["group"]:
msg_list = [] msg_list = []
for user_id in result[bot_id]['group'][gid]: for user_id in result[bot_id]["group"][gid]:
msg_list.append(MessageSegment.at(user_id)) msg_list.append(MessageSegment.at(user_id))
msg = result[bot_id]['group'][gid][user_id] msg = result[bot_id]["group"][gid][user_id]
msg_list.append(MessageSegment.text(msg)) msg_list.append(MessageSegment.text(msg))
await bot.target_send(msg_list, 'group', gid, bot_id, '', '') await bot.target_send(msg_list, "group", gid, bot_id, "", "")
await asyncio.sleep(0.5) await asyncio.sleep(0.5)
logger.info('[ark推送检查] 群聊推送完成') logger.info("[ark推送检查] 群聊推送完成")
@sv_get_ap.on_fullmatch( @sv_get_ap.on_fullmatch(
( (
f'{PREFIX}每日', f"{PREFIX}每日",
f'{PREFIX}mr', f"{PREFIX}mr",
f'{PREFIX}实时便笺', f"{PREFIX}实时便笺",
f'{PREFIX}便笺', f"{PREFIX}便笺",
f'{PREFIX}便签', f"{PREFIX}便签",
) )
) )
async def send_daily_info_pic(bot: Bot, ev: Event): async def send_daily_info_pic(bot: Bot, ev: Event):
await bot.logger.info('开始执行[ark每日信息]') await bot.logger.info("开始执行[ark每日信息]")
user_id = ev.at if ev.at else ev.user_id user_id = ev.at if ev.at else ev.user_id
await bot.logger.info(f'[ark每日信息]QQ号: {user_id}') await bot.logger.info(f"[ark每日信息]QQ号: {user_id}")
im = await get_ap_img(bot.bot_id, user_id) im = await get_ap_img(bot.bot_id, user_id)
await bot.send(im) await bot.send(im)

View File

@ -16,17 +16,17 @@ from ..utils.fonts.source_han_sans import (
) )
from .utils import now_ap, seconds2hours_zhcn from .utils import now_ap, seconds2hours_zhcn
TEXT_PATH = Path(__file__).parent / 'texture2D' TEXT_PATH = Path(__file__).parent / "texture2D"
white_bg = Image.open(TEXT_PATH / 'white_bg.png') white_bg = Image.open(TEXT_PATH / "white_bg.png")
up_bar = Image.open(TEXT_PATH / 'up_bar.png') up_bar = Image.open(TEXT_PATH / "up_bar.png")
brain_pic = Image.open(TEXT_PATH / 'brain.png') brain_pic = Image.open(TEXT_PATH / "brain.png")
warn_pic = Image.open(TEXT_PATH / 'warn.png') warn_pic = Image.open(TEXT_PATH / "warn.png")
mask_pic = Image.open(TEXT_PATH / 'mask.png').convert('RGBA') mask_pic = Image.open(TEXT_PATH / "mask.png").convert("RGBA")
logo_white = Image.open(TEXT_PATH / 'logo_white.png') logo_white = Image.open(TEXT_PATH / "logo_white.png")
blue_bar_bg1 = Image.open(TEXT_PATH / 'blue_bar_bg1.png') blue_bar_bg1 = Image.open(TEXT_PATH / "blue_bar_bg1.png")
grey_bar_bg1 = Image.open(TEXT_PATH / 'grey_bar_bg1.png') grey_bar_bg1 = Image.open(TEXT_PATH / "grey_bar_bg1.png")
based_w = 850 based_w = 850
based_h = 1750 based_h = 1750
@ -39,29 +39,31 @@ red_color = (235, 61, 75)
async def get_ap_img(bot_id: str, user_id: str): async def get_ap_img(bot_id: str, user_id: str):
try: try:
uid_list = await ArknightsBind.get_uid_list_by_game(user_id, bot_id) uid_list = await ArknightsBind.get_uid_list_by_game(user_id, bot_id)
logger.info(f'[每日信息]UID: {uid_list}') logger.info(f"[每日信息]UID: {uid_list}")
# 进行校验UID是否绑定CK # 进行校验UID是否绑定CK
useable_uid_list = [] useable_uid_list = []
if uid_list is None: if uid_list is None:
return '请先绑定一个可用CRED & UID再来查询哦~' return "请先绑定一个可用CRED & UID再来查询哦~"
for uid in uid_list: for uid in uid_list:
status = await ark_skd_api.check_cred_valid(uid=uid) status = await ark_skd_api.check_cred_valid(uid=uid)
if status is not bool: if status is not bool:
useable_uid_list.append(uid) useable_uid_list.append(uid)
logger.info(f'[每日信息]可用UID: {useable_uid_list}') logger.info(f"[每日信息]可用UID: {useable_uid_list}")
if len(useable_uid_list) == 0: if len(useable_uid_list) == 0:
return '请先绑定一个可用CRED & UID再来查询哦~' return "请先绑定一个可用CRED & UID再来查询哦~"
# 开始绘图任务 # 开始绘图任务
task = [] task = []
img = Image.new('RGBA', (based_w * len(useable_uid_list), based_h), (0, 0, 0, 0)) img = Image.new(
"RGBA", (based_w * len(useable_uid_list), based_h), (0, 0, 0, 0)
)
for uid_index, uid in enumerate(useable_uid_list): for uid_index, uid in enumerate(useable_uid_list):
task.append(_draw_all_ap_img(img, uid, uid_index)) task.append(_draw_all_ap_img(img, uid, uid_index))
await asyncio.gather(*task) await asyncio.gather(*task)
res = await convert_img(img) res = await convert_img(img)
logger.info('[查询每日信息]绘图已完成,等待发送!') logger.info("[查询每日信息]绘图已完成,等待发送!")
except TypeError: except TypeError:
logger.exception('[查询每日信息]绘图失败!') logger.exception("[查询每日信息]绘图失败!")
res = '你绑定过的UID中可能存在过期CRED~请重新绑定一下噢~' res = "你绑定过的UID中可能存在过期CRED~请重新绑定一下噢~"
return res return res
@ -77,28 +79,32 @@ def get_error(img: Image.Image, uid: str, daily_data: int):
# 写UID # 写UID
img_draw.text( img_draw.text(
(350, 680), (350, 680),
f'UID{uid}', f"UID{uid}",
font=sans_font_26, font=sans_font_26,
fill=first_color, fill=first_color,
anchor='mm', anchor="mm",
) )
img_draw.text( img_draw.text(
(350, 650), (350, 650),
f'错误码 {daily_data}', f"错误码 {daily_data}",
font=sans_font_26, font=sans_font_26,
fill=red_color, fill=red_color,
anchor='mm', anchor="mm",
) )
return img return img
async def draw_ap_img(uid: str) -> Image.Image: async def draw_ap_img(uid: str) -> Image.Image:
# char # char
char_pic = Image.open(TEXT_PATH / 'char_1028_texas2_1b.png').resize((1700, 1700)).convert('RGBA') char_pic = (
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)
tmp_img2 = Image.new('RGBA', (based_w, based_h)) tmp_img2 = Image.new("RGBA", (based_w, based_h))
tmp_img2.paste(tmp_img, (0, 0), mask_pic) tmp_img2.paste(tmp_img, (0, 0), mask_pic)
img = Image.alpha_composite(white_bg, tmp_img2) img = Image.alpha_composite(white_bg, tmp_img2)
@ -114,10 +120,10 @@ async def draw_ap_img(uid: str) -> Image.Image:
up_bar_draw = ImageDraw.Draw(up_bar_img) up_bar_draw = ImageDraw.Draw(up_bar_img)
up_bar_draw.text( up_bar_draw.text(
(40, 130), (40, 130),
f'Dr.{nickname}', f"Dr.{nickname}",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='lm', anchor="lm",
) )
img.paste(up_bar_img, (0, 0), up_bar_img) img.paste(up_bar_img, (0, 0), up_bar_img)
@ -128,10 +134,10 @@ async def draw_ap_img(uid: str) -> Image.Image:
brain_pic_draw = ImageDraw.Draw(brain_pic_img) brain_pic_draw = ImageDraw.Draw(brain_pic_img)
brain_pic_draw.text( brain_pic_draw.text(
(135, 255), (135, 255),
f'{current_ap}/{max_ap}', f"{current_ap}/{max_ap}",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='lm', anchor="lm",
) )
img.paste(brain_pic_img, (50, 500), brain_pic_img) img.paste(brain_pic_img, (50, 500), brain_pic_img)
@ -168,35 +174,35 @@ async def draw_ap_img(uid: str) -> Image.Image:
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(
(170, 60), (170, 60),
'公开招募', "公开招募",
font=sans_font_34, font=sans_font_34,
fill=first_color, fill=first_color,
anchor='lm', anchor="lm",
) )
if recruit_task_finish_count == len(recruit): if recruit_task_finish_count == len(recruit):
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
(540, 70), (540, 70),
'招募已全部完成', "招募已全部完成",
font=sans_font_18, font=sans_font_18,
fill=first_color, fill=first_color,
anchor='rm', anchor="rm",
) )
else: else:
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
(540, 70), (540, 70),
f'{delta_hour}小时{delta_minute}分钟后全部完成', f"{delta_hour}小时{delta_minute}分钟后全部完成",
font=sans_font_18, font=sans_font_18,
fill=first_color, fill=first_color,
anchor='rm', anchor="rm",
) )
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
xy=(777, 58), xy=(777, 58),
text=f'{len(recruit) - recruit_task_finish_count}/{len(recruit)}', text=f"{len(recruit) - recruit_task_finish_count}/{len(recruit)}",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='rm', anchor="rm",
) )
img.paste(blue_bar_bg1_img, (-20, 800), blue_bar_bg1_img) img.paste(blue_bar_bg1_img, (-20, 800), blue_bar_bg1_img)
@ -215,24 +221,24 @@ async def draw_ap_img(uid: str) -> Image.Image:
delta_minute = (delta.seconds - delta_hour * 3600) // 60 delta_minute = (delta.seconds - delta_hour * 3600) // 60
grey_bar_bg1_draw.text( grey_bar_bg1_draw.text(
(170, 60), (170, 60),
'公开刷新', "公开刷新",
font=sans_font_34, font=sans_font_34,
fill=first_color, fill=first_color,
anchor='lm', anchor="lm",
) )
grey_bar_bg1_draw.text( grey_bar_bg1_draw.text(
(540, 70), (540, 70),
f'{delta_hour}小时{delta_minute}分钟后获取刷新次数', f"{delta_hour}小时{delta_minute}分钟后获取刷新次数",
font=sans_font_18, font=sans_font_18,
fill=first_color, fill=first_color,
anchor='rm', anchor="rm",
) )
grey_bar_bg1_draw.text( grey_bar_bg1_draw.text(
xy=(777, 58), xy=(777, 58),
text='联络中', text="联络中",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='rm', anchor="rm",
) )
img.paste(grey_bar_bg1_img, (-20, 910), grey_bar_bg1_img) img.paste(grey_bar_bg1_img, (-20, 910), grey_bar_bg1_img)
else: else:
@ -240,24 +246,24 @@ async def draw_ap_img(uid: str) -> Image.Image:
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(
(170, 60), (170, 60),
'公开招募刷新', "公开招募刷新",
font=sans_font_34, font=sans_font_34,
fill=first_color, fill=first_color,
anchor='lm', anchor="lm",
) )
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
(540, 70), (540, 70),
'可进行公开招募刷新', "可进行公开招募刷新",
font=sans_font_18, font=sans_font_18,
fill=first_color, fill=first_color,
anchor='rm', anchor="rm",
) )
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
xy=(777, 58), xy=(777, 58),
text='可刷新', text="可刷新",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='rm', anchor="rm",
) )
img.paste(blue_bar_bg1_img, (-20, 910), blue_bar_bg1_img) img.paste(blue_bar_bg1_img, (-20, 910), blue_bar_bg1_img)
else: else:
@ -265,10 +271,10 @@ async def draw_ap_img(uid: str) -> Image.Image:
grey_bar_bg1_draw = ImageDraw.Draw(grey_bar_bg1_img) grey_bar_bg1_draw = ImageDraw.Draw(grey_bar_bg1_img)
grey_bar_bg1_draw.text( grey_bar_bg1_draw.text(
(170, 60), (170, 60),
'暂无数据', "暂无数据",
font=sans_font_34, font=sans_font_34,
fill=first_color, fill=first_color,
anchor='lm', anchor="lm",
) )
img.paste(grey_bar_bg1_img, (-20, 910), grey_bar_bg1_img) img.paste(grey_bar_bg1_img, (-20, 910), grey_bar_bg1_img)
@ -286,24 +292,24 @@ async def draw_ap_img(uid: str) -> Image.Image:
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(
(170, 60), (170, 60),
'训练室', "训练室",
font=sans_font_34, font=sans_font_34,
fill=first_color, fill=first_color,
anchor='lm', anchor="lm",
) )
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
(540, 70), (540, 70),
f'{remain_time}后完成专精' if remain_secs != -1 else '设备空闲中', f"{remain_time}后完成专精" if remain_secs != -1 else "设备空闲中",
font=sans_font_18, font=sans_font_18,
fill=first_color, fill=first_color,
anchor='rm', anchor="rm",
) )
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
xy=(777, 58), xy=(777, 58),
text=f'{char_cn_name}', text=f"{char_cn_name}",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='rm', anchor="rm",
) )
img.paste(blue_bar_bg1_img, (-20, 1020), blue_bar_bg1_img) img.paste(blue_bar_bg1_img, (-20, 1020), blue_bar_bg1_img)
else: else:
@ -311,24 +317,24 @@ async def draw_ap_img(uid: str) -> Image.Image:
grey_bar_bg1_draw = ImageDraw.Draw(grey_bar_bg1_img) grey_bar_bg1_draw = ImageDraw.Draw(grey_bar_bg1_img)
grey_bar_bg1_draw.text( grey_bar_bg1_draw.text(
(170, 60), (170, 60),
'训练室', "训练室",
font=sans_font_34, font=sans_font_34,
fill=first_color, fill=first_color,
anchor='lm', anchor="lm",
) )
grey_bar_bg1_draw.text( grey_bar_bg1_draw.text(
(540, 70), (540, 70),
'设备空闲中', "设备空闲中",
font=sans_font_18, font=sans_font_18,
fill=first_color, fill=first_color,
anchor='rm', anchor="rm",
) )
grey_bar_bg1_draw.text( grey_bar_bg1_draw.text(
xy=(777, 58), xy=(777, 58),
text='无干员', text="无干员",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='rm', anchor="rm",
) )
img.paste(grey_bar_bg1_img, (-20, 1020), grey_bar_bg1_img) img.paste(grey_bar_bg1_img, (-20, 1020), grey_bar_bg1_img)
@ -341,10 +347,10 @@ async def draw_ap_img(uid: str) -> Image.Image:
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(
(170, 60), (170, 60),
'每周报酬合成玉', "每周报酬合成玉",
font=sans_font_34, font=sans_font_34,
fill=first_color, fill=first_color,
anchor='lm', anchor="lm",
) )
# 获取当前时间与下一周周一早上4点的时间差, 转换为几天几小时 # 获取当前时间与下一周周一早上4点的时间差, 转换为几天几小时
@ -356,18 +362,18 @@ async def draw_ap_img(uid: str) -> Image.Image:
delta_hour = delta.seconds // 3600 delta_hour = delta.seconds // 3600
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
(540, 70), (540, 70),
f'{delta_day}{delta_hour}小时后刷新', f"{delta_day}{delta_hour}小时后刷新",
font=sans_font_18, font=sans_font_18,
fill=first_color, fill=first_color,
anchor='rm', anchor="rm",
) )
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
xy=(777, 58), xy=(777, 58),
text=f'{campaign_reward.current}/{campaign_reward.total}', text=f"{campaign_reward.current}/{campaign_reward.total}",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='rm', anchor="rm",
) )
img.paste(blue_bar_bg1_img, (-20, 1130), blue_bar_bg1_img) img.paste(blue_bar_bg1_img, (-20, 1130), blue_bar_bg1_img)
@ -387,24 +393,24 @@ async def draw_ap_img(uid: str) -> Image.Image:
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(
(170, 60), (170, 60),
'每日任务', "每日任务",
font=sans_font_34, font=sans_font_34,
fill=first_color, fill=first_color,
anchor='lm', anchor="lm",
) )
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
(540, 70), (540, 70),
f'{delta_hour}小时{delta_minute}分钟后刷新', f"{delta_hour}小时{delta_minute}分钟后刷新",
font=sans_font_18, font=sans_font_18,
fill=first_color, fill=first_color,
anchor='rm', anchor="rm",
) )
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
xy=(777, 58), xy=(777, 58),
text=f'{routine_daily.current}/{routine_daily.total}', text=f"{routine_daily.current}/{routine_daily.total}",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='rm', anchor="rm",
) )
img.paste(blue_bar_bg1_img, (-20, 1240), blue_bar_bg1_img) img.paste(blue_bar_bg1_img, (-20, 1240), blue_bar_bg1_img)
@ -424,24 +430,24 @@ async def draw_ap_img(uid: str) -> Image.Image:
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(
(170, 60), (170, 60),
'每周任务', "每周任务",
font=sans_font_34, font=sans_font_34,
fill=first_color, fill=first_color,
anchor='lm', anchor="lm",
) )
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
(540, 70), (540, 70),
f'{delta_day}{delta_hour}小时后刷新', f"{delta_day}{delta_hour}小时后刷新",
font=sans_font_18, font=sans_font_18,
fill=first_color, fill=first_color,
anchor='rm', anchor="rm",
) )
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
xy=(777, 58), xy=(777, 58),
text=f'{routine_weekly.current}/{routine_weekly.total}', text=f"{routine_weekly.current}/{routine_weekly.total}",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='rm', anchor="rm",
) )
img.paste(blue_bar_bg1_img, (-20, 1350), blue_bar_bg1_img) img.paste(blue_bar_bg1_img, (-20, 1350), blue_bar_bg1_img)
@ -462,24 +468,24 @@ async def draw_ap_img(uid: str) -> Image.Image:
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(
(170, 60), (170, 60),
'数据增补仪', "数据增补仪",
font=sans_font_34, font=sans_font_34,
fill=first_color, fill=first_color,
anchor='lm', anchor="lm",
) )
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
(540, 70), (540, 70),
f'{delta_day}{delta_hour}小时后刷新', f"{delta_day}{delta_hour}小时后刷新",
font=sans_font_18, font=sans_font_18,
fill=first_color, fill=first_color,
anchor='rm', anchor="rm",
) )
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
xy=(777, 58), xy=(777, 58),
text=f'{higher_item.current}/{higher_item.total}', text=f"{higher_item.current}/{higher_item.total}",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='rm', anchor="rm",
) )
img.paste(blue_bar_bg1_img, (-20, 1460), blue_bar_bg1_img) img.paste(blue_bar_bg1_img, (-20, 1460), blue_bar_bg1_img)
@ -491,34 +497,34 @@ async def draw_ap_img(uid: str) -> Image.Image:
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(
(170, 60), (170, 60),
'数据增补条', "数据增补条",
font=sans_font_34, font=sans_font_34,
fill=first_color, fill=first_color,
anchor='lm', anchor="lm",
) )
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
(540, 70), (540, 70),
f'{delta_day}{delta_hour}小时后刷新', f"{delta_day}{delta_hour}小时后刷新",
font=sans_font_18, font=sans_font_18,
fill=first_color, fill=first_color,
anchor='rm', anchor="rm",
) )
blue_bar_bg1_draw.text( blue_bar_bg1_draw.text(
xy=(777, 58), xy=(777, 58),
text=f'{lower_item.current}/{lower_item.total}', text=f"{lower_item.current}/{lower_item.total}",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='rm', anchor="rm",
) )
img.paste(blue_bar_bg1_img, (-20, 1570), blue_bar_bg1_img) img.paste(blue_bar_bg1_img, (-20, 1570), blue_bar_bg1_img)
img_draw = ImageDraw.Draw(img) img_draw = ImageDraw.Draw(img)
img_draw.text( img_draw.text(
(425, 1710), (425, 1710),
'Powerd By ArknightsUID | GsCore', "Powerd By ArknightsUID | GsCore",
font=sans_font_26, font=sans_font_26,
fill=first_color, fill=first_color,
anchor='mm', anchor="mm",
) )
return img return img

View File

@ -9,11 +9,11 @@ from ..utils.database.models import ArknightsPush, ArknightsUser
from ..utils.models.skland.models import ArknightsPlayerInfoModel from ..utils.models.skland.models import ArknightsPlayerInfoModel
from .utils import now_ap from .utils import now_ap
MR_NOTICE = '\n可发送[arkmr]或者[ark每日]来查看更多信息!\n' MR_NOTICE = "\n可发送[arkmr]或者[ark每日]来查看更多信息!\n"
NOTICE = { NOTICE = {
'ap': f'你的理智快满啦!{MR_NOTICE}', "ap": f"你的理智快满啦!{MR_NOTICE}",
'training': f'你的专精即将可收取!{MR_NOTICE}', "training": f"你的专精即将可收取!{MR_NOTICE}",
} }
@ -25,7 +25,7 @@ async def get_notice_list() -> Dict[str, Dict[str, Dict]]:
if user.uid is not None: if user.uid is not None:
raw_data = await ark_skd_api.get_game_player_info(user.uid) raw_data = await ark_skd_api.get_game_player_info(user.uid)
if isinstance(raw_data, int): if isinstance(raw_data, int):
logger.error(f'[ark推送提醒]获取{user.uid}的数据失败!') logger.error(f"[ark推送提醒]获取{user.uid}的数据失败!")
continue continue
push_data = await ArknightsPush.select_push_data(user.uid) push_data = await ArknightsPush.select_push_data(user.uid)
msg_dict = await all_check( msg_dict = await all_check(
@ -49,48 +49,48 @@ async def all_check(
) -> 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:
if arkconfig.get_config('CrazyNotice').data: if arkconfig.get_config("CrazyNotice").data:
if not await check(mode, raw_data, push_data[f'{mode}_value']): if not await check(mode, raw_data, push_data[f"{mode}_value"]):
await ArknightsPush.update_push_data( await ArknightsPush.update_push_data(
uid, uid,
{f'{mode}_is_push': False}, {f"{mode}_is_push": False},
) )
continue continue
# 准备推送 # 准备推送
if await check(mode, raw_data, push_data[f'{mode}_value']): if await check(mode, raw_data, push_data[f"{mode}_value"]):
if push_data[f'{mode}_push'] is False: if push_data[f"{mode}_push"] is False:
pass pass
# on 推送到私聊 # on 推送到私聊
else: else:
# 初始化 # 初始化
if bot_id not in msg_dict: if bot_id not in msg_dict:
msg_dict[bot_id] = {'direct': {}, 'group': {}} msg_dict[bot_id] = {"direct": {}, "group": {}}
if push_data[f'{mode}_push'] is True: if push_data[f"{mode}_push"] is True:
# 添加私聊信息 # 添加私聊信息
if user_id not in msg_dict[bot_id]['direct']: if user_id not in msg_dict[bot_id]["direct"]:
msg_dict[bot_id]['direct'][user_id] = NOTICE[mode] msg_dict[bot_id]["direct"][user_id] = NOTICE[mode]
else: else:
msg_dict[bot_id]['direct'][user_id] += NOTICE[mode] msg_dict[bot_id]["direct"][user_id] += NOTICE[mode]
await ArknightsPush.update_push_data(uid, {f'{mode}_is_push': True}) await ArknightsPush.update_push_data(uid, {f"{mode}_is_push": True})
# 群号推送到群聊 # 群号推送到群聊
else: else:
# 初始化 # 初始化
gid = push_data[f'{mode}_push'] gid = push_data[f"{mode}_push"]
if gid not in msg_dict[bot_id]['group']: if gid not in msg_dict[bot_id]["group"]:
msg_dict[bot_id]['group'][gid] = {} msg_dict[bot_id]["group"][gid] = {}
if user_id not in msg_dict[bot_id]['group'][gid]: if user_id not in msg_dict[bot_id]["group"][gid]:
msg_dict[bot_id]['group'][gid][user_id] = NOTICE[mode] msg_dict[bot_id]["group"][gid][user_id] = NOTICE[mode]
else: else:
msg_dict[bot_id]['group'][gid][user_id] += NOTICE[mode] msg_dict[bot_id]["group"][gid][user_id] += NOTICE[mode]
await ArknightsPush.update_push_data(uid, {f'{mode}_is_push': True}) await ArknightsPush.update_push_data(uid, {f"{mode}_is_push": True})
return msg_dict return msg_dict
async def check(mode: str, data: ArknightsPlayerInfoModel, limit: int) -> bool: async def check(mode: str, data: ArknightsPlayerInfoModel, limit: int) -> bool:
if mode == 'ap': if mode == "ap":
current_ap = now_ap(data.status.ap) current_ap = now_ap(data.status.ap)
if current_ap >= limit: if current_ap >= limit:
return True return True
@ -98,7 +98,7 @@ async def check(mode: str, data: ArknightsPlayerInfoModel, limit: int) -> bool:
return True return True
else: else:
return False return False
if mode == 'training': if mode == "training":
if data.building.training: if data.building.training:
remain_secs = data.building.training.remainSecs remain_secs = data.building.training.remainSecs
if remain_secs <= limit * 60: if remain_secs <= limit * 60:

View File

@ -7,7 +7,7 @@ from ..utils.models.skland.models import PlayerStatusAp
def seconds2hours_zhcn(seconds: int) -> str: def seconds2hours_zhcn(seconds: int) -> str:
m, s = divmod(int(seconds), 60) m, s = divmod(int(seconds), 60)
h, m = divmod(m, 60) h, m = divmod(m, 60)
return '%02d小时%02d分钟' % (h, m) return "%02d小时%02d分钟" % (h, m)
def now_ap(ap: PlayerStatusAp) -> int: def now_ap(ap: PlayerStatusAp) -> int:

View File

@ -9,7 +9,7 @@ from gsuid_core.utils.error_reply import UID_HINT
from ..utils.database.models import ArknightsBind from ..utils.database.models import ArknightsBind
from .set_config import set_config_func, set_push_value from .set_config import set_config_func, set_push_value
sv_self_config = SV('ark配置') sv_self_config = SV("ark配置")
# @sv_self_config.on_fullmatch(("ark配置", "方舟配置")) # @sv_self_config.on_fullmatch(("ark配置", "方舟配置"))
@ -19,46 +19,46 @@ sv_self_config = SV('ark配置')
# await bot.send(im) # await bot.send(im)
@sv_self_config.on_prefix(('ark设置')) # noqa: UP034 @sv_self_config.on_prefix(("ark设置")) # noqa: UP034
async def send_config_ev(bot: Bot, ev: Event): async def send_config_ev(bot: Bot, ev: Event):
logger.info('开始执行[设置阈值信息]') logger.info("开始执行[设置阈值信息]")
uid = await ArknightsBind.get_uid_by_game(ev.user_id, bot.bot_id) uid = await ArknightsBind.get_uid_by_game(ev.user_id, bot.bot_id)
if uid is None: if uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
func = ''.join(re.findall('[\u4e00-\u9fa5]', ev.text.replace('阈值', ''))) func = "".join(re.findall("[\u4e00-\u9fa5]", ev.text.replace("阈值", "")))
value = re.findall(r'\d+', ev.text) value = re.findall(r"\d+", ev.text)
value = value[0] if value else None value = value[0] if value else None
if value is None: if value is None:
return await bot.send('请输入正确的阈值数字...') return await bot.send("请输入正确的阈值数字...")
logger.info(f'[设置阈值信息]func: {func}, value: {value}') logger.info(f"[设置阈值信息]func: {func}, value: {value}")
im = await set_push_value(ev.bot_id, func, uid, int(value)) im = await set_push_value(ev.bot_id, func, uid, int(value))
await bot.send(im) await bot.send(im)
# 开启 自动签到 功能 # 开启 自动签到 功能
@sv_self_config.on_prefix(('ark开启', 'ark关闭')) @sv_self_config.on_prefix(("ark开启", "ark关闭"))
async def open_switch_func(bot: Bot, ev: Event): async def open_switch_func(bot: Bot, ev: Event):
user_id = ev.user_id user_id = ev.user_id
config_name = ev.text config_name = ev.text
logger.info(f'[{user_id}]尝试[{ev.command[2:]}]了[{ev.text}]功能') logger.info(f"[{user_id}]尝试[{ev.command[2:]}]了[{ev.text}]功能")
if ev.command == 'ark开启': if ev.command == "ark开启":
query = True query = True
gid = ev.group_id if ev.group_id else 'on' gid = ev.group_id if ev.group_id else "on"
else: else:
query = False query = False
gid = 'off' gid = "off"
is_admin = ev.user_pm <= 2 is_admin = ev.user_pm <= 2
if ev.at and is_admin: if ev.at and is_admin:
user_id = ev.at user_id = ev.at
elif ev.at: elif ev.at:
return await bot.send('你没有权限...') return await bot.send("你没有权限...")
uid = await ArknightsBind.get_uid_by_game(ev.user_id, bot.bot_id) uid = await ArknightsBind.get_uid_by_game(ev.user_id, bot.bot_id)
if uid is None: if uid is None:

View File

@ -3,4 +3,4 @@ from gsuid_core.utils.plugins_config.gs_config import StringConfig
from ..utils.resource.RESOURCE_PATH import CONFIG_PATH from ..utils.resource.RESOURCE_PATH import CONFIG_PATH
from .config_default import CONIFG_DEFAULT from .config_default import CONIFG_DEFAULT
arkconfig = StringConfig('ArknightsUID', CONFIG_PATH, CONIFG_DEFAULT) arkconfig = StringConfig("ArknightsUID", CONFIG_PATH, CONIFG_DEFAULT)

View File

@ -7,25 +7,27 @@ from gsuid_core.utils.plugins_config.models import (
) )
CONIFG_DEFAULT: Dict[str, GSC] = { CONIFG_DEFAULT: Dict[str, GSC] = {
'SignTime': GsListStrConfig('每晚签到时间设置', '每晚森空岛签到时间设置(时,分)', ['0', '38']), "SignTime": GsListStrConfig(
'SignReportSimple': GsBoolConfig( "每晚签到时间设置", "每晚森空岛签到时间设置(时,分)", ["0", "38"]
'简洁签到报告', ),
'开启后可以大大减少每日签到报告字数', "SignReportSimple": GsBoolConfig(
"简洁签到报告",
"开启后可以大大减少每日签到报告字数",
True, True,
), ),
'SchedSignin': GsBoolConfig( "SchedSignin": GsBoolConfig(
'定时签到', "定时签到",
'开启后每晚00:30将开始自动签到任务', "开启后每晚00:30将开始自动签到任务",
True, True,
), ),
'ArknightsPrefix': GsStrConfig( "ArknightsPrefix": GsStrConfig(
'插件命令前缀(确认无冲突再修改)', "插件命令前缀(确认无冲突再修改)",
'用于本插件的前缀设定', "用于本插件的前缀设定",
'ark', "ark",
), ),
'CrazyNotice': GsBoolConfig( "CrazyNotice": GsBoolConfig(
'催命模式', "催命模式",
'开启后当达到推送阈值将会一直推送', "开启后当达到推送阈值将会一直推送",
False, False,
), ),
} }

View File

@ -7,13 +7,13 @@ from .ark_config import arkconfig
from .config_default import CONIFG_DEFAULT from .config_default import CONIFG_DEFAULT
PUSH_MAP = { PUSH_MAP = {
'理智': 'ap', "理智": "ap",
'训练室': 'train', "训练室": "train",
'版本更新': 'version', "版本更新": "version",
} }
PRIV_MAP = { PRIV_MAP = {
'自动签到': 'sign', "自动签到": "sign",
'推送': 'push', "推送": "push",
} }
@ -21,20 +21,20 @@ async def set_push_value(bot_id: str, func: str, uid: str, value: int):
if func in PUSH_MAP: if func in PUSH_MAP:
status = PUSH_MAP[func] status = PUSH_MAP[func]
else: else:
return '该配置项不存在!' return "该配置项不存在!"
logger.info(f'[设置推送阈值]func: {status}, value: {value}') logger.info(f"[设置推送阈值]func: {status}, value: {value}")
if await ArknightsPush.update_push_data(uid, {f'{status}_value': value}): if await ArknightsPush.update_push_data(uid, {f"{status}_value": value}):
return f'设置成功!\n当前{func}推送阈值:{value}' return f"设置成功!\n当前{func}推送阈值:{value}"
else: else:
return '设置失败!\n请检查参数是否正确!' return "设置失败!\n请检查参数是否正确!"
async def set_config_func( async def set_config_func(
bot_id: str, bot_id: str,
config_name: str = '', config_name: str = "",
uid: str = '0', uid: str = "0",
user_id: str = '', user_id: str = "",
option: str = '0', option: str = "0",
query: Optional[bool] = None, query: Optional[bool] = None,
is_admin: bool = False, is_admin: bool = False,
): ):
@ -46,17 +46,17 @@ async def set_config_func(
break break
else: else:
logger.info( logger.info(
f'uid: {uid}, option: {option}, config_name: {config_name}', f"uid: {uid}, option: {option}, config_name: {config_name}",
) )
if config_name in PRIV_MAP: if config_name in PRIV_MAP:
# 执行设置 # 执行设置
await ArknightsUser.update_user_data( await ArknightsUser.update_user_data(
uid, uid,
{ {
f'{PRIV_MAP[config_name]}_switch': option, f"{PRIV_MAP[config_name]}_switch": option,
}, },
) )
elif config_name.replace('推送', '') in PUSH_MAP: elif config_name.replace("推送", "") in PUSH_MAP:
await ArknightsPush.update_push_data( await ArknightsPush.update_push_data(
uid, uid,
{ {
@ -64,24 +64,24 @@ async def set_config_func(
}, },
) )
else: else:
return '该配置项不存在!' return "该配置项不存在!"
if option == 'on': if option == "on":
succeed_msg = '开启至私聊消息!' succeed_msg = "开启至私聊消息!"
elif option == 'off': elif option == "off":
succeed_msg = '关闭!' succeed_msg = "关闭!"
else: else:
succeed_msg = f'开启至群{option}' succeed_msg = f"开启至群{option}"
return f'{config_name}{succeed_msg}' return f"{config_name}{succeed_msg}"
if is_admin: if is_admin:
logger.info(f'config_name:{config_name},query:{query}') logger.info(f"config_name:{config_name},query:{query}")
# 执行设置 # 执行设置
if query is not None: if query is not None:
arkconfig.set_config(name, query) arkconfig.set_config(name, query)
im = '成功设置{}{}'.format(config_name, '' if query else '') im = "成功设置{}{}".format(config_name, "" if query else "")
else: else:
im = '未传入参数query!' im = "未传入参数query!"
else: else:
im = '只有管理员才能设置群服务。' im = "只有管理员才能设置群服务。"
return im return im

View File

@ -6,11 +6,11 @@ from gsuid_core.sv import SV
from ..utils.ark_prefix import PREFIX from ..utils.ark_prefix import PREFIX
from .get_help import get_core_help from .get_help import get_core_help
sv_ark_help = SV('ark帮助') sv_ark_help = SV("ark帮助")
@sv_ark_help.on_fullmatch((f'{PREFIX}帮助')) # noqa: UP034 @sv_ark_help.on_fullmatch((f"{PREFIX}帮助")) # noqa: UP034
async def send_help_img(bot: Bot, ev: Event): async def send_help_img(bot: Bot, ev: Event):
logger.info('开始执行[ark帮助]') logger.info("开始执行[ark帮助]")
im = await get_core_help() im = await get_core_help()
await bot.send(im) await bot.send(im)

View File

@ -8,15 +8,19 @@ from msgspec import json as msgjson
from PIL import Image from PIL import Image
from ..utils.fonts.source_han_sans import source_han_sans_cn_origin from ..utils.fonts.source_han_sans import source_han_sans_cn_origin
from ..version import Arknights_Client_version, Arknights_Res_version, ArknightsUID_version from ..version import (
Arknights_Client_version,
Arknights_Res_version,
ArknightsUID_version,
)
TEXT_PATH = Path(__file__).parent / 'texture2d' 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() -> Union[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],
@ -26,20 +30,21 @@ async def get_help_data() -> Union[Dict[str, PluginHelp], None]:
async def get_core_help() -> Union[bytes, str]: async def get_core_help() -> Union[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 "暂未找到帮助数据..."
img = await get_help( img = await get_help(
'ArknightsUID', "ArknightsUID",
f'版本号:{ArknightsUID_version}', f"版本号:{ArknightsUID_version}",
help_data, help_data,
Image.open(TEXT_PATH / 'bg.jpg'), Image.open(TEXT_PATH / "bg.jpg"),
Image.open(TEXT_PATH / 'icon.png'), Image.open(TEXT_PATH / "icon.png"),
Image.open(TEXT_PATH / 'badge.png'), Image.open(TEXT_PATH / "badge.png"),
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} ' f' Res version: {Arknights_Res_version}' f"Client Version:{Arknights_Client_version} "
f" Res version: {Arknights_Res_version}"
], ],
) )
return img return img

View File

@ -23,7 +23,7 @@
# sv_get_version_admin = SV('ark推送版本更新', pm=1) # sv_get_version_admin = SV('ark推送版本更新', pm=1)
# @sv_get_version_admin.on_fullmatch((f'{PREFIX}开启推送版本更新')) # noqa: UP034 # @sv_get_version_admin.on_fullmatch((f'{PREFIX}开启推送版本更新'))
# async def force_version_job(bot: Bot, ev: Event): # async def force_version_job(bot: Bot, ev: Event):
# await bot.logger.info('开始执行[ark推送版本更新]') # await bot.logger.info('开始执行[ark推送版本更新]')
# await ark_version_job() # await ark_version_job()

View File

@ -6,17 +6,17 @@ from gsuid_core.plugins.ArknightsUID.ArknightsUID.utils.resource.download_all_re
) )
from gsuid_core.sv import SV from gsuid_core.sv import SV
sv_download_config = SV('下载资源', pm=2) sv_download_config = SV("下载资源", pm=2)
@sv_download_config.on_fullmatch(('ark下载全部资源')) # noqa: UP034 @sv_download_config.on_fullmatch(("ark下载全部资源")) # noqa: UP034
async def send_download_resource_msg(bot: Bot, ev: Event): async def send_download_resource_msg(bot: Bot, ev: Event):
await bot.send('正在开始下载~可能需要较久的时间!') await bot.send("正在开始下载~可能需要较久的时间!")
im = await download_all_resource() im = await download_all_resource()
await bot.send(im) await bot.send(im)
async def startup(): async def startup():
logger.info('[资源文件下载] 正在检查与下载缺失的资源文件, 可能需要较长时间, 请稍等') logger.info("[资源文件下载] 正在检查与下载缺失的资源文件, 可能需要较长时间, 请稍等")
await download_all_resource() await download_all_resource()
logger.info('[资源文件下载] 完毕') logger.info("[资源文件下载] 完毕")

View File

@ -1,9 +1,10 @@
import asyncio
from pathlib import Path from pathlib import Path
import json import json
import threading
from ..utils.resource.download_all_resource import download_all_resource
from ..utils.resource.RESOURCE_PATH import GAMEDATA_PATH from ..utils.resource.RESOURCE_PATH import GAMEDATA_PATH
from ..utils.models.gamedata.ActivityTable import ActivityTable
from ..utils.models.gamedata.AudioData import AudioData
from ..utils.models.gamedata.BattleEquipTable import BattleEquipTable from ..utils.models.gamedata.BattleEquipTable import BattleEquipTable
from ..utils.models.gamedata.BuildingData import BuildingData from ..utils.models.gamedata.BuildingData import BuildingData
from ..utils.models.gamedata.CampaignTable import CampaignTable from ..utils.models.gamedata.CampaignTable import CampaignTable
@ -18,7 +19,6 @@ from ..utils.models.gamedata.ClimbTowerTable import ClimbTowerTable
from ..utils.models.gamedata.ClueData import ClueData from ..utils.models.gamedata.ClueData import ClueData
from ..utils.models.gamedata.CrisisTable import CrisisTable from ..utils.models.gamedata.CrisisTable import CrisisTable
from ..utils.models.gamedata.CrisisV2Table import CrisisV2Table from ..utils.models.gamedata.CrisisV2Table import CrisisV2Table
from ..utils.models.gamedata.DisplayMetaTable import DisplayMetaTable
from ..utils.models.gamedata.EnemyHandbookTable import EnemyHandbookTable from ..utils.models.gamedata.EnemyHandbookTable import EnemyHandbookTable
from ..utils.models.gamedata.FavorTable import FavorTable from ..utils.models.gamedata.FavorTable import FavorTable
from ..utils.models.gamedata.GachaTable import GachaTable from ..utils.models.gamedata.GachaTable import GachaTable
@ -60,82 +60,124 @@ 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.
""" """
try: try:
with Path.open(file_path, encoding='UTF-8', **kwargs) as file: with Path.open(file_path, encoding="UTF-8", **kwargs) as file:
return json.load(file) return json.load(file)
except (FileNotFoundError, json.JSONDecodeError) as e: except (FileNotFoundError, json.JSONDecodeError) as e:
logger.error(f'Error reading JSON file: {e}') logger.error(f"Error reading JSON file: {e}")
return {} return {}
threading.Thread(
target=lambda: asyncio.run(download_all_resource()), daemon=True
).start()
# ACTIVITY_TABLE = ActivityTable.convert(read_json(GAMEDATA_PATH / 'activity_table.json')) # ACTIVITY_TABLE = ActivityTable.convert(read_json(GAMEDATA_PATH / 'activity_table.json'))
# AUDIO_DATA = AudioData.convert(read_json(GAMEDATA_PATH / 'audio_data.json')) # AUDIO_DATA = AudioData.convert(read_json(GAMEDATA_PATH / 'audio_data.json'))
BATTLE_EQUIP_TABLE = BattleEquipTable.convert( BATTLE_EQUIP_TABLE = BattleEquipTable.convert(
{'equips': read_json(GAMEDATA_PATH / 'battle_equip_table.json')} {"equips": read_json(GAMEDATA_PATH / "battle_equip_table.json")}
) )
BUILDING_DATA = BuildingData.convert(read_json(GAMEDATA_PATH / 'building_data.json')) BUILDING_DATA = BuildingData.convert(read_json(GAMEDATA_PATH / "building_data.json"))
CAMPAIGN_TABLE = CampaignTable.convert(read_json(GAMEDATA_PATH / 'campaign_table.json')) CAMPAIGN_TABLE = CampaignTable.convert(read_json(GAMEDATA_PATH / "campaign_table.json"))
CHAPTER_TABLE = ChapterTable.convert({'chapters': read_json(GAMEDATA_PATH / 'chapter_table.json')}) CHAPTER_TABLE = ChapterTable.convert(
CHARACTER_TABLE = CharacterTable.convert({'chars': read_json(GAMEDATA_PATH / 'character_table.json')}) {"chapters": read_json(GAMEDATA_PATH / "chapter_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')) CHARACTER_TABLE = CharacterTable.convert(
CHAR_PATH_TABLE = CharPatchTable.convert(read_json(GAMEDATA_PATH / 'char_patch_table.json')) {"chars": read_json(GAMEDATA_PATH / "character_table.json")}
CHARWORD_TABLE = CharwordTable.convert(read_json(GAMEDATA_PATH / 'charword_table.json')) )
CHECKIN_TABLE = CheckinTable.convert(read_json(GAMEDATA_PATH / 'checkin_table.json')) CHAR_META_TABLE = CharMetaTable.convert(
CLIMB_TOWER_TABLE = ClimbTowerTable.convert(read_json(GAMEDATA_PATH / 'climb_tower_table.json')) read_json(GAMEDATA_PATH / "char_meta_table.json")
CLUE_DATA = ClueData.convert(read_json(GAMEDATA_PATH / 'clue_data.json')) )
CRISIS_TABLE = CrisisTable.convert(read_json(GAMEDATA_PATH / 'crisis_table.json')) CHARM_TABLE = CharmTable.convert(read_json(GAMEDATA_PATH / "charm_table.json"))
CRISIS_V2_TABLE = CrisisV2Table.convert(read_json(GAMEDATA_PATH / 'crisis_v2_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')) # 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')) 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')) FAVOR_TABLE = FavorTable.convert(read_json(GAMEDATA_PATH / "favor_table.json"))
MEDAL_TABLE = MedalTable.convert(read_json(GAMEDATA_PATH / 'medal_table.json')) GACHA_TABLE = GachaTable.convert(read_json(GAMEDATA_PATH / "gacha_table.json"))
MISSION_TABLE = MissionTable.convert(read_json(GAMEDATA_PATH / 'mission_table.json')) GAMEDATA_CONST = GamedataConst.convert(read_json(GAMEDATA_PATH / "gamedata_const.json"))
OPEN_SERVER_TABLE = OpenServerTable.convert(read_json(GAMEDATA_PATH / 'open_server_table.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")}
)
PLAYER_AVATAR_TABLE = PlayerAvatarTable.convert(read_json(GAMEDATA_PATH / 'player_avatar_table.json')) # ITEM_TABLE = ItemTable.convert(read_json(GAMEDATA_PATH / "item_table.json"))
RANGE_TABLE = RangeTable.convert({'range_': read_json(GAMEDATA_PATH / 'range_table.json')}) MEDAL_TABLE = MedalTable.convert(read_json(GAMEDATA_PATH / "medal_table.json"))
REPLICATE_TABLE = ReplicateTable.convert({'replicate': read_json(GAMEDATA_PATH / 'replicate_table.json')}) MISSION_TABLE = MissionTable.convert(read_json(GAMEDATA_PATH / "mission_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')) OPEN_SERVER_TABLE = OpenServerTable.convert(
SANDBOX_PERM_TABLE = SandboxPermTable.convert(read_json(GAMEDATA_PATH / 'sandbox_perm_table.json')) read_json(GAMEDATA_PATH / "open_server_table.json")
SHOP_CLIENT_TABLE = ShopClientTable.convert(read_json(GAMEDATA_PATH / 'shop_client_table.json')) )
SKILL_TABLE = SkillTable.convert({'skills': read_json(GAMEDATA_PATH / 'skill_table.json')})
SKIN_TABLE = SkinTable.convert(read_json(GAMEDATA_PATH / 'skin_table.json')) PLAYER_AVATAR_TABLE = PlayerAvatarTable.convert(
STAGE_TABLE = StageTable.convert(read_json(GAMEDATA_PATH / 'stage_table.json')) 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(GAMEDATA_PATH / "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( STORY_REVIEW_META_TABLE = StoryReviewMetaTable.convert(
read_json(GAMEDATA_PATH / 'story_review_meta_table.json') read_json(GAMEDATA_PATH / "story_review_meta_table.json")
) )
STORY_REVIEW_TABLE = StoryReviewTable.convert( STORY_REVIEW_TABLE = StoryReviewTable.convert(
{'storyreviewtable': read_json(GAMEDATA_PATH / 'story_review_table.json')} {"storyreviewtable": read_json(GAMEDATA_PATH / "story_review_table.json")}
)
STORY_TABLE = StoryTable.convert(
{"stories": read_json(GAMEDATA_PATH / "story_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')) TECH_BUFF_TABLE = TechBuffTable.convert(
TIP_TABLE = TipTable.convert(read_json(GAMEDATA_PATH / 'tip_table.json')) read_json(GAMEDATA_PATH / "tech_buff_table.json")
TOKEN_TABLE = TokenTable.convert({'tokens': read_json(GAMEDATA_PATH / 'token_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_DATA = UniequipData.convert(read_json(GAMEDATA_PATH / "uniequip_data.json"))
UNIEQUIP_TABLE = UniEquipTable.convert(read_json(GAMEDATA_PATH / 'uniequip_table.json')) UNIEQUIP_TABLE = UniEquipTable.convert(read_json(GAMEDATA_PATH / "uniequip_table.json"))
ZONE_TABLE = ZoneTable.convert(read_json(GAMEDATA_PATH / 'zone_table.json')) ZONE_TABLE = ZoneTable.convert(read_json(GAMEDATA_PATH / "zone_table.json"))

View File

@ -7,14 +7,14 @@ from ..utils.ark_prefix import PREFIX
from ..utils.database.models import ArknightsBind from ..utils.database.models import ArknightsBind
from .draw_roleinfo_card import get_role_img from .draw_roleinfo_card import get_role_img
sv_get_info = SV('ark查询信息') sv_get_info = SV("ark查询信息")
@sv_get_info.on_command((f'{PREFIX}uid')) # noqa: UP034 @sv_get_info.on_command((f"{PREFIX}uid")) # noqa: UP034
async def send_role_info(bot: Bot, ev: Event): async def send_role_info(bot: Bot, ev: Event):
uid = await get_uid(bot, ev, bind_model=ArknightsBind) uid = await get_uid(bot, ev, bind_model=ArknightsBind)
if uid is None: if uid is None:
return '你还没有绑定UID噢,请使用[ark绑定uid123]完成绑定!' return "你还没有绑定UID噢,请使用[ark绑定uid123]完成绑定!"
await bot.logger.info('开始执行[ark查询信息]') await bot.logger.info("开始执行[ark查询信息]")
await bot.send(await get_role_img(uid)) await bot.send(await get_role_img(uid))

View File

@ -10,9 +10,9 @@ from ..utils.ark_api import ark_skd_api
from ..utils.fonts.source_han_serif import sans_font_28 from ..utils.fonts.source_han_serif import sans_font_28
from ..utils.resource.RESOURCE_PATH import SKINPACK_PATH from ..utils.resource.RESOURCE_PATH import SKINPACK_PATH
TEXT_PATH = Path(__file__).parent / 'texture2D' TEXT_PATH = Path(__file__).parent / "texture2D"
bg_img = Image.open(TEXT_PATH / 'bg.png') bg_img = Image.open(TEXT_PATH / "bg.png")
base_info_img = Image.open(TEXT_PATH / 'base_info.png') base_info_img = Image.open(TEXT_PATH / "base_info.png")
async def get_role_img(uid: str): async def get_role_img(uid: str):
@ -20,9 +20,9 @@ async def get_role_img(uid: str):
if isinstance(player_info, int): if isinstance(player_info, int):
return get_error(player_info) return get_error(player_info)
player_save_path = get_res_path(['ArknightsUID', 'players']) player_save_path = get_res_path(["ArknightsUID", "players"])
with Path.open(player_save_path / f'{player_info.status.uid}.json', 'wb') as file: with Path.open(player_save_path / f"{player_info.status.uid}.json", "wb") as file:
file.write(msgjson.format(msgjson.encode(player_info), indent=4)) file.write(msgjson.format(msgjson.encode(player_info), indent=4))
# 放 background # 放 background
@ -31,10 +31,12 @@ async def get_role_img(uid: str):
# 放干员主立绘 # 放干员主立绘
secretary = player_info.status.secretary secretary = player_info.status.secretary
# 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)
@ -46,12 +48,12 @@ async def get_role_img(uid: str):
player_info.status.name, player_info.status.name,
(255, 255, 255), (255, 255, 255),
sans_font_28, sans_font_28,
'lm', "lm",
) )
# 放入职信息 # 放入职信息
base_info.resize((475, 400)).convert('RGBA') base_info.resize((475, 400)).convert("RGBA")
char_info.paste(base_info, (200, 0), base_info) char_info.paste(base_info, (200, 0), base_info)
char_info.show() char_info.show()

View File

@ -14,46 +14,46 @@ from ..utils.ark_prefix import PREFIX
from ..utils.database.models import ArknightsBind from ..utils.database.models import ArknightsBind
from .sign import daily_sign, sign_in from .sign import daily_sign, sign_in
SIGN_TIME = arkconfig.get_config('SignTime').data SIGN_TIME = arkconfig.get_config("SignTime").data
sv_sign = SV('森空岛签到') sv_sign = SV("森空岛签到")
sv_sign_config = SV('森空岛管理', pm=2) sv_sign_config = SV("森空岛管理", pm=2)
# 每日零点半执行森空岛签到 # 每日零点半执行森空岛签到
@scheduler.scheduled_job('cron', hour=SIGN_TIME[0], minute=SIGN_TIME[1]) @scheduler.scheduled_job("cron", hour=SIGN_TIME[0], minute=SIGN_TIME[1])
async def ark_sign_at_night(): async def ark_sign_at_night():
if arkconfig.get_config('SchedSignin').data: if arkconfig.get_config("SchedSignin").data:
await send_daily_sign() await send_daily_sign()
# 群聊内 签到 功能 # 群聊内 签到 功能
@sv_sign.on_fullmatch(f'{PREFIX}签到') @sv_sign.on_fullmatch(f"{PREFIX}签到")
async def get_sign_func(bot: Bot, ev: Event): async def get_sign_func(bot: Bot, ev: Event):
await bot.logger.info(f'[ARK签到]QQ号: {ev.user_id}') await bot.logger.info(f"[ARK签到]QQ号: {ev.user_id}")
ark_uid = await get_uid(bot, ev, bind_model=ArknightsBind) ark_uid = await get_uid(bot, ev, bind_model=ArknightsBind)
if ark_uid is None: if ark_uid is None:
return '你还没有绑定UID噢,请使用[ark绑定uid123]完成绑定!' return "你还没有绑定UID噢,请使用[ark绑定uid123]完成绑定!"
await bot.logger.info(f'[ARK签到]UID: {ark_uid}') await bot.logger.info(f"[ARK签到]UID: {ark_uid}")
await bot.send(await sign_in(ark_uid)) await bot.send(await sign_in(ark_uid))
return None return None
@sv_sign_config.on_fullmatch(f'{PREFIX}全部重签') @sv_sign_config.on_fullmatch(f"{PREFIX}全部重签")
async def recheck(bot: Bot, ev: Event): async def recheck(bot: Bot, ev: Event):
await bot.logger.info('开始执行[ARK全部重签]') await bot.logger.info("开始执行[ARK全部重签]")
await bot.send('已开始执行') await bot.send("已开始执行")
await send_daily_sign() await send_daily_sign()
await bot.send('执行完成') await bot.send("执行完成")
async def send_daily_sign(): async def send_daily_sign():
logger.info('开始执行[ARK每日全部签到]') logger.info("开始执行[ARK每日全部签到]")
# 执行签到 并获得推送消息 # 执行签到 并获得推送消息
result = await daily_sign() result = await daily_sign()
private_msg_list = result['private_msg_list'] private_msg_list = result["private_msg_list"]
group_msg_list = result['group_msg_list'] group_msg_list = result["group_msg_list"]
logger.info('[ARK每日全部签到]完成') logger.info("[ARK每日全部签到]完成")
# 执行私聊推送 # 执行私聊推送
for qid in private_msg_list: for qid in private_msg_list:
@ -61,41 +61,41 @@ async def send_daily_sign():
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)
logger.info('[ARK每日全部签到]私聊推送完成') logger.info("[ARK每日全部签到]私聊推送完成")
# 执行群聊推送 # 执行群聊推送
for gid in group_msg_list: for gid in group_msg_list:
# 根据succee数判断是否为简洁推送 # 根据succee数判断是否为简洁推送
if group_msg_list[gid]['success'] >= 0: if group_msg_list[gid]["success"] >= 0:
report = ( report = (
'以下为签到失败报告:{}'.format(group_msg_list[gid]['push_message']) "以下为签到失败报告:{}".format(group_msg_list[gid]["push_message"])
if group_msg_list[gid]['push_message'] != '' if group_msg_list[gid]["push_message"] != ""
else '' else ""
) )
msg_title = '森空岛今日自动签到已完成!\n本群共签到成功{}人,共签到失败{}人。{}'.format( msg_title = "森空岛今日自动签到已完成!\n本群共签到成功{}人,共签到失败{}人。{}".format(
group_msg_list[gid]['success'], group_msg_list[gid]["success"],
group_msg_list[gid]['failed'], group_msg_list[gid]["failed"],
report, report,
) )
else: else:
msg_title = group_msg_list[gid]['push_message'] msg_title = group_msg_list[gid]["push_message"]
# 发送群消息 # 发送群消息
try: try:
for bot_id in gss.active_bot: for bot_id in gss.active_bot:
await gss.active_bot[bot_id].target_send( await gss.active_bot[bot_id].target_send(
msg_title, msg_title,
'group', "group",
gid, gid,
group_msg_list[gid]['bot_id'], group_msg_list[gid]["bot_id"],
'', "",
'', "",
) )
except Exception as e: except Exception as e:
logger.warning(f'[ARK每日全部签到]群 {gid} 推送失败!错误信息:{e}') logger.warning(f"[ARK每日全部签到]群 {gid} 推送失败!错误信息:{e}")
await asyncio.sleep(0.5 + random.randint(1, 3)) await asyncio.sleep(0.5 + random.randint(1, 3))
logger.info('[ARK每日全部签到]群聊推送完成') logger.info("[ARK每日全部签到]群聊推送完成")

View File

@ -2,7 +2,7 @@ import asyncio
import random import random
from copy import deepcopy from copy import deepcopy
from datetime import datetime from datetime import datetime
from typing import List 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
@ -18,106 +18,108 @@ already = 0
# 签到函数 # 签到函数
async def sign_in(ark_uid: str) -> str: async def sign_in(ark_uid: str) -> str:
logger.info(f'[ARK签到] {ark_uid} 开始执行签到') logger.info(f"[ARK签到] {ark_uid} 开始执行签到")
# 获得签到信息 # 获得签到信息
sign_info = await ark_skd_api.get_sign_info(ark_uid) sign_info = await ark_skd_api.get_sign_info(ark_uid)
# 初步校验数据 # 初步校验数据
if isinstance(sign_info, int): if isinstance(sign_info, int):
logger.warning(f'[ARK签到] {ark_uid} 出错, 请检查森空岛Cred是否过期!') logger.warning(f"[ARK签到] {ark_uid} 出错, 请检查森空岛Cred是否过期!")
return '签到失败...请检查森空岛Cred是否过期!' return "签到失败...请检查森空岛Cred是否过期!"
# 检测是否已签到 # 检测是否已签到
for calendar in sign_info.calendar: for calendar in sign_info.calendar:
if calendar.available: if calendar.available:
break break
else: else:
logger.info(f'[ARK签到] {ark_uid} 该用户今日已签到,跳过...') logger.info(f"[ARK签到] {ark_uid} 该用户今日已签到,跳过...")
global already # noqa: PLW0603 global already
already += 1 already += 1
# 获取今天和月初的日期,计算漏签次数 # 获取今天和月初的日期,计算漏签次数
day_of_month = datetime.now().day day_of_month = datetime.now().day
special_count = 0 special_count = 0
count = 0 count = 0
for calendar in sign_info.calendar: for calendar in sign_info.calendar:
special_count += 1 if calendar.type_ == 'first' else 0 special_count += 1 if calendar.type_ == "first" else 0
done = calendar.done done = calendar.done
if done is True: if done is True:
count += 1 count += 1
sign_missed = day_of_month - count + special_count sign_missed = day_of_month - count + special_count
return f'今日已签到!本月漏签次数:{sign_missed}' return f"今日已签到!本月漏签次数:{sign_missed}"
# 进行一次签到 # 进行一次签到
sign_data = await ark_skd_api.skd_sign(uid=ark_uid) sign_data = await ark_skd_api.skd_sign(uid=ark_uid)
# 检测数据 # 检测数据
if isinstance(sign_data, int): if isinstance(sign_data, int):
logger.warning(f'[ARK签到] {ark_uid} 出错, 请检查森空岛Cred是否过期!') logger.warning(f"[ARK签到] {ark_uid} 出错, 请检查森空岛Cred是否过期!")
return 'ark签到失败...请检查森空岛Cred是否过期!' return "ark签到失败...请检查森空岛Cred是否过期!"
# 获取签到奖励物品,拿旧的总签到天数 + 1 为新的签到天数,再 -1 即为今日奖励物品的下标 # 获取签到奖励物品,拿旧的总签到天数 + 1 为新的签到天数,再 -1 即为今日奖励物品的下标
getitem = sign_data.awards getitem = sign_data.awards
get_im = '' get_im = ""
for award in getitem: for award in getitem:
get_im = f'本次ark签到获得{award.resource.name}x{award.count}' get_im = f"本次ark签到获得{award.resource.name}x{award.count}"
# 签到后计算漏签次数 # 签到后计算漏签次数
new_sign_info = await ark_skd_api.get_sign_info(ark_uid) new_sign_info = await ark_skd_api.get_sign_info(ark_uid)
# 校验数据 # 校验数据
if isinstance(new_sign_info, int): if isinstance(new_sign_info, int):
logger.warning(f'[ARK签到] {ark_uid} 出错, 请检查森空岛Cred是否过期!') logger.warning(f"[ARK签到] {ark_uid} 出错, 请检查森空岛Cred是否过期!")
return '签到失败...请检查森空岛Cred是否过期!' return "签到失败...请检查森空岛Cred是否过期!"
# 获取今天和月初的日期,计算漏签次数 # 获取今天和月初的日期,计算漏签次数
day_of_month = datetime.now().day day_of_month = datetime.now().day
special_count = 0 special_count = 0
count = 0 count = 0
for calendar in new_sign_info.calendar: for calendar in new_sign_info.calendar:
special_count += 1 if calendar.type_ == 'first' else 0 special_count += 1 if calendar.type_ == "first" else 0
done = calendar.done done = calendar.done
if done is True: if done is True:
count += 1 count += 1
sign_missed = day_of_month - count + special_count sign_missed = day_of_month - count + special_count
im = f'ark签到成功!\n{get_im}\n本月漏签次数:{sign_missed}' im = f"ark签到成功!\n{get_im}\n本月漏签次数:{sign_missed}"
logger.info(f'[ARK签到] {ark_uid} 签到完成, 结果: ark签到成功, 漏签次数: {sign_missed}') logger.info(
f"[ARK签到] {ark_uid} 签到完成, 结果: ark签到成功, 漏签次数: {sign_missed}"
)
return im return im
async def single_daily_sign(bot_id: str, ark_uid: str, gid: str, qid: str): async def single_daily_sign(bot_id: str, ark_uid: str, gid: str, qid: str):
im = await sign_in(ark_uid) im = await sign_in(ark_uid)
if gid == 'on': if gid == "on":
if qid not in private_msg_list: if qid not in private_msg_list:
private_msg_list[qid] = [] private_msg_list[qid] = []
private_msg_list[qid].append({'bot_id': bot_id, 'uid': ark_uid, 'msg': im}) private_msg_list[qid].append({"bot_id": bot_id, "uid": ark_uid, "msg": im})
else: else:
# 向群消息推送列表添加这个群 # 向群消息推送列表添加这个群
if gid not in group_msg_list: if gid not in group_msg_list:
group_msg_list[gid] = { group_msg_list[gid] = {
'bot_id': bot_id, "bot_id": bot_id,
'success': 0, "success": 0,
'failed': 0, "failed": 0,
'push_message': '', "push_message": "",
} }
# 检查是否开启简洁签到 # 检查是否开启简洁签到
if arkconfig.get_config('SignReportSimple').data: if arkconfig.get_config("SignReportSimple").data:
# 如果失败, 则添加到推送列表 # 如果失败, 则添加到推送列表
if im.startswith(('ark签到失败', '网络有点忙', 'OK', 'ok')): if im.startswith(("ark签到失败", "网络有点忙", "OK", "ok")):
message = f'[CQ:at,qq={qid}] {im}' message = f"[CQ:at,qq={qid}] {im}"
group_msg_list[gid]['failed'] += 1 group_msg_list[gid]["failed"] += 1
group_msg_list[gid]['push_message'] += '\n' + message group_msg_list[gid]["push_message"] += "\n" + message
else: else:
group_msg_list[gid]['success'] += 1 group_msg_list[gid]["success"] += 1
# 没有开启简洁签到, 则每条消息都要携带@信息 # 没有开启简洁签到, 则每条消息都要携带@信息
else: else:
# 不用MessageSegment.at(row[2]),因为不方便移植 # 不用MessageSegment.at(row[2]),因为不方便移植
message = f'[CQ:at,qq={qid}] {im}' message = f"[CQ:at,qq={qid}] {im}"
group_msg_list[gid]['push_message'] += '\n' + message group_msg_list[gid]["push_message"] += "\n" + message
group_msg_list[gid]['success'] -= 1 group_msg_list[gid]["success"] -= 1
async def daily_sign(): async def daily_sign():
global already # noqa: PLW0603 global already
tasks = [] tasks = []
for _ in gss.active_bot: for _ in gss.active_bot:
user_list: List[ArknightsUser] = await ArknightsUser.get_all_user() user_list: Sequence[ArknightsUser] = await ArknightsUser.get_all_user()
logger.info(f'[ARK签到] 共有{len(user_list)}个用户需要签到') logger.info(f"[ARK签到] 共有{len(user_list)}个用户需要签到")
logger.info(f'[ARK签到] {user_list}') logger.info(f"[ARK签到] {user_list}")
for user in user_list: for user in user_list:
if user.sign_switch != 'off' and user.uid is not None: if user.sign_switch != "off" and user.uid is not None:
tasks.append( tasks.append(
single_daily_sign( single_daily_sign(
user.bot_id, user.bot_id,
@ -132,15 +134,17 @@ async def daily_sign():
delay = 1 delay = 1
else: else:
delay = 50 + random.randint(3, 45) delay = 50 + random.randint(3, 45)
logger.info(f'[ARK签到] 已签到{len(tasks)}个用户, 等待{delay}秒进行下一次签到') logger.info(
f"[ARK签到] 已签到{len(tasks)}个用户, 等待{delay}秒进行下一次签到"
)
tasks.clear() tasks.clear()
already = 0 already = 0
await asyncio.sleep(delay) await asyncio.sleep(delay)
await asyncio.gather(*tasks) await asyncio.gather(*tasks)
tasks.clear() tasks.clear()
result = { result = {
'private_msg_list': deepcopy(private_msg_list), "private_msg_list": deepcopy(private_msg_list),
'group_msg_list': deepcopy(group_msg_list), "group_msg_list": deepcopy(group_msg_list),
} }
private_msg_list.clear() private_msg_list.clear()
group_msg_list.clear() group_msg_list.clear()

View File

@ -3,13 +3,13 @@ import threading
from gsuid_core.logger import logger from gsuid_core.logger import logger
from ..arknightsuid_resource import startup # from ..arknightsuid_resource import startup
from ..utils.database.startup import ark_adapter from ..utils.database.startup import ark_adapter
async def all_start(): async def all_start():
try: try:
await startup() # await startup()
await ark_adapter() await ark_adapter()
except Exception as e: except Exception as e:
logger.exception(e) logger.exception(e)

View File

@ -10,10 +10,10 @@ from .deal_skd_cred import deal_skd_cred
# from .draw_user_card import get_user_card # from .draw_user_card import get_user_card
sv_user_config = SV('ark用户管理', pm=2) sv_user_config = SV("ark用户管理", pm=2)
sv_user_add = SV('ark用户添加') sv_user_add = SV("ark用户添加")
sv_user_info = SV('ark用户信息') sv_user_info = SV("ark用户信息")
ark_skd_cred_add = SV('森空岛cred绑定') ark_skd_cred_add = SV("森空岛cred绑定")
# sv_user_help = SV('ark绑定帮助') # sv_user_help = SV('ark绑定帮助')
@ -25,47 +25,49 @@ ark_skd_cred_add = SV('森空岛cred绑定')
# await bot.send(uid_list) # await bot.send(uid_list)
@sv_user_info.on_command((f'{PREFIX}绑定uid', f'{PREFIX}切换uid', f'{PREFIX}删除uid', f'{PREFIX}解绑uid')) @sv_user_info.on_command(
(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
await bot.logger.info(f'[绑定/解绑]UserID: {qid}') await bot.logger.info(f"[绑定/解绑]UserID: {qid}")
ark_uid = ev.text.strip() ark_uid = ev.text.strip()
if ark_uid and not ark_uid.isdigit(): if ark_uid and not ark_uid.isdigit():
return await bot.send('你输入了错误的格式!') return await bot.send("你输入了错误的格式!")
if '绑定' in ev.command: if "绑定" in ev.command:
data = await ArknightsBind.insert_uid(qid, ev.bot_id, ark_uid, ev.group_id) data = await ArknightsBind.insert_uid(qid, ev.bot_id, ark_uid, ev.group_id)
return await send_diff_msg( return await send_diff_msg(
bot, bot,
data, data,
{ {
0: f'绑定ARK_UID{ark_uid}成功!', 0: f"绑定ARK_UID{ark_uid}成功!",
-1: f'ARK_UID{ark_uid}的位数不正确!', -1: f"ARK_UID{ark_uid}的位数不正确!",
-2: f'ARK_UID{ark_uid}已经绑定过了!', -2: f"ARK_UID{ark_uid}已经绑定过了!",
-3: '你输入了错误的格式!', -3: "你输入了错误的格式!",
}, },
) )
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}")
else: else:
data = await ArknightsBind.delete_uid(qid, ev.bot_id, ark_uid) data = await ArknightsBind.delete_uid(qid, ev.bot_id, ark_uid)
return await send_diff_msg( return await send_diff_msg(
bot, bot,
data, data,
{ {
0: f'删除ARK_UID{ark_uid}成功!', 0: f"删除ARK_UID{ark_uid}成功!",
-1: f'该ARK_UID{ark_uid}不在已绑定列表中!', -1: f"该ARK_UID{ark_uid}不在已绑定列表中!",
}, },
) )
@ark_skd_cred_add.on_prefix(('skd添加cred', '森空岛添加CRED')) @ark_skd_cred_add.on_prefix(("skd添加cred", "森空岛添加CRED"))
async def send_ark_skd_add_cred_msg(bot: Bot, ev: Event): async def send_ark_skd_add_cred_msg(bot: Bot, ev: Event):
im = await deal_skd_cred(ev.bot_id, ev.text, ev.user_id) im = await deal_skd_cred(ev.bot_id, ev.text, ev.user_id)
await bot.send(im) await bot.send(im)

View File

@ -3,8 +3,8 @@ 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 = '添加失败, 格式为: skd添加cred Cred 例如: skd添加cred VropL583Sb1hClS5buQ4nSASkDlL8tMT' ERROR_HINT = "添加失败, 格式为: skd添加cred Cred 例如: skd添加cred VropL583Sb1hClS5buQ4nSASkDlL8tMT"
UID_HINT = '添加失败, 请先绑定明日方舟UID' UID_HINT = "添加失败, 请先绑定明日方舟UID"
async def deal_skd_cred(bot_id: str, cred: str, user_id: str) -> str: async def deal_skd_cred(bot_id: str, cred: str, user_id: str) -> str:
@ -12,9 +12,9 @@ async def deal_skd_cred(bot_id: str, cred: str, user_id: str) -> str:
if uid_list is None: if uid_list is None:
return UID_HINT return UID_HINT
match = re.search(r'\S+', cred) match = re.search(r"\S+", cred)
if not match: if not match:
return 'Cred无效!' return "Cred无效!"
# refresh token # refresh token
token = await ark_skd_api.refresh_token(match.group()) token = await ark_skd_api.refresh_token(match.group())
@ -25,12 +25,12 @@ async def deal_skd_cred(bot_id: str, cred: str, user_id: str) -> str:
) )
if isinstance(check_cred, bool): if isinstance(check_cred, bool):
return 'Cred无效!' return "Cred无效!"
else: else:
skd_uid = check_cred.user.id_ skd_uid = check_cred.user.id_
uid = check_cred.gameStatus.uid uid = check_cred.gameStatus.uid
if uid not in uid_list: if uid not in uid_list:
return '请先绑定该 Cred 对应的 uid' return "请先绑定该 Cred 对应的 uid"
# 检查是否已经绑定过 Cred, 如果有的话就 update # 检查是否已经绑定过 Cred, 如果有的话就 update
skd_data = await ArknightsUser.select_data_by_uid(uid) skd_data = await ArknightsUser.select_data_by_uid(uid)
@ -55,4 +55,4 @@ async def deal_skd_cred(bot_id: str, cred: str, user_id: str) -> str:
) )
if not push_data: if not push_data:
await ArknightsPush.insert_push_data(bot_id, uid=uid, skd_uid=skd_uid) await ArknightsPush.insert_push_data(bot_id, uid=uid, skd_uid=skd_uid)
return '添加成功!' return "添加成功!"

View File

@ -15,23 +15,25 @@ from ..arknightsuid_wiki.draw_wiki_img import (
from ..arknightsuid_resource.constants import CHARACTER_TABLE from ..arknightsuid_resource.constants import CHARACTER_TABLE
from ..utils.fonts.source_han_sans import sans_font_20 from ..utils.fonts.source_han_sans import sans_font_20
sv_sr_wiki = SV('arkWIKI') sv_sr_wiki = SV("arkWIKI")
async def text2pic(text: str, max_size: int = 800, font_size: int = 20): async def text2pic(text: str, max_size: int = 800, font_size: int = 20):
if text.endswith('\n'): if text.endswith("\n"):
text = text[:-1] text = text[:-1]
img = Image.new('RGB', (max_size, len(text) * font_size // 5), (228, 222, 210)) img = Image.new("RGB", (max_size, len(text) * font_size // 5), (228, 222, 210))
img_draw = ImageDraw.ImageDraw(img) img_draw = ImageDraw.ImageDraw(img)
y = draw_center_text_by_line(img_draw, (25, 0), text, sans_font_20, 'black', 750, True) y = draw_center_text_by_line(
img_draw, (25, 0), text, sans_font_20, "black", 750, True
)
img = img.crop((0, 0, 800, int(y + 30))) img = img.crop((0, 0, 800, int(y + 30)))
return await convert_img(img) return await convert_img(img)
@sv_sr_wiki.on_prefix('ark角色图鉴') @sv_sr_wiki.on_prefix("ark角色图鉴")
async def send_role_wiki_pic(bot: Bot, ev: Event): async def send_role_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 CHARACTER_TABLE.chars.items():
@ -39,17 +41,17 @@ async def send_role_wiki_pic(bot: Bot, ev: Event):
char_id = char_id_ char_id = char_id_
break break
if not char_id: if not char_id:
await bot.send('未找到该干员') await bot.send("未找到该干员")
return return
await bot.logger.info(f'开始获取{char_name}图鉴') await bot.logger.info(f"开始获取{char_name}图鉴")
# img = await draw_wiki(char_id=char_id) # img = await draw_wiki(char_id=char_id)
img = await get_wiki_info(char_id=char_id) img = await get_wiki_info(char_id=char_id)
await bot.send(await text2pic(img)) await bot.send(await text2pic(img))
@sv_sr_wiki.on_prefix('ark模组图鉴') @sv_sr_wiki.on_prefix("ark模组图鉴")
async def send_equip_wiki_pic(bot: Bot, ev: Event): 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 CHARACTER_TABLE.chars.items():
@ -57,8 +59,8 @@ async def send_equip_wiki_pic(bot: Bot, ev: Event):
char_id = char_id_ char_id = char_id_
break break
if not char_id: if not char_id:
await bot.send('未找到该干员') await bot.send("未找到该干员")
return return
await bot.logger.info(f'开始获取{char_name}图鉴') await bot.logger.info(f"开始获取{char_name}图鉴")
img = await get_equip_info(char_id=char_id) img = await get_equip_info(char_id=char_id)
await bot.send(await text2pic(img)) await bot.send(await text2pic(img))

View File

@ -4,7 +4,6 @@ from pathlib import Path
from pprint import pformat from pprint import pformat
from typing import Dict, Union from typing import Dict, Union
from colorama import Fore, Style
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
@ -16,23 +15,18 @@ from ..arknightsuid_resource.constants import (
RANGE_TABLE, RANGE_TABLE,
SKILL_TABLE, SKILL_TABLE,
UNIEQUIP_TABLE, UNIEQUIP_TABLE,
CharacterTable,
) )
from ..utils.fonts.source_han_sans import ( from ..utils.fonts.source_han_sans import (
sans_font_18,
sans_font_20,
sans_font_24, sans_font_24,
sans_font_26,
sans_font_34, sans_font_34,
sans_font_50,
sans_font_120, sans_font_120,
) )
TEXTURE2D_PATH = Path(__file__).parent / 'texture2D' TEXTURE2D_PATH = Path(__file__).parent / "texture2D"
bg_img = Image.open(TEXTURE2D_PATH / 'bg.jpg') bg_img = Image.open(TEXTURE2D_PATH / "bg.jpg")
title_img = Image.open(TEXTURE2D_PATH / 'title.png') title_img = Image.open(TEXTURE2D_PATH / "title.png")
vvan_img = Image.open(TEXTURE2D_PATH / 'char_4098_vvana_2b.png').resize((2000, 2000)) vvan_img = Image.open(TEXTURE2D_PATH / "char_4098_vvana_2b.png").resize((2000, 2000))
first_color = (29, 29, 29) first_color = (29, 29, 29)
white_color = (255, 255, 255) white_color = (255, 255, 255)
@ -40,36 +34,36 @@ red_color = (235, 61, 75)
black_color = (0, 0, 0) black_color = (0, 0, 0)
profession_en_to_cn = { profession_en_to_cn = {
'WARRIOR': '近卫', "WARRIOR": "近卫",
'SNIPER': '狙击', "SNIPER": "狙击",
'TANK': '重装', "TANK": "重装",
'MEDIC': '医疗', "MEDIC": "医疗",
'SUPPORT': '辅助', "SUPPORT": "辅助",
'CASTER': '术师', "CASTER": "术师",
'SPECIAL': '特种', "SPECIAL": "特种",
'PIONEER': '先锋', "PIONEER": "先锋",
'TOKEN': '召唤物', "TOKEN": "召唤物",
'TRAP': '陷阱', "TRAP": "陷阱",
} }
char_position_en_to_cn = { char_position_en_to_cn = {
'MELEE': '近战', "MELEE": "近战",
'RANGED': '远程', "RANGED": "远程",
'ALL': '近战/远程', "ALL": "近战/远程",
'NONE': '', "NONE": "",
} }
attr_en_to_cn = { attr_en_to_cn = {
'maxHp': '生命', "maxHp": "生命",
'atk': '攻击', "atk": "攻击",
'def_': '防御', "def_": "防御",
'magicResistance': '法抗', "magicResistance": "法抗",
'cost': '部署费用', "cost": "部署费用",
'blockCnt': '阻挡', "blockCnt": "阻挡",
# "moveSpeed": "移动速度", # "moveSpeed": "移动速度",
'attackSpeed': '攻击速度', "attackSpeed": "攻击速度",
'baseAttackTime': '攻击间隔', "baseAttackTime": "攻击间隔",
'respawnTime': '再部署时间', "respawnTime": "再部署时间",
# "hpRecoveryPerSec": "生命回复", # "hpRecoveryPerSec": "生命回复",
# "spRecoveryPerSec": "技力回复", # "spRecoveryPerSec": "技力回复",
# "maxDeployCount": "部署数量上限", # "maxDeployCount": "部署数量上限",
@ -85,50 +79,47 @@ attr_en_to_cn = {
} }
potential_id_to_cn = { potential_id_to_cn = {
0: '潜能2', 0: "潜能2",
1: '潜能3', 1: "潜能3",
2: '潜能4', 2: "潜能4",
3: '潜能5', 3: "潜能5",
4: '潜能6', 4: "潜能6",
} }
def test_ctg(length: int, *params): def test_ctg(length: int, *params):
print(
f'{Fore.GREEN}> running split_ctg(){Style.RESET_ALL}\
\n length: {length}\
\n texts: {params}'
)
groups_ = ColorTextGroup(list(params)) groups_ = ColorTextGroup(list(params))
f_ = pformat(split_ctg(groups_, length)).split('\n') f_ = pformat(split_ctg(groups_, length)).split("\n")
print(Fore.CYAN, '\t', f_[0], '\n\t'.join(f_[0:]))
def render_template(template_str: str, data: Dict[str, Union[float, Union[int, None]]]): def render_template(template_str: str, data: Dict[str, Union[float, Union[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)
placeholder_data = {} placeholder_data = {}
for match in matches: for match in matches:
placeholder = match.groups() placeholder = match.groups()
formatting_option = '' formatting_option = ""
placeholder_data[placeholder[0]] = (formatting_option, data.get(placeholder[0], '')) placeholder_data[placeholder[0]] = (
formatting_option,
data.get(placeholder[0], ""),
)
for match in matches_1: for match in matches_1:
placeholder, formatting_option = match.groups() placeholder, formatting_option = match.groups()
value = data.get(placeholder.replace('-', ''), '') value = data.get(placeholder.replace("-", ""), "")
# 可以在下列状态和初始状态间切换:\n攻击范围缩小防御力+{def:0%} # 可以在下列状态和初始状态间切换:\n攻击范围缩小防御力+{def:0%}
# 每秒恢复最大生命的{HP_RECOVERY_PER_SEC_BY_MAX_HP_RATIO:0.0%} # 每秒恢复最大生命的{HP_RECOVERY_PER_SEC_BY_MAX_HP_RATIO:0.0%}
# {'def': 1, 'hp_recovery_per_sec_by_max_hp_ratio': 0.06} # {'def': 1, 'hp_recovery_per_sec_by_max_hp_ratio': 0.06}
if value == '': if value == "":
value = data.get(placeholder.replace('-', '_').lower(), '') value = data.get(placeholder.replace("-", "_").lower(), "")
placeholder_data[placeholder] = (formatting_option, value) placeholder_data[placeholder] = (formatting_option, value)
for placeholder, (formatting_option, value) in placeholder_data.items(): for placeholder, (formatting_option, value) in placeholder_data.items():
if formatting_option == '': if formatting_option == "":
template_str = template_str.replace(f'{{{placeholder}}}', f'{value}') template_str = template_str.replace(f"{{{placeholder}}}", f"{value}")
else: else:
template_str = template_str.replace( template_str = template_str.replace(
f'{{{placeholder}:{formatting_option}}}', f'{value:{formatting_option}}' f"{{{placeholder}:{formatting_option}}}", f"{value:{formatting_option}}"
) )
template = Template(template_str) template = Template(template_str)
@ -138,12 +129,12 @@ def render_template(template_str: str, data: Dict[str, Union[float, Union[int, N
async def get_equip_info(char_id: str): 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 = 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 = UNIEQUIP_TABLE.equipDict[char_equip_id]
uniequip_name = equip_dict.uniEquipName uniequip_name = equip_dict.uniEquipName
@ -153,12 +144,12 @@ async def get_equip_info(char_id: str):
except KeyError: except KeyError:
continue continue
im += f'模组名: {uniequip_name}\n' im += f"模组名: {uniequip_name}\n"
for equip_phase in char_equip_phases: for equip_phase in char_equip_phases:
equip_level = equip_phase.equipLevel equip_level = equip_phase.equipLevel
im += '-----------------\n' im += "-----------------\n"
im += f'等级: {equip_level}\n' im += f"等级: {equip_level}\n"
equip_attribute_add_dict = {} equip_attribute_add_dict = {}
equip_attribute_blackboard = equip_phase.attributeBlackboard equip_attribute_blackboard = equip_phase.attributeBlackboard
for attribute in equip_attribute_blackboard: for attribute in equip_attribute_blackboard:
@ -166,12 +157,12 @@ async def get_equip_info(char_id: str):
for attr in equip_attribute_add_dict: for attr in equip_attribute_add_dict:
if attr in attr_en_to_cn: if attr in attr_en_to_cn:
im += f'{attr_en_to_cn[attr]}: +{equip_attribute_add_dict[attr]}\n' im += f"{attr_en_to_cn[attr]}: +{equip_attribute_add_dict[attr]}\n"
im += '-----------------\n' im += "-----------------\n"
im += '效果:\n' im += "效果:\n"
for part in equip_phase.parts: for part in equip_phase.parts:
target = part.target target = part.target
if target == 'TRAIT': if target == "TRAIT":
overrideTraitDataBundle = part.overrideTraitDataBundle overrideTraitDataBundle = part.overrideTraitDataBundle
assert overrideTraitDataBundle.candidates is not None assert overrideTraitDataBundle.candidates is not None
for candidate in overrideTraitDataBundle.candidates: for candidate in overrideTraitDataBundle.candidates:
@ -181,12 +172,18 @@ async def get_equip_info(char_id: str):
for blackboard_ in blackboard: for blackboard_ in blackboard:
blackboard_dict[blackboard_.key] = blackboard_.value blackboard_dict[blackboard_.key] = blackboard_.value
if additionalDescription: if additionalDescription:
additionalDescription = re.sub(r'<[^>]+>', '', additionalDescription) additionalDescription = re.sub(
additionalDescription = render_template(additionalDescription, blackboard_dict) r"<[^>]+>", "", additionalDescription
additionalDescription = re.sub(r'.000000', '', additionalDescription) )
im += f'{additionalDescription}\n' additionalDescription = render_template(
additionalDescription, blackboard_dict
)
additionalDescription = re.sub(
r".000000", "", additionalDescription
)
im += f"{additionalDescription}\n"
elif target == 'TALENT_DATA_ONLY': elif target == "TALENT_DATA_ONLY":
addOrOverrideTalentDataBundle = part.addOrOverrideTalentDataBundle addOrOverrideTalentDataBundle = part.addOrOverrideTalentDataBundle
assert addOrOverrideTalentDataBundle.candidates is not None assert addOrOverrideTalentDataBundle.candidates is not None
for candidate in addOrOverrideTalentDataBundle.candidates: for candidate in addOrOverrideTalentDataBundle.candidates:
@ -195,10 +192,12 @@ async def get_equip_info(char_id: str):
upgradeDescription = candidate.upgradeDescription upgradeDescription = candidate.upgradeDescription
blackboard = candidate.blackboard blackboard = candidate.blackboard
if upgradeDescription and blackboard: if upgradeDescription and blackboard:
upgradeDescription = re.sub(r'<[^>]+>', '', upgradeDescription) upgradeDescription = re.sub(
im += f'{upgradeDescription}\n' r"<[^>]+>", "", upgradeDescription
)
im += f"{upgradeDescription}\n"
elif target == 'DISPLAY': elif target == "DISPLAY":
overrideTraitDataBundle = part.overrideTraitDataBundle overrideTraitDataBundle = part.overrideTraitDataBundle
assert overrideTraitDataBundle.candidates is not None assert overrideTraitDataBundle.candidates is not None
for candidate in overrideTraitDataBundle.candidates: for candidate in overrideTraitDataBundle.candidates:
@ -208,23 +207,31 @@ async def get_equip_info(char_id: str):
for blackboard_ in blackboard: for blackboard_ in blackboard:
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(
additionalDescription = render_template(additionalDescription, blackboard_dict) r"<[^>]+>", "", additionalDescription
additionalDescription = re.sub(r'.000000', '', additionalDescription) )
im += f'{additionalDescription}\n' additionalDescription = render_template(
additionalDescription, blackboard_dict
)
additionalDescription = re.sub(
r".000000", "", additionalDescription
)
im += f"{additionalDescription}\n"
elif target == 'TALENT': elif target == "TALENT":
addOrOverrideTalentDataBundle = part.addOrOverrideTalentDataBundle addOrOverrideTalentDataBundle = part.addOrOverrideTalentDataBundle
assert addOrOverrideTalentDataBundle.candidates is not None assert addOrOverrideTalentDataBundle.candidates is not None
for candidate in addOrOverrideTalentDataBundle.candidates: for candidate in addOrOverrideTalentDataBundle.candidates:
upgradeDescription = candidate.upgradeDescription upgradeDescription = candidate.upgradeDescription
if upgradeDescription == '': if upgradeDescription == "":
continue continue
else: else:
upgradeDescription = re.sub(r'<[^>]+>', '', upgradeDescription) upgradeDescription = re.sub(
im += f'{upgradeDescription}\n' r"<[^>]+>", "", upgradeDescription
)
im += f"{upgradeDescription}\n"
elif target == 'TRAIT_DATA_ONLY': elif target == "TRAIT_DATA_ONLY":
overrideTraitDataBundle = part.overrideTraitDataBundle overrideTraitDataBundle = part.overrideTraitDataBundle
assert overrideTraitDataBundle.candidates is not None assert overrideTraitDataBundle.candidates is not None
for candidate in overrideTraitDataBundle.candidates: for candidate in overrideTraitDataBundle.candidates:
@ -234,13 +241,17 @@ async def get_equip_info(char_id: str):
for blackboard_ in blackboard: for blackboard_ in blackboard:
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(
overrideDescripton = render_template(overrideDescripton, blackboard_dict) r"<[^>]+>", "", overrideDescripton
im += f'{overrideDescripton}\n' )
overrideDescripton = render_template(
overrideDescripton, blackboard_dict
)
im += f"{overrideDescripton}\n"
else: else:
raise NotImplementedError raise NotImplementedError
im += '-----------------\n' im += "-----------------\n"
im = im[:-19] im = im[:-19]
@ -248,39 +259,39 @@ 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 = CHARACTER_TABLE[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
im += f'星级: {str(char_rarity + 1)}\n' im += f"星级: {char_rarity + 1!s}\n"
im += '-----------------\n' im += "-----------------\n"
profession = character_data.profession profession = character_data.profession
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 = 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
group_id = character_data.groupId group_id = character_data.groupId
team_id = character_data.teamId team_id = character_data.teamId
im += '属性:\n' im += "属性:\n"
char_phases_data = character_data.phases[-1] char_phases_data = character_data.phases[-1]
char_max_phase = len(character_data.phases) char_max_phase = len(character_data.phases)
char_max_level = char_phases_data.maxLevel char_max_level = char_phases_data.maxLevel
char_attributes_key_frame = char_phases_data.attributesKeyFrames[-1].data char_attributes_key_frame = char_phases_data.attributesKeyFrames[-1].data
for idx, attr in enumerate(char_attributes_key_frame): for idx, attr in enumerate(char_attributes_key_frame):
if attr[0] in attr_en_to_cn: if attr[0] in attr_en_to_cn:
im += f'{attr_en_to_cn[attr[0]]}: {attr[1]}\n' im += f"{attr_en_to_cn[attr[0]]}: {attr[1]}\n"
im += '-----------------\n' im += "-----------------\n"
im += '天赋:\n' im += "天赋:\n"
if character_data.talents: if character_data.talents:
char_talent_num = len(character_data.talents) char_talent_num = len(character_data.talents)
@ -291,16 +302,18 @@ async def get_wiki_info(char_id: str):
char_talent_name = talent_candidates[-1].name char_talent_name = talent_candidates[-1].name
char_talent_description = talent_candidates[-1].description char_talent_description = talent_candidates[-1].description
if char_talent_description: if char_talent_description:
char_talent_description = re.sub(r'<[^>]+>', '', char_talent_description) char_talent_description = re.sub(
im += f'{char_talent_name}: {char_talent_description}\n' r"<[^>]+>", "", char_talent_description
)
im += f"{char_talent_name}: {char_talent_description}\n"
char_potential_data = character_data.potentialRanks char_potential_data = character_data.potentialRanks
potential_add_dict: dict[int, tuple[int, float]] = {} potential_add_dict: dict[int, tuple[int, float]] = {}
im += '-----------------\n' im += "-----------------\n"
im += '潜能加成\n' im += "潜能加成\n"
for potential_id, potential in enumerate(char_potential_data): for potential_id, potential in enumerate(char_potential_data):
potential_add_description = potential.description potential_add_description = potential.description
im += f'{potential_id_to_cn[potential_id]}: {potential_add_description}\n' im += f"{potential_id_to_cn[potential_id]}: {potential_add_description}\n"
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:
@ -312,81 +325,83 @@ async def get_wiki_info(char_id: str):
) )
else: else:
raise NotImplementedError raise NotImplementedError
im += '-----------------\n' im += "-----------------\n"
if character_data.favorKeyFrames: if character_data.favorKeyFrames:
char_favor_add_data = character_data.favorKeyFrames[-1].data char_favor_add_data = character_data.favorKeyFrames[-1].data
im += '满信赖加成\n' im += "满信赖加成\n"
for attr in char_favor_add_data: for attr in char_favor_add_data:
if attr[0] in ['maxHp', 'atk', 'def_', 'magicResistance'] and attr[1] != 0: if attr[0] in ["maxHp", "atk", "def_", "magicResistance"] and attr[1] != 0:
im += f'{attr_en_to_cn[attr[0]]}: +{attr[1]}\n' im += f"{attr_en_to_cn[attr[0]]}: +{attr[1]}\n"
im += '-----------------\n' im += "-----------------\n"
skill_id_list: list[str] = [] skill_id_list: list[str] = []
for skill in character_data.skills: for skill in character_data.skills:
if skill.skillId is None: if skill.skillId is None:
continue continue
skill_id_list.append(skill.skillId) skill_id_list.append(skill.skillId)
im += '技能:\n' im += "技能:\n"
for skill in skill_id_list: for skill in skill_id_list:
skill_data = SKILL_TABLE.skills[skill] skill_data = 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"
skill_type = skill_level_data.skillType skill_type = skill_level_data.skillType
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_sp_type = skill_sp_data.spType skill_sp_type = skill_sp_data.spType
if skill_sp_type == 1: if skill_sp_type == 1:
im += '自动回复 ' im += "自动回复 "
elif skill_sp_type == 2: elif skill_sp_type == 2:
im += '攻击回复 ' im += "攻击回复 "
elif skill_sp_type == 4: elif skill_sp_type == 4:
im += '受击回复 ' im += "受击回复 "
elif skill_sp_type == 8: elif skill_sp_type == 8:
pass pass
else: else:
raise NotImplementedError raise NotImplementedError
if skill_type == 1: if skill_type == 1:
im += '手动触发\n' im += "手动触发\n"
elif skill_type == 2: elif skill_type == 2:
im += '自动触发\n' im += "自动触发\n"
elif skill_type == 0: elif skill_type == 0:
pass pass
else: else:
raise NotImplementedError raise NotImplementedError
skill_duration = skill_level_data.duration skill_duration = skill_level_data.duration
im += f'消耗: {skill_sp_data.spCost} ' im += f"消耗: {skill_sp_data.spCost} "
im += f'初始: {skill_sp_data.initSp} ' im += f"初始: {skill_sp_data.initSp} "
im += f'持续: {str(skill_duration)}\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, Union[Union[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(
last_skill_description = re.sub(r'.000000', '', skill_description) skill_description, black_board_dict
if '{' in last_skill_description: ).replace("--", "-")
last_skill_description = re.sub(r".000000", "", skill_description)
if "{" in last_skill_description:
raise NotImplementedError raise NotImplementedError
skill_desc = re.findall(r'[^\\n]+', last_skill_description) skill_desc = re.findall(r"[^\\n]+", last_skill_description)
for skill_desc_line in skill_desc: for skill_desc_line in skill_desc:
im += f'{skill_desc_line}\n' im += f"{skill_desc_line}\n"
im += '-----------------\n' im += "-----------------\n"
im = im[:-19] im = im[:-19]
return im return im
async def draw_wiki(char_id: str): async def draw_wiki(char_id: str):
img = Image.new('RGBA', (1500, 2800), (255, 255, 255, 0)) img = Image.new("RGBA", (1500, 2800), (255, 255, 255, 0))
draw = ImageDraw.Draw(img) draw = ImageDraw.Draw(img)
img.paste(bg_img, (0, 0)) img.paste(bg_img, (0, 0))
@ -401,19 +416,19 @@ async def draw_wiki(char_id: str):
char_name, char_name,
font=sans_font_120, font=sans_font_120,
fill=black_color, fill=black_color,
anchor='lm', anchor="lm",
) )
char_rarity = character_data.rarity char_rarity = character_data.rarity
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
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)
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png') bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png') light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
bar_img.paste(light_line, (290, 60), light_line) bar_img.paste(light_line, (290, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img) bar_img_draw = ImageDraw.ImageDraw(bar_img)
@ -424,7 +439,7 @@ async def draw_wiki(char_id: str):
char_position_cn, char_position_cn,
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='lm', anchor="lm",
) )
sub_profession_id = character_data.subProfessionId sub_profession_id = character_data.subProfessionId
@ -434,70 +449,70 @@ async def draw_wiki(char_id: str):
sub_profession, sub_profession,
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='lm', anchor="lm",
) )
img.paste(bar_img, (40, 110), bar_img) img.paste(bar_img, (40, 110), bar_img)
nation_id = character_data.nationId nation_id = character_data.nationId
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png') bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png') light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
bar_img.paste(light_line, (290, 60), light_line) bar_img.paste(light_line, (290, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img) bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text( bar_img_draw.text(
(155, 100), (155, 100),
'势力', "势力",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='lm', anchor="lm",
) )
bar_img_draw.text( bar_img_draw.text(
(355, 100), (355, 100),
nation_id if nation_id else '未知', nation_id if nation_id else "未知",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='lm', anchor="lm",
) )
img.paste(bar_img, (940, 180 - 50), bar_img) img.paste(bar_img, (940, 180 - 50), bar_img)
group_id = character_data.groupId group_id = character_data.groupId
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png') bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png') light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
bar_img.paste(light_line, (290, 60), light_line) bar_img.paste(light_line, (290, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img) bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text( bar_img_draw.text(
(155, 100), (155, 100),
'阵营', "阵营",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='lm', anchor="lm",
) )
bar_img_draw.text( bar_img_draw.text(
(355, 100), (355, 100),
group_id if group_id else '未知', group_id if group_id else "未知",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='lm', anchor="lm",
) )
img.paste(bar_img, (940, 188 + 20), bar_img) img.paste(bar_img, (940, 188 + 20), bar_img)
team_id = character_data.teamId team_id = character_data.teamId
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png') bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png') light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
bar_img.paste(light_line, (290, 60), light_line) bar_img.paste(light_line, (290, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img) bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text( bar_img_draw.text(
(155, 100), (155, 100),
'队伍', "队伍",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='lm', anchor="lm",
) )
bar_img_draw.text( bar_img_draw.text(
(355, 100), (355, 100),
team_id if team_id else '未知', team_id if team_id else "未知",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='lm', anchor="lm",
) )
img.paste(bar_img, (940, 196 + 90), bar_img) img.paste(bar_img, (940, 196 + 90), bar_img)
@ -506,94 +521,94 @@ async def draw_wiki(char_id: str):
char_max_level = char_phases_data.maxLevel char_max_level = char_phases_data.maxLevel
char_attributes_key_frame = char_phases_data.attributesKeyFrames[-1].data char_attributes_key_frame = char_phases_data.attributesKeyFrames[-1].data
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png') bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png') light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
bar_img.paste(light_line, (320, 60), light_line) bar_img.paste(light_line, (320, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img) bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text( bar_img_draw.text(
(140, 100), (140, 100),
'生命上限', "生命上限",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='lm', anchor="lm",
) )
bar_img_draw.text( bar_img_draw.text(
(420, 100), (420, 100),
str(char_attributes_key_frame.maxHp), str(char_attributes_key_frame.maxHp),
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='mm', anchor="mm",
) )
img.paste(bar_img, (940, 380), bar_img) img.paste(bar_img, (940, 380), bar_img)
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png') bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png') light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
bar_img.paste(light_line, (320, 60), light_line) bar_img.paste(light_line, (320, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img) bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text( bar_img_draw.text(
(140, 100), (140, 100),
'攻击力', "攻击力",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='lm', anchor="lm",
) )
bar_img_draw.text( bar_img_draw.text(
(420, 100), (420, 100),
str(char_attributes_key_frame.atk), str(char_attributes_key_frame.atk),
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='mm', anchor="mm",
) )
img.paste(bar_img, (940, 380 + 78), bar_img) img.paste(bar_img, (940, 380 + 78), bar_img)
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png') bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png') light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
bar_img.paste(light_line, (320, 60), light_line) bar_img.paste(light_line, (320, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img) bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text( bar_img_draw.text(
(140, 100), (140, 100),
'防御力', "防御力",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='lm', anchor="lm",
) )
bar_img_draw.text( bar_img_draw.text(
(420, 100), (420, 100),
str(char_attributes_key_frame.def_), str(char_attributes_key_frame.def_),
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='mm', anchor="mm",
) )
img.paste(bar_img, (940, 380 + 78 * 2), bar_img) img.paste(bar_img, (940, 380 + 78 * 2), bar_img)
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png') bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png') light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
bar_img.paste(light_line, (320, 60), light_line) bar_img.paste(light_line, (320, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img) bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text( bar_img_draw.text(
(140, 100), (140, 100),
'法抗', "法抗",
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='lm', anchor="lm",
) )
bar_img_draw.text( bar_img_draw.text(
(420, 100), (420, 100),
str(char_attributes_key_frame.magicResistance), str(char_attributes_key_frame.magicResistance),
font=sans_font_34, font=sans_font_34,
fill=white_color, fill=white_color,
anchor='mm', anchor="mm",
) )
img.paste(bar_img, (940, 380 + 78 * 3), bar_img) img.paste(bar_img, (940, 380 + 78 * 3), bar_img)
# 攻击范围 # 攻击范围
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 = 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")
for grid in grids: for grid in grids:
col = grid.col col = grid.col
row = grid.row row = grid.row
@ -638,8 +653,8 @@ async def draw_wiki(char_id: str):
skill_id_list.append(skill.skillId) skill_id_list.append(skill.skillId)
for skill in skill_id_list: for skill in skill_id_list:
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 = SKILL_TABLE.skills[skill]
skill_level_data = skill_data.levels[-1] skill_level_data = skill_data.levels[-1]
@ -652,22 +667,21 @@ async def draw_wiki(char_id: str):
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(
last_skill_description = re.sub(r'.000000', '', skill_description) skill_description, black_board_dict
print(last_skill_description) ).replace("--", "-")
if '{' in last_skill_description: last_skill_description = re.sub(r".000000", "", skill_description)
if "{" in last_skill_description:
raise NotImplementedError raise NotImplementedError
# 匹配 -70% +200% 这种格式的数字 # 匹配 -70% +200% 这种格式的数字
c = re.sub(r'(\d+)%', r'\1%', last_skill_description) c = re.sub(r"(\d+)%", r"\1%", last_skill_description)
print(c)
print(test_ctg(30, last_skill_description))
draw_text_by_line( draw_text_by_line(
img=skill_bg, img=skill_bg,
pos=(70, 20), pos=(70, 20),
text=last_skill_description, text=last_skill_description,
font=sans_font_24, font=sans_font_24,
fill='#3b4354', fill="#3b4354",
max_length=400, max_length=400,
) )
# skill_bg.show() # skill_bg.show()
@ -677,5 +691,5 @@ async def draw_wiki(char_id: str):
return img return img
if __name__ == '__main__': if __name__ == "__main__":
asyncio.run(draw_wiki(char_id='char_4098_vvana')) asyncio.run(draw_wiki(char_id="char_4098_vvana"))

View File

@ -1,8 +1,8 @@
ARK_USER_ME = 'https://zonai.skland.com/api/v1/user/me' ARK_USER_ME = "https://zonai.skland.com/api/v1/user/me"
ARK_REFRESH_TOKEN = 'https://zonai.skland.com/api/v1/auth/refresh' ARK_REFRESH_TOKEN = "https://zonai.skland.com/api/v1/auth/refresh"
ARK_PLAYER_INFO = 'https://zonai.skland.com/api/v1/game/player/info' ARK_PLAYER_INFO = "https://zonai.skland.com/api/v1/game/player/info"
ARK_GEN_CRED_BY_CODE = 'https://zonai.skland.com/api/v1/user/auth/generate_cred_by_code' ARK_GEN_CRED_BY_CODE = "https://zonai.skland.com/api/v1/user/auth/generate_cred_by_code"
ARK_SKD_SIGN = 'https://zonai.skland.com/api/v1/game/attendance' ARK_SKD_SIGN = "https://zonai.skland.com/api/v1/game/attendance"

View File

@ -20,23 +20,23 @@ from ...models.skland.models import (
) )
from .api import ARK_PLAYER_INFO, ARK_REFRESH_TOKEN, ARK_SKD_SIGN, ARK_USER_ME from .api import ARK_PLAYER_INFO, ARK_REFRESH_TOKEN, ARK_SKD_SIGN, ARK_USER_ME
proxy_url = core_plugins_config.get_config('proxy').data proxy_url = core_plugins_config.get_config("proxy").data
ssl_verify = core_plugins_config.get_config('MhySSLVerify').data ssl_verify = core_plugins_config.get_config("MhySSLVerify").data
_HEADER: Dict[str, str] = { _HEADER: Dict[str, str] = {
'Host': 'zonai.skland.com', "Host": "zonai.skland.com",
'platform': '1', "platform": "1",
'Origin': 'https://www.skland.com', "Origin": "https://www.skland.com",
'Referer': 'https://www.skland.com/', "Referer": "https://www.skland.com/",
'Content-Type': 'application/json', "Content-Type": "application/json",
'User-Agent': 'Skland/1.5.1 (com.hypergryph.skland; build:100501001; Android 33; ) Okhttp/4.11.0', "User-Agent": "Skland/1.5.1 (com.hypergryph.skland; build:100501001; Android 33; ) Okhttp/4.11.0",
'vName': '1.5.1', "vName": "1.5.1",
'vCode': '100501001', "vCode": "100501001",
'nId': '1', "nId": "1",
'os': '33', "os": "33",
'manufacturer': 'Xiaomi', "manufacturer": "Xiaomi",
'Connection': 'close', "Connection": "close",
} }
@ -51,25 +51,31 @@ class TokenRefreshFailed(Exception):
class BaseArkApi: class BaseArkApi:
proxy_url: Union[str, None] = proxy_url if proxy_url else None proxy_url: Union[str, None] = proxy_url if proxy_url else None
async def _pass(self, gt: str, ch: str) -> Tuple[Union[str, None], Union[str, None]]: async def _pass(
_pass_api = core_plugins_config.get_config('_pass_API').data self, gt: str, ch: str
) -> Tuple[Union[str, None], Union[str, None]]:
_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(
url=f'{_pass_api}&gt={gt}&challenge={ch}', url=f"{_pass_api}&gt={gt}&challenge={ch}",
method='GET', method="GET",
) )
if isinstance(data, int) or not data: if isinstance(data, int) or not data:
return None, None return None, None
else: else:
validate = data['data']['validate'] validate = data["data"]["validate"]
ch = data['data']['challenge'] ch = data["data"]["challenge"]
else: else:
validate = None validate = None
return validate, ch return validate, ch
async def get_game_player_info(self, uid: str) -> Union[int, ArknightsPlayerInfoModel]: async def get_game_player_info(
cred: Union[str, None] = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred') self, uid: str
) -> Union[int, ArknightsPlayerInfoModel]:
cred: Union[str, None] = await ArknightsUser.get_user_attr_by_uid(
uid=uid, attr="cred"
)
if cred is None: if cred is None:
return -60 return -60
is_vaild = await self.check_cred_valid(cred) is_vaild = await self.check_cred_valid(cred)
@ -77,11 +83,11 @@ class BaseArkApi:
await ArknightsUser.delete_user_data_by_uid(uid) await ArknightsUser.delete_user_data_by_uid(uid)
return -61 return -61
header = deepcopy(_HEADER) header = deepcopy(_HEADER)
header['cred'] = cred header["cred"] = cred
header = await self.set_sign(ARK_PLAYER_INFO, header=header) header = await self.set_sign(ARK_PLAYER_INFO, header=header)
raw_data = await self.ark_request( raw_data = await self.ark_request(
url=ARK_PLAYER_INFO, url=ARK_PLAYER_INFO,
params={'uid': uid}, params={"uid": uid},
header=header, header=header,
) )
if isinstance(raw_data, int): if isinstance(raw_data, int):
@ -95,7 +101,9 @@ class BaseArkApi:
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) -> Union[int, ArknightsAttendanceModel]:
cred: Union[str, None] = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred') cred: Union[str, None] = await ArknightsUser.get_user_attr_by_uid(
uid=uid, attr="cred"
)
if cred is None: if cred is None:
return -60 return -60
is_vaild = await self.check_cred_valid(cred) is_vaild = await self.check_cred_valid(cred)
@ -103,18 +111,18 @@ class BaseArkApi:
await ArknightsUser.delete_user_data_by_uid(uid) await ArknightsUser.delete_user_data_by_uid(uid)
return -61 return -61
header = deepcopy(_HEADER) header = deepcopy(_HEADER)
header['cred'] = cred header["cred"] = cred
data = {'uid': uid, 'gameId': 1} data = {"uid": uid, "gameId": 1}
header = await self.set_sign( header = await self.set_sign(
ARK_SKD_SIGN, ARK_SKD_SIGN,
header=header, header=header,
data=data, data=data,
) )
header['Content-Type'] = 'application/json' header["Content-Type"] = "application/json"
header['Content-Length'] = str(len(json.dumps(data))) header["Content-Length"] = str(len(json.dumps(data)))
raw_data = await self.ark_request( raw_data = await self.ark_request(
url=ARK_SKD_SIGN, url=ARK_SKD_SIGN,
method='POST', method="POST",
data=data, data=data,
header=header, header=header,
) )
@ -128,8 +136,12 @@ class BaseArkApi:
else: else:
return msgspec.convert(unpack_data, ArknightsAttendanceModel) return msgspec.convert(unpack_data, ArknightsAttendanceModel)
async def get_sign_info(self, uid: str) -> Union[int, ArknightsAttendanceCalendarModel]: async def get_sign_info(
cred: Union[str, None] = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred') self, uid: str
) -> Union[int, ArknightsAttendanceCalendarModel]:
cred: Union[str, None] = await ArknightsUser.get_user_attr_by_uid(
uid=uid, attr="cred"
)
if cred is None: if cred is None:
return -60 return -60
is_vaild = await self.check_cred_valid(cred) is_vaild = await self.check_cred_valid(cred)
@ -137,21 +149,21 @@ class BaseArkApi:
await ArknightsUser.delete_user_data_by_uid(uid) await ArknightsUser.delete_user_data_by_uid(uid)
return -61 return -61
header = deepcopy(_HEADER) header = deepcopy(_HEADER)
header['cred'] = cred header["cred"] = cred
header = await self.set_sign( header = await self.set_sign(
ARK_SKD_SIGN, ARK_SKD_SIGN,
header=header, header=header,
params={ params={
'uid': uid, "uid": uid,
'gameId': 1, "gameId": 1,
}, },
) )
raw_data = await self.ark_request( raw_data = await self.ark_request(
url=ARK_SKD_SIGN, url=ARK_SKD_SIGN,
method='GET', method="GET",
params={ params={
'uid': uid, "uid": uid,
'gameId': 1, "gameId": 1,
}, },
header=header, header=header,
) )
@ -166,43 +178,52 @@ class BaseArkApi:
return msgspec.convert(unpack_data, ArknightsAttendanceCalendarModel) return msgspec.convert(unpack_data, ArknightsAttendanceCalendarModel)
async def check_cred_valid( async def check_cred_valid(
self, cred: Union[str, None] = None, token: Union[str, None] = None, uid: Union[str, None] = None self,
cred: Union[str, None] = None,
token: Union[str, None] = None,
uid: Union[str, None] = None,
) -> Union[bool, ArknightsUserMeModel]: ) -> Union[bool, ArknightsUserMeModel]:
if uid is not None: if uid is not None:
cred = cred if cred else await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred') cred = (
cred
if cred
else await ArknightsUser.get_user_attr_by_uid(uid=uid, attr="cred")
)
header = deepcopy(_HEADER) header = deepcopy(_HEADER)
if cred is None: if cred is None:
return False return False
header['cred'] = cred header["cred"] = cred
header = await self.set_sign(ARK_USER_ME, header=header, token=token) header = await self.set_sign(ARK_USER_ME, header=header, token=token)
raw_data = await self.ark_request(ARK_USER_ME, header=header) raw_data = await self.ark_request(ARK_USER_ME, header=header)
if isinstance(raw_data, int) or not raw_data: if isinstance(raw_data, int) or not raw_data:
return False return False
if 'code' in raw_data and raw_data['code'] == 10001: if "code" in raw_data and raw_data["code"] == 10001:
logger.info(f'cred is invalid {raw_data}') logger.info(f"cred is invalid {raw_data}")
return False return False
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: Union[str, None] = None) -> str:
header = deepcopy(_HEADER) header = deepcopy(_HEADER)
header['cred'] = cred header["cred"] = cred
header['sign_enable'] = 'false' header["sign_enable"] = "false"
raw_data = await self.ark_request(url=ARK_REFRESH_TOKEN, header=header) raw_data = await self.ark_request(url=ARK_REFRESH_TOKEN, header=header)
if isinstance(raw_data, int) or not raw_data: if isinstance(raw_data, int) or not raw_data:
raise TokenRefreshFailed raise TokenRefreshFailed
else: else:
token = cast(str, self.unpack(raw_data)['token']) token = cast(str, self.unpack(raw_data)["token"])
uid = await ArknightsUser.get_uid_by_cred(cred) uid = await ArknightsUser.get_uid_by_cred(cred)
if uid is not None: if uid is not None:
await ArknightsUser.update_user_attr_by_uid(uid=uid, attr='token', value=token) await ArknightsUser.update_user_attr_by_uid(
uid=uid, attr="token", value=token
)
return token return token
async def set_sign( async def set_sign(
@ -216,49 +237,54 @@ class BaseArkApi:
parsed_url = urlparse(url) parsed_url = urlparse(url)
path = parsed_url.path path = parsed_url.path
timestamp = str(int(time.time()) - 2) timestamp = str(int(time.time()) - 2)
dId = hashlib.sha256(header['cred'].encode('utf-8')).hexdigest()[0:16] dId = hashlib.sha256(header["cred"].encode("utf-8")).hexdigest()[0:16]
str1 = json.dumps( str1 = json.dumps(
{ {
'platform': header.get('platform', '1'), "platform": header.get("platform", "1"),
'timestamp': timestamp, "timestamp": timestamp,
'dId': dId, "dId": dId,
'vName': header.get('vName', ''), "vName": header.get("vName", ""),
}, },
separators=(',', ':'), separators=(",", ":"),
) )
s2 = '' s2 = ""
if params: if params:
logger.debug(f'params {params}') logger.debug(f"params {params}")
s2 += '&'.join([str(x) + '=' + str(params[x]) for x in params]) s2 += "&".join([str(x) + "=" + str(params[x]) for x in params])
if data: if data:
logger.debug(f'data {data}') logger.debug(f"data {data}")
s2 += json.dumps(data) s2 += json.dumps(data)
logger.debug(f'{path} {s2} {timestamp} {str1}') logger.debug(f"{path} {s2} {timestamp} {str1}")
str2 = path + s2 + timestamp + str1 str2 = path + s2 + timestamp + str1
token_ = await ArknightsUser.get_token_by_cred(header['cred']) token_ = await ArknightsUser.get_token_by_cred(header["cred"])
logger.debug(f'cred {header["cred"]} token {token} token_ {token_}') logger.debug(f'cred {header["cred"]} token {token} token_ {token_}')
token = token if token else token_ token = token if token else token_
if token is None: if token is None:
raise Exception('token is None') raise Exception("token is None")
encode_token = token.encode('utf-8') encode_token = token.encode("utf-8")
hex_s = hmac.new(encode_token, str2.encode('utf-8'), hashlib.sha256).hexdigest() hex_s = hmac.new(encode_token, str2.encode("utf-8"), hashlib.sha256).hexdigest()
sign = hashlib.md5(hex_s.encode('utf-8')).hexdigest().encode('utf-8').decode('utf-8') sign = (
header['sign'] = sign hashlib.md5(hex_s.encode("utf-8"))
header['timestamp'] = timestamp .hexdigest()
header['dId'] = dId .encode("utf-8")
.decode("utf-8")
)
header["sign"] = sign
header["timestamp"] = timestamp
header["dId"] = dId
logger.debug(header) logger.debug(header)
return header return header
async def ark_request( async def ark_request(
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: Union[Dict[str, Any], None] = None,
data: Union[Dict[str, Any], None] = None, data: Union[Dict[str, Any], None] = None,
use_proxy: Union[bool, None] = False, use_proxy: Union[bool, None] = False,
) -> Union[Dict, Union[int, None]]: ) -> Union[Dict, Union[int, None]]:
logger.debug(f'{url} {method} {header} {params} {data} {use_proxy}') logger.debug(f"{url} {method} {header} {params} {data} {use_proxy}")
try: try:
raw_data = await self._ark_request( raw_data = await self._ark_request(
url=url, url=url,
@ -269,7 +295,7 @@ class BaseArkApi:
use_proxy=use_proxy, use_proxy=use_proxy,
) )
except TokenExpiredError: except TokenExpiredError:
await self.refresh_token(header['cred']) await self.refresh_token(header["cred"])
header = await self.set_sign(url, header, data, params) header = await self.set_sign(url, header, data, params)
raw_data = await self._ark_request( raw_data = await self._ark_request(
url=url, url=url,
@ -284,15 +310,17 @@ class BaseArkApi:
async def _ark_request( async def _ark_request(
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: Union[Dict[str, Any], None] = None,
data: Union[Dict[str, Any], None] = None, data: Union[Dict[str, Any], None] = None,
use_proxy: Union[bool, None] = False, use_proxy: Union[bool, None] = False,
) -> Union[Dict, Union[int, None]]: ) -> Union[Dict, Union[int, None]]:
async with ClientSession(connector=TCPConnector(verify_ssl=ssl_verify)) as client: async with ClientSession(
connector=TCPConnector(verify_ssl=ssl_verify)
) as client:
raw_data = {} raw_data = {}
if 'cred' not in header: if "cred" not in header:
return 10001 return 10001
async with client.request( async with client.request(
@ -308,21 +336,21 @@ class BaseArkApi:
raw_data = await resp.json() raw_data = await resp.json()
except ContentTypeError: except ContentTypeError:
_raw_data = await resp.text() _raw_data = await resp.text()
raw_data = {'code': -999, 'data': _raw_data} raw_data = {"code": -999, "data": _raw_data}
logger.info(raw_data) logger.info(raw_data)
# 判断code # 判断code
if raw_data['code'] == 0: if raw_data["code"] == 0:
return raw_data return raw_data
if raw_data['code'] == 10000: if raw_data["code"] == 10000:
# token失效 # token失效
logger.info(f'{url} {raw_data}') logger.info(f"{url} {raw_data}")
raise TokenExpiredError raise TokenExpiredError
if raw_data['code'] == 10001: if raw_data["code"] == 10001:
# 重复签到 # 重复签到
return raw_data['code'] return raw_data["code"]
# 判断status # 判断status
# if 'status' in raw_data and 'msg' in raw_data: # if 'status' in raw_data and 'msg' in raw_data:

View File

@ -1,3 +1,3 @@
from ..arknightsuid_config.ark_config import arkconfig from ..arknightsuid_config.ark_config import arkconfig
PREFIX = arkconfig.get_config('ArknightsPrefix').data PREFIX = arkconfig.get_config("ArknightsPrefix").data

View File

@ -1,4 +1,4 @@
from typing import Dict, List, Literal, Optional, Type, TypeVar, Union from typing import Dict, Literal, Optional, Sequence, Type, TypeVar, Union
from gsuid_core.utils.database.base_models import ( from gsuid_core.utils.database.base_models import (
BaseModel, BaseModel,
@ -13,18 +13,18 @@ from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select from sqlalchemy.future import select
from sqlmodel import Field from sqlmodel import Field
T_ARK_User = TypeVar('T_ARK_User', bound='ArknightsUser') 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: Union[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: Union[str, None] = Field(default=None, title="明日方舟UID")
skd_uid: Union[str, None] = Field(default=None, title='SKD用户ID') skd_uid: Union[str, None] = Field(default=None, title="SKD用户ID")
cred: Union[str, None] = Field(default=None, title='SKD凭证') cred: Union[str, None] = Field(default=None, title="SKD凭证")
token: Union[str, None] = Field(default=None, title='SKD Token') token: Union[str, None] = Field(default=None, title="SKD Token")
@classmethod @classmethod
@with_session @with_session
@ -40,21 +40,23 @@ class ArknightsUser(User, table=True):
@classmethod @classmethod
@with_session @with_session
async def get_all_user(cls: Type[T_ARK_User], session: AsyncSession) -> List[T_ARK_User]: async def get_all_user(
sql = select(cls).where(cls.cred is not None, cls.cred != '') cls: Type[T_ARK_User], session: AsyncSession
) -> Sequence[T_ARK_User]:
sql = select(cls).where(cls.cred is not None, cls.cred != "")
result = await session.execute(sql) result = await session.execute(sql)
data: List[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) -> Union[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) -> Union[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
@classmethod @classmethod
async def update_user_attr_by_uid( async def update_user_attr_by_uid(
@ -79,16 +81,20 @@ class ArknightsUser(User, table=True):
class ArknightsPush(Push, table=True): class ArknightsPush(Push, table=True):
uid: Union[str, None] = Field(default=None, title='明日方舟UID') uid: Union[str, None] = Field(default=None, title="明日方舟UID")
skd_uid: Union[str, None] = Field(default=None, title='森空岛用户ID') skd_uid: Union[str, None] = Field(default=None, title="森空岛用户ID")
ap_push: Union[bool, None] = Field(default=False, title='理智推送') ap_push: Union[bool, None] = Field(default=False, title="理智推送")
ap_value: Union[int, None] = Field(default=110, title='理智推送阈值') ap_value: Union[int, None] = Field(default=110, title="理智推送阈值")
ap_is_push: Union[bool, None] = Field(default=False, title='理智是否已经推送') ap_is_push: Union[bool, None] = Field(default=False, title="理智是否已经推送")
training_push: Union[bool, None] = Field(default=False, title='训练室推送') training_push: Union[bool, None] = Field(default=False, title="训练室推送")
training_value: Union[int, None] = Field(default=30, title='训练室推送阈值') training_value: Union[int, None] = Field(default=30, title="训练室推送阈值")
training_is_push: Union[bool, None] = Field(default=False, title='训练室是否已经推送') training_is_push: Union[bool, None] = Field(
version_push: Union[bool, None] = Field(default=False, title='版本更新推送') default=False, title="训练室是否已经推送"
version_is_push: Union[bool, None] = Field(default=False, title='版本更新是否已经推送') )
version_push: Union[bool, None] = Field(default=False, title="版本更新推送")
version_is_push: Union[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):
@ -131,14 +137,16 @@ class ArknightsPush(Push, table=True):
@classmethod @classmethod
async def change_push_status( async def change_push_status(
cls, cls,
mode: Literal['ap', 'training'], mode: Literal["ap", "training"],
uid: str, uid: str,
status: str, status: str,
): ):
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
) -> Union[T_BaseIDModel, None]:
return await cls.base_select_data(uid=uid) return await cls.base_select_data(uid=uid)
@classmethod @classmethod
@ -148,8 +156,8 @@ class ArknightsPush(Push, table=True):
@site.register_admin @site.register_admin
class ArknightsBindadmin(GsAdminModel): class ArknightsBindadmin(GsAdminModel):
pk_name = 'id' pk_name = "id"
page_schema = PageSchema(label='方舟绑定管理', icon='fa fa-users') # type: ignore page_schema = PageSchema(label="方舟绑定管理", icon="fa fa-users") # type: ignore
# 配置管理模型 # 配置管理模型
model = ArknightsBind model = ArknightsBind
@ -157,8 +165,8 @@ class ArknightsBindadmin(GsAdminModel):
@site.register_admin @site.register_admin
class ArknightsUseradmin(GsAdminModel): class ArknightsUseradmin(GsAdminModel):
pk_name = 'id' pk_name = "id"
page_schema = PageSchema(label='方舟SKD CRED管理', icon='fa fa-database') # type: ignore page_schema = PageSchema(label="方舟SKD CRED管理", icon="fa fa-database") # type: ignore
# 配置管理模型 # 配置管理模型
model = ArknightsUser model = ArknightsUser
@ -166,8 +174,8 @@ class ArknightsUseradmin(GsAdminModel):
@site.register_admin @site.register_admin
class ArknightsPushadmin(GsAdminModel): class ArknightsPushadmin(GsAdminModel):
pk_name = 'id' pk_name = "id"
page_schema = PageSchema(label='明日方舟推送管理', icon='fa fa-database') # type: ignore page_schema = PageSchema(label="明日方舟推送管理", icon="fa fa-database") # type: ignore
# 配置管理模型 # 配置管理模型
model = ArknightsPush model = ArknightsPush

View File

@ -3,9 +3,9 @@ from gsuid_core.utils.database.base_models import async_maker
from sqlalchemy.sql import text from sqlalchemy.sql import text
exec_list = [ exec_list = [
'ALTER TABLE arknightspush ADD COLUMN version_push BOOLEAN DEFAULT FALSE;', "ALTER TABLE arknightspush ADD COLUMN version_push BOOLEAN DEFAULT FALSE;",
'ALTER TABLE arknightspush ADD COLUMN version_is_push BOOLEAN DEFAULT FALSE;', "ALTER TABLE arknightspush ADD COLUMN version_is_push BOOLEAN DEFAULT FALSE;",
'ALTER TABLE arknightsuser ADD COLUMN token TEXT;', "ALTER TABLE arknightsuser ADD COLUMN token TEXT;",
] ]

View File

@ -16,7 +16,7 @@ async def download_file(
async with sess.get(url) as res: async with sess.get(url) as res:
content = await res.read() content = await res.read()
except ClientConnectorError: except ClientConnectorError:
logger.warning(f'[Arknights]{name}下载失败') logger.warning(f"[Arknights]{name}下载失败")
return url, path, name return url, path, name
async with aiofiles.open(path / name, 'wb') as f: async with aiofiles.open(path / name, "wb") as f:
await f.write(content) await f.write(content)

View File

@ -1,14 +1,14 @@
from typing import Union from typing import Union
UID_HINT = '添加失败, 请先绑定明日方舟UID' UID_HINT = "添加失败, 请先绑定明日方舟UID"
def get_error(retcode: Union[int, str]) -> str: def get_error(retcode: Union[int, str]) -> str:
if retcode == 10000: if retcode == 10000:
return '请求异常, 请检查具体实现代码...' return "请求异常, 请检查具体实现代码..."
if retcode == 10001: if retcode == 10001:
return '请勿重复签到!' return "请勿重复签到!"
if retcode == 10003: if retcode == 10003:
return '请勿修改设备时间' return "请勿修改设备时间"
return f'API报错, 错误码为{retcode}!' return f"API报错, 错误码为{retcode}!"

View File

@ -10,10 +10,10 @@ 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.
""" """
try: try:
with Path.open(file_path, encoding='UTF-8', **kwargs) as file: with Path.open(file_path, encoding="UTF-8", **kwargs) as file:
return json.load(file) return json.load(file)
except (FileNotFoundError, json.JSONDecodeError) as e: except (FileNotFoundError, json.JSONDecodeError) as e:
logger.error(f'Error reading JSON file: {e}') logger.error(f"Error reading JSON file: {e}")
return {} return {}
@ -22,7 +22,7 @@ def write_json(data: Dict, file_path: Path) -> None:
Write a dictionary to a JSON file. Write a dictionary to a JSON file.
""" """
try: try:
with Path.open(file_path, mode='w', encoding='UTF-8') as file: with Path.open(file_path, mode="w", encoding="UTF-8") as file:
json.dump(data, file, sort_keys=False, indent=4, ensure_ascii=False) json.dump(data, file, sort_keys=False, indent=4, ensure_ascii=False)
except FileNotFoundError as e: except FileNotFoundError as e:
logger.error(f'Error writing JSON file: {e}') logger.error(f"Error writing JSON file: {e}")

View File

@ -2,7 +2,7 @@ from pathlib import Path
from PIL import ImageFont from PIL import ImageFont
FONT_ORIGIN_PATH = Path(__file__).parent / 'SourceHanSansCN-Medium.ttf' FONT_ORIGIN_PATH = Path(__file__).parent / "SourceHanSansCN-Medium.ttf"
def source_han_sans_cn_origin(size: int) -> ImageFont.FreeTypeFont: def source_han_sans_cn_origin(size: int) -> ImageFont.FreeTypeFont:

View File

@ -2,7 +2,7 @@ from pathlib import Path
from PIL import ImageFont from PIL import ImageFont
FONT_ORIGIN_PATH = Path(__file__).parent / 'SourceHanSerifCN-Medium.ttf' FONT_ORIGIN_PATH = Path(__file__).parent / "SourceHanSerifCN-Medium.ttf"
def source_han_serif_origin(size: int) -> ImageFont.FreeTypeFont: def source_han_serif_origin(size: int) -> ImageFont.FreeTypeFont:

View File

@ -4,9 +4,9 @@ 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
BG_PATH = Path(__file__).parent / 'bg' BG_PATH = Path(__file__).parent / "bg"
NM_BG_PATH = BG_PATH / 'nm_bg' 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(

View File

@ -6,10 +6,10 @@ 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: Union[Dict, None] = None):
if data is None: if data is None:
data = { data = {
0: '绑定UID成功!', 0: "绑定UID成功!",
-1: 'UID的位数不正确!', -1: "UID的位数不正确!",
-2: 'UID已经绑定过了!', -2: "UID已经绑定过了!",
-3: '你输入了错误的格式!', -3: "你输入了错误的格式!",
} }
for retcode in data: for retcode in data:
if code == retcode: if code == retcode:

View File

@ -6,8 +6,8 @@ from msgspec import Struct, UnsetType, convert, field
from msgspec import json as mscjson from msgspec import json as mscjson
from typing_extensions import dataclass_transform from typing_extensions import dataclass_transform
Model = TypeVar('Model', bound='BaseStruct') Model = TypeVar("Model", bound="BaseStruct")
T = TypeVar('T') T = TypeVar("T")
def transUnset(v: Union[T, UnsetType], d: Any = None) -> Union[T, Any]: def transUnset(v: Union[T, UnsetType], d: Any = None) -> Union[T, Any]:

View File

@ -7,8 +7,8 @@ from msgspec import field
class ActivityTableBasicData(BaseStruct): class ActivityTableBasicData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
type_: str = field(name='type') type_: str = field(name="type")
name: str name: str
startTime: int startTime: int
endTime: int endTime: int
@ -32,16 +32,16 @@ class ActivityTableHomeActivityConfig(BaseStruct):
class MissionDisplayRewards(BaseStruct): class MissionDisplayRewards(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
class MissionData(BaseStruct): class MissionData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
sortId: int sortId: int
description: str description: str
type_: str = field(name='type') type_: str = field(name="type")
itemBgType: str itemBgType: str
preMissionIds: Union[List[str], None] preMissionIds: Union[List[str], None]
template: str template: str
@ -59,9 +59,9 @@ class MissionData(BaseStruct):
class MissionGroup(BaseStruct): class MissionGroup(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
title: Union[str, None] title: Union[str, None]
type_: str = field(name='type') type_: str = field(name="type")
preMissionGroup: Union[str, None] preMissionGroup: Union[str, None]
period: Union[List[int], None] period: Union[List[int], None]
rewards: Union[List[MissionDisplayRewards], None] rewards: Union[List[MissionDisplayRewards], None]
@ -79,9 +79,9 @@ class DefaultZoneData(BaseStruct):
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class DefaultShopData(BaseStruct): class DefaultShopData(BaseStruct):
@ -244,7 +244,7 @@ class Act3D0DataLimitedPoolDetailInfoPoolItemInfo(BaseStruct):
perCount: int perCount: int
totalCount: int totalCount: int
weight: int weight: int
type_: str = field(name='type') type_: str = field(name="type")
orderId: int orderId: int
@ -259,7 +259,7 @@ class Act3D0DataInfinitePoolDetailInfoPoolItemInfo(BaseStruct):
goodType: str goodType: str
perCount: int perCount: int
weight: int weight: int
type_: str = field(name='type') type_: str = field(name="type")
orderId: int orderId: int
@ -495,7 +495,7 @@ class RuneData(BaseStruct):
class RuneTablePackedRuneData(BaseStruct): class RuneTablePackedRuneData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
points: float points: float
mutexGroupKey: Union[str, None] mutexGroupKey: Union[str, None]
description: Union[str, None] description: Union[str, None]
@ -523,7 +523,7 @@ class Act5D1Data(BaseStruct):
class ActivityCollectionDataCollectionInfo(BaseStruct): class ActivityCollectionDataCollectionInfo(BaseStruct):
id_: int = field(name='id') id_: int = field(name="id")
itemType: str itemType: str
itemId: str itemId: str
itemCnt: int itemCnt: int
@ -736,7 +736,7 @@ class Act13SideDataLongTermMissionData(BaseStruct):
class Act13SideDataDailyMissionData(BaseStruct): class Act13SideDataDailyMissionData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
sortId: int sortId: int
description: str description: str
missionName: str missionName: str
@ -932,7 +932,7 @@ class Act17sideDataMainlineChapterData(BaseStruct):
chapterDes: str chapterDes: str
chapterIcon: str chapterIcon: str
unlockDes: str unlockDes: str
id_: str = field(name='id') id_: str = field(name="id")
class Act17sideDataMainlineData(BaseStruct): class Act17sideDataMainlineData(BaseStruct):
@ -1175,9 +1175,9 @@ class SharedCharData(BaseStruct):
evolvePhase: int evolvePhase: int
level: int level: int
favorPoint: int favorPoint: int
currentEquip: Union[str, None] = field(name='currentEquip', default=None) currentEquip: Union[str, None] = field(name="currentEquip", default=None)
equips: Union[Dict[str, SharedCharDataCharEquipInfo], None] = field( equips: Union[Dict[str, SharedCharDataCharEquipInfo], None] = field(
name='equip', name="equip",
default={}, default={},
) )
skillIndex: Union[int, None] = None skillIndex: Union[int, None] = None
@ -1244,8 +1244,8 @@ class ActivityBossRushDataBossRushStageAdditionData(BaseStruct):
class ActivityBossRushDataDisplayDetailRewards(BaseStruct): class ActivityBossRushDataDisplayDetailRewards(BaseStruct):
occPercent: int occPercent: int
dropCount: int dropCount: int
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
dropType: int dropType: int
@ -1351,15 +1351,15 @@ class ActivityFloatParadeDataDailyData(BaseStruct):
class ActivityFloatParadeDataRewardPool(BaseStruct): class ActivityFloatParadeDataRewardPool(BaseStruct):
grpId: str grpId: str
id_: str = field(name='id') id_: str = field(name="id")
type_: str = field(name='type') type_: str = field(name="type")
name: str name: str
desc: Union[str, None] desc: Union[str, None]
reward: ItemBundle reward: ItemBundle
class ActivityFloatParadeDataTactic(BaseStruct): class ActivityFloatParadeDataTactic(BaseStruct):
id_: int = field(name='id') id_: int = field(name="id")
name: str name: str
packName: str packName: str
briefName: str briefName: str
@ -1398,7 +1398,7 @@ class ActSandboxData(BaseStruct):
class ActivityMainlineBuffDataMissionGroupData(BaseStruct): class ActivityMainlineBuffDataMissionGroupData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
bindBanner: str bindBanner: str
sortId: int sortId: int
zoneId: str zoneId: str
@ -1414,7 +1414,7 @@ class ActivityMainlineBuffDataPeriodDataStepData(BaseStruct):
class ActivityMainlineBuffDataPeriodData(BaseStruct): class ActivityMainlineBuffDataPeriodData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
startTime: int startTime: int
endTime: int endTime: int
favorUpCharDesc: str favorUpCharDesc: str
@ -1514,23 +1514,23 @@ class Act24SideDataMissionExtraData(BaseStruct):
class WeightItemBundle(BaseStruct): class WeightItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
type_: str = field(name='type') type_: str = field(name="type")
dropType: str dropType: str
count: int count: int
weight: int weight: int
class StageDataDisplayRewards(BaseStruct): class StageDataDisplayRewards(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
dropType: int dropType: int
class StageDataDisplayDetailRewards(BaseStruct): class StageDataDisplayDetailRewards(BaseStruct):
occPercent: int occPercent: int
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
dropType: int dropType: int
@ -1602,7 +1602,7 @@ class Act25SideDataArchiveItemData(BaseStruct):
class Act25SideDataArchiveMapInfoData(BaseStruct): class Act25SideDataArchiveMapInfoData(BaseStruct):
objectId: str objectId: str
type_: int = field(name='type') type_: int = field(name="type")
numberId: str numberId: str
areaId: str areaId: str
sortId: int sortId: int
@ -1625,7 +1625,7 @@ class Act25SideDataAreaInfoData(BaseStruct):
class Act25SideDataAreaMissionData(BaseStruct): class Act25SideDataAreaMissionData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
areaId: str areaId: str
preposedMissionId: Union[str, None] preposedMissionId: Union[str, None]
sortId: int sortId: int
@ -1714,7 +1714,7 @@ class Act38D1DataAct38D1DimensionItemData(BaseStruct):
class Act38D1DataAct38D1CommentData(BaseStruct): class Act38D1DataAct38D1CommentData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
sortId: int sortId: int
desc: str desc: str
@ -1749,7 +1749,7 @@ class Act38D1Data(BaseStruct):
class Act27SideDataAct27SideGoodData(BaseStruct): class Act27SideDataAct27SideGoodData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
typeDesc: str typeDesc: str
iconId: str iconId: str
@ -1868,7 +1868,7 @@ class Act42D0DataEffectGroupInfoData(BaseStruct):
class Act42D0DataEffectInfoRuneData(BaseStruct): class Act42D0DataEffectInfoRuneData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
points: int points: int
mutexGroupKey: Union[str, None] mutexGroupKey: Union[str, None]
description: str description: str
@ -1961,14 +1961,14 @@ class Act29SideFragData(BaseStruct):
class Act29SideOrcheType(Enum): class Act29SideOrcheType(Enum):
ORCHE_1 = 'ORCHE_1' ORCHE_1 = "ORCHE_1"
ORCHE_2 = 'ORCHE_2' ORCHE_2 = "ORCHE_2"
ORCHE_3 = 'ORCHE_3' ORCHE_3 = "ORCHE_3"
ENUM = 'ENUM' ENUM = "ENUM"
class Act29SideOrcheData(BaseStruct): class Act29SideOrcheData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
desc: str desc: str
icon: str icon: str
@ -1977,12 +1977,12 @@ class Act29SideOrcheData(BaseStruct):
class Act29SideProductType(Enum): class Act29SideProductType(Enum):
PRODUCT_TYPE_1 = 'PRODUCT_TYPE_1' PRODUCT_TYPE_1 = "PRODUCT_TYPE_1"
PRODUCT_TYPE_2 = 'PRODUCT_TYPE_2' PRODUCT_TYPE_2 = "PRODUCT_TYPE_2"
PRODUCT_TYPE_3 = 'PRODUCT_TYPE_3' PRODUCT_TYPE_3 = "PRODUCT_TYPE_3"
PRODUCT_TYPE_4 = 'PRODUCT_TYPE_4' PRODUCT_TYPE_4 = "PRODUCT_TYPE_4"
PRODUCT_TYPE_5 = 'PRODUCT_TYPE_5' PRODUCT_TYPE_5 = "PRODUCT_TYPE_5"
ENUM = 'ENUM' ENUM = "ENUM"
class Act29SideProductGroupData(BaseStruct): class Act29SideProductGroupData(BaseStruct):
@ -2012,7 +2012,7 @@ class Act29SideProductGroupData(BaseStruct):
class Act29SideProductData(BaseStruct): class Act29SideProductData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
orcheId: Union[str, None] orcheId: Union[str, None]
groupId: str groupId: str
formId: Union[str, None] formId: Union[str, None]
@ -2037,9 +2037,9 @@ class Act29SideInvestResultData(BaseStruct):
class Act29SideInvestType(Enum): class Act29SideInvestType(Enum):
MAJOR = 'MAJOR' MAJOR = "MAJOR"
RARE = 'RARE' RARE = "RARE"
NORMAL = 'NORMAL' NORMAL = "NORMAL"
class Act29SideInvestData(BaseStruct): class Act29SideInvestData(BaseStruct):
@ -2145,8 +2145,8 @@ class ActivityThemeDataTimeNode(BaseStruct):
class ActivityThemeData(BaseStruct): class ActivityThemeData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
type_: str = field(name='type') type_: str = field(name="type")
funcId: str funcId: str
endTs: int endTs: int
sortId: int sortId: int
@ -2368,7 +2368,7 @@ class AprilFoolTable(BaseStruct):
class CartComponents(BaseStruct): class CartComponents(BaseStruct):
compId: str compId: str
sortId: int sortId: int
type_: str = field(name='type') type_: str = field(name="type")
posList: List[str] posList: List[str]
posIdDict: Dict[str, List[str]] posIdDict: Dict[str, List[str]]
name: str name: str
@ -2608,7 +2608,7 @@ class ActivityTableExtraData(BaseStruct):
class ActivityTable(BaseStruct): class ActivityTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
basicInfo: Dict[str, ActivityTableBasicData] basicInfo: Dict[str, ActivityTableBasicData]
homeActConfig: Dict[str, ActivityTableHomeActivityConfig] homeActConfig: Dict[str, ActivityTableHomeActivityConfig]

View File

@ -62,7 +62,7 @@ class BattleVoiceOption(BaseStruct):
class MusicData(BaseStruct): class MusicData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
bank: str bank: str
@ -91,7 +91,7 @@ class AudioDataFadeStyle(BaseStruct):
class AudioData(BaseStruct): class AudioData(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
bgmBanks: List[BGMBank] bgmBanks: List[BGMBank]
soundFXBanks: List[SoundFXBank] soundFXBanks: List[SoundFXBank]

View File

@ -78,6 +78,6 @@ class BattleEquipData(BaseStruct):
class BattleEquipTable(BaseStruct): class BattleEquipTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
equips: Dict[str, BattleEquipData] equips: Dict[str, BattleEquipData]

View File

@ -6,13 +6,13 @@ from msgspec import field
class BuildingDataRoomUnlockCondCondItem(BaseStruct): class BuildingDataRoomUnlockCondCondItem(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
level: int level: int
count: int count: int
class BuildingDataRoomUnlockCond(BaseStruct): class BuildingDataRoomUnlockCond(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
number: Dict[str, BuildingDataRoomUnlockCondCondItem] number: Dict[str, BuildingDataRoomUnlockCondCondItem]
@ -22,9 +22,9 @@ class GridPosition(BaseStruct):
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class BuildingDataRoomDataBuildCost(BaseStruct): class BuildingDataRoomDataBuildCost(BaseStruct):
@ -44,7 +44,7 @@ class BuildingDataRoomDataPhaseData(BaseStruct):
class BuildingDataRoomData(BaseStruct): class BuildingDataRoomData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
description: Union[str, None] description: Union[str, None]
defaultPrefabId: str defaultPrefabId: str
@ -56,7 +56,7 @@ class BuildingDataRoomData(BaseStruct):
class BuildingDataLayoutDataRoomSlot(BaseStruct): class BuildingDataLayoutDataRoomSlot(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
cleanCostId: str cleanCostId: str
costLabor: int costLabor: int
provideLabor: int provideLabor: int
@ -71,26 +71,26 @@ class BuildingDataLayoutDataSlotCleanCostCountCost(BaseStruct):
class BuildingDataLayoutDataSlotCleanCost(BaseStruct): class BuildingDataLayoutDataSlotCleanCost(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
number: Dict[str, BuildingDataLayoutDataSlotCleanCostCountCost] number: Dict[str, BuildingDataLayoutDataSlotCleanCostCountCost]
class BuildingDataLayoutDataStoreyData(BaseStruct): class BuildingDataLayoutDataStoreyData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
yOffset: int yOffset: int
unlockControlLevel: int unlockControlLevel: int
type_: str = field(name='type') type_: str = field(name="type")
class BuildingDataLayoutData(BaseStruct): class BuildingDataLayoutData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
slots: Dict[str, BuildingDataLayoutDataRoomSlot] slots: Dict[str, BuildingDataLayoutDataRoomSlot]
cleanCosts: Dict[str, BuildingDataLayoutDataSlotCleanCost] cleanCosts: Dict[str, BuildingDataLayoutDataSlotCleanCost]
storeys: Dict[str, BuildingDataLayoutDataStoreyData] storeys: Dict[str, BuildingDataLayoutDataStoreyData]
class BuildingDataPrefabInfo(BaseStruct): class BuildingDataPrefabInfo(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
blueprintRoomOverrideId: Union[str, None] blueprintRoomOverrideId: Union[str, None]
size: GridPosition size: GridPosition
floorGridSize: GridPosition floorGridSize: GridPosition
@ -98,45 +98,45 @@ class BuildingDataPrefabInfo(BaseStruct):
obstacleId: Union[str, None] obstacleId: Union[str, None]
class BuildingDataManufactPhase(BaseStruct, tag='BuildingDataManufactPhase'): class BuildingDataManufactPhase(BaseStruct, tag="BuildingDataManufactPhase"):
speed: Union[float, int] speed: Union[float, int]
outputCapacity: int outputCapacity: int
class BuildingDataShopPhase(BaseStruct, tag='BuildingDataShopPhase'): class BuildingDataShopPhase(BaseStruct, tag="BuildingDataShopPhase"):
counterNum: int counterNum: int
speed: Union[float, int] speed: Union[float, int]
moneyCapacity: int moneyCapacity: int
class BuildingDataHirePhase(BaseStruct, tag='BuildingDataHirePhase'): class BuildingDataHirePhase(BaseStruct, tag="BuildingDataHirePhase"):
economizeRate: float economizeRate: float
resSpeed: int resSpeed: int
refreshTimes: int refreshTimes: int
class BuildingDataDormPhase(BaseStruct, tag='BuildingDataDormPhase'): class BuildingDataDormPhase(BaseStruct, tag="BuildingDataDormPhase"):
manpowerRecover: int manpowerRecover: int
decorationLimit: int decorationLimit: int
class BuildingDataMeetingPhase(BaseStruct, tag='BuildingDataMeetingPhase'): class BuildingDataMeetingPhase(BaseStruct, tag="BuildingDataMeetingPhase"):
friendSlotInc: int friendSlotInc: int
maxVisitorNum: int maxVisitorNum: int
gatheringSpeed: int gatheringSpeed: int
class BuildingDataTradingPhase(BaseStruct, tag='BuildingDataTradingPhase'): class BuildingDataTradingPhase(BaseStruct, tag="BuildingDataTradingPhase"):
orderSpeed: Union[float, int] orderSpeed: Union[float, int]
orderLimit: int orderLimit: int
orderRarity: int orderRarity: int
class BuildingDataWorkshopPhase(BaseStruct, tag='BuildingDataWorkshopPhase'): class BuildingDataWorkshopPhase(BaseStruct, tag="BuildingDataWorkshopPhase"):
manpowerFactor: Union[float, int] manpowerFactor: Union[float, int]
class BuildingDataTrainingPhase(BaseStruct, tag='BuildingDataTrainingPhase'): class BuildingDataTrainingPhase(BaseStruct, tag="BuildingDataTrainingPhase"):
specSkillLvlLimit: int specSkillLvlLimit: int
@ -222,11 +222,11 @@ class BuildingDataBuildingBuff(BaseStruct):
class BuildingDataCustomDataFurnitureData(BaseStruct): class BuildingDataCustomDataFurnitureData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
sortId: int sortId: int
name: str name: str
iconId: str iconId: str
type_: str = field(name='type') type_: str = field(name="type")
subType: str subType: str
location: str location: str
category: str category: str
@ -257,11 +257,11 @@ class BuildingDataCustomDataThemeQuickSetupItem(BaseStruct):
furnitureId: str furnitureId: str
pos0: int pos0: int
pos1: int pos1: int
dir_: int = field(name='dir') dir_: int = field(name="dir")
class BuildingDataCustomDataThemeData(BaseStruct): class BuildingDataCustomDataThemeData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
sortId: int sortId: int
name: str name: str
themeType: str themeType: str
@ -272,7 +272,7 @@ class BuildingDataCustomDataThemeData(BaseStruct):
class BuildingDataCustomDataGroupData(BaseStruct): class BuildingDataCustomDataGroupData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
sortId: int sortId: int
name: str name: str
themeId: str themeId: str
@ -282,14 +282,14 @@ class BuildingDataCustomDataGroupData(BaseStruct):
class BuildingDataCustomDataFurnitureTypeData(BaseStruct): class BuildingDataCustomDataFurnitureTypeData(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
name: str name: str
class BuildingDataCustomDataFurnitureSubTypeData(BaseStruct): class BuildingDataCustomDataFurnitureSubTypeData(BaseStruct):
subType: str subType: str
name: str name: str
type_: str = field(name='type') type_: str = field(name="type")
sortId: int sortId: int
@ -318,7 +318,9 @@ class BuildingDataCustomDataDiyUISortTemplateListData(BaseStruct):
expandState: str expandState: str
defaultTemplateIndex: int defaultTemplateIndex: int
defaultTemplateOrder: str defaultTemplateOrder: str
templates: List[BuildingDataCustomDataDiyUISortTemplateListDataDiyUISortTemplateData] templates: List[
BuildingDataCustomDataDiyUISortTemplateListDataDiyUISortTemplateData
]
class BuildingDataCustomData(BaseStruct): class BuildingDataCustomData(BaseStruct):
@ -421,7 +423,7 @@ class BuildingDataCreditFormula(BaseStruct):
class BuildingData(BaseStruct): class BuildingData(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
controlSlotId: str controlSlotId: str
meetingSlotId: str meetingSlotId: str

View File

@ -6,9 +6,9 @@ from msgspec import field
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class CampaignDataBreakRewardLadder(BaseStruct): class CampaignDataBreakRewardLadder(BaseStruct):
@ -18,16 +18,16 @@ class CampaignDataBreakRewardLadder(BaseStruct):
class WeightItemBundle(BaseStruct): class WeightItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
type_: str = field(name='type') type_: str = field(name="type")
dropType: str dropType: str
count: int count: int
weight: int weight: int
class StageDataDisplayRewards_(BaseStruct): class StageDataDisplayRewards_(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
dropType: int dropType: int
@ -58,15 +58,15 @@ class CampaignDataGainLadder(BaseStruct):
class StageDataDisplayRewards(BaseStruct): class StageDataDisplayRewards(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
dropType: int dropType: int
class StageDataDisplayDetailRewards(BaseStruct): class StageDataDisplayDetailRewards(BaseStruct):
occPercent: int occPercent: int
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
dropType: int dropType: int
@ -93,19 +93,19 @@ class CampaignGroupData(BaseStruct):
class CampaignRegionData(BaseStruct): class CampaignRegionData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
isUnknwon: int isUnknwon: int
class CampaignZoneData(BaseStruct): class CampaignZoneData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
regionId: str regionId: str
templateId: str templateId: str
class CampaignMissionData(BaseStruct): class CampaignMissionData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
sortId: int sortId: int
param: List[str] param: List[str]
description: str description: str
@ -145,7 +145,7 @@ class CampaignTrainingAllOpenTimeData(BaseStruct):
class CampaignTable(BaseStruct): class CampaignTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
campaigns: Dict[str, CampaignData] campaigns: Dict[str, CampaignData]
campaignGroups: Dict[str, CampaignGroupData] campaignGroups: Dict[str, CampaignGroupData]

View File

@ -15,6 +15,6 @@ class ChapterData(BaseStruct):
class ChapterTable(BaseStruct): class ChapterTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
chapters: Dict[str, ChapterData] chapters: Dict[str, ChapterData]

View File

@ -6,9 +6,9 @@ from msgspec import field
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class SpCharMissionData(BaseStruct): class SpCharMissionData(BaseStruct):
@ -21,7 +21,7 @@ class SpCharMissionData(BaseStruct):
class CharMetaTable(BaseStruct): class CharMetaTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
spCharGroups: Dict[str, List[str]] spCharGroups: Dict[str, List[str]]
spCharMissions: Dict[str, Dict[str, SpCharMissionData]] spCharMissions: Dict[str, Dict[str, SpCharMissionData]]

View File

@ -37,7 +37,7 @@ class CharacterDataTraitDataBundle(BaseStruct):
class AttributesData(BaseStruct): class AttributesData(BaseStruct):
maxHp: int maxHp: int
atk: int atk: int
def_: int = field(name='def') def_: int = field(name="def")
magicResistance: float magicResistance: float
cost: int cost: int
blockCnt: int blockCnt: int
@ -66,9 +66,9 @@ class CharacterDataAttributesKeyFrame(BaseStruct):
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class CharacterDataPhaseData(BaseStruct): class CharacterDataPhaseData(BaseStruct):
@ -130,7 +130,7 @@ class ExternalBuff(BaseStruct):
class CharacterDataPotentialRank(BaseStruct): class CharacterDataPotentialRank(BaseStruct):
type_: int = field(name='type') type_: int = field(name="type")
description: str description: str
buff: Union[ExternalBuff, None] buff: Union[ExternalBuff, None]
equivalentCost: Union[ItemBundle, None] equivalentCost: Union[ItemBundle, None]
@ -192,7 +192,7 @@ class CharPatchDataPatchDetailInfo(BaseStruct):
class CharPatchTable(BaseStruct): class CharPatchTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
infos: Dict[str, CharPatchDataPatchInfo] infos: Dict[str, CharPatchDataPatchInfo]
patchChars: Dict[str, CharacterData] patchChars: Dict[str, CharacterData]

View File

@ -33,7 +33,7 @@ class CharacterDataTraitDataBundle(BaseStruct):
class AttributesData(BaseStruct): class AttributesData(BaseStruct):
maxHp: int maxHp: int
atk: int atk: int
def_: int = field(name='def') def_: int = field(name="def")
magicResistance: float magicResistance: float
cost: int cost: int
blockCnt: int blockCnt: int
@ -62,9 +62,9 @@ class CharacterDataAttributesKeyFrame(BaseStruct):
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class CharacterDataPhaseData(BaseStruct): class CharacterDataPhaseData(BaseStruct):
@ -127,7 +127,7 @@ class ExternalBuff(BaseStruct):
class CharacterDataPotentialRank(BaseStruct): class CharacterDataPotentialRank(BaseStruct):
type_: int = field(name='type') type_: int = field(name="type")
description: str description: str
buff: Union[ExternalBuff, None] buff: Union[ExternalBuff, None]
equivalentCost: Union[ItemBundle, None] equivalentCost: Union[ItemBundle, None]
@ -176,7 +176,7 @@ class CharacterData(BaseStruct):
class CharacterTable(BaseStruct): class CharacterTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
chars: Dict[str, CharacterData] chars: Dict[str, CharacterData]

View File

@ -34,7 +34,7 @@ class RuneData(BaseStruct):
class RuneTablePackedRuneData(BaseStruct): class RuneTablePackedRuneData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
points: float points: float
mutexGroupKey: Union[str, None] mutexGroupKey: Union[str, None]
description: str description: str
@ -42,7 +42,7 @@ class RuneTablePackedRuneData(BaseStruct):
class CharmItemData(BaseStruct): class CharmItemData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
sort: int sort: int
name: str name: str
icon: str icon: str
@ -61,6 +61,6 @@ class CharmItemData(BaseStruct):
class CharmTable(BaseStruct): class CharmTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
charmList: List[CharmItemData] charmList: List[CharmItemData]

View File

@ -36,7 +36,7 @@ class VoiceLangInfoData(BaseStruct):
class VoiceLangData(BaseStruct): class VoiceLangData(BaseStruct):
wordkeys: List[str] wordkeys: List[str]
charId: str charId: str
dict_: Dict[str, VoiceLangInfoData] = field(name='dict') dict_: Dict[str, VoiceLangInfoData] = field(name="dict")
class VoiceLangTypeData(BaseStruct): class VoiceLangTypeData(BaseStruct):
@ -55,7 +55,7 @@ class NewVoiceTimeData(BaseStruct):
class CharwordTable(BaseStruct): class CharwordTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
charWords: Dict[str, CharWordData] charWords: Dict[str, CharWordData]
voiceLangDict: Dict[str, VoiceLangData] voiceLangDict: Dict[str, VoiceLangData]

View File

@ -6,9 +6,9 @@ from msgspec import field
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class MonthlySignInData(BaseStruct): class MonthlySignInData(BaseStruct):
@ -36,7 +36,7 @@ class MonthlyDailyBonusGroup(BaseStruct):
class CheckinTable(BaseStruct): class CheckinTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
groups: Dict[str, MonthlySignInGroupData] groups: Dict[str, MonthlySignInGroupData]
monthlySubItem: Dict[str, List[MonthlyDailyBonusGroup]] monthlySubItem: Dict[str, List[MonthlyDailyBonusGroup]]

View File

@ -6,9 +6,9 @@ from msgspec import field
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class ClimbTowerSingleTowerDataClimbTowerTaskRewardData(BaseStruct): class ClimbTowerSingleTowerDataClimbTowerTaskRewardData(BaseStruct):
@ -17,7 +17,7 @@ class ClimbTowerSingleTowerDataClimbTowerTaskRewardData(BaseStruct):
class ClimbTowerSingleTowerData(BaseStruct): class ClimbTowerSingleTowerData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
sortId: int sortId: int
stageNum: int stageNum: int
name: str name: str
@ -42,29 +42,29 @@ class ClimbTowerSingleTowerData(BaseStruct):
class WeightItemBundle(BaseStruct): class WeightItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
type_: str = field(name='type') type_: str = field(name="type")
dropType: str dropType: str
count: int count: int
weight: int weight: int
class StageDataDisplayRewards(BaseStruct): class StageDataDisplayRewards(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
dropType: int dropType: int
class StageDataDisplayDetailRewards(BaseStruct): class StageDataDisplayDetailRewards(BaseStruct):
occPercent: int occPercent: int
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
dropType: int dropType: int
class ClimbTowerDropDisplayInfo(BaseStruct): class ClimbTowerDropDisplayInfo(BaseStruct):
itemId: str itemId: str
type_: int = field(name='type') type_: int = field(name="type")
maxCount: int maxCount: int
minCount: int minCount: int
@ -77,7 +77,7 @@ class ClimbTowerLevelDropInfo(BaseStruct):
class ClimbTowerSingleLevelData(BaseStruct): class ClimbTowerSingleLevelData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
levelId: str levelId: str
towerId: str towerId: str
layerNum: int layerNum: int
@ -90,7 +90,7 @@ class ClimbTowerSingleLevelData(BaseStruct):
class ClimbTowerTacticalBuffData(BaseStruct): class ClimbTowerTacticalBuffData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
desc: str desc: str
profession: str profession: str
isDefaultActive: bool isDefaultActive: bool
@ -127,7 +127,7 @@ class RuneData(BaseStruct):
class RuneTablePackedRuneData(BaseStruct): class RuneTablePackedRuneData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
points: float points: float
mutexGroupKey: Union[str, None] mutexGroupKey: Union[str, None]
description: str description: str
@ -135,8 +135,8 @@ class RuneTablePackedRuneData(BaseStruct):
class ClimbTowerMainCardData(BaseStruct): class ClimbTowerMainCardData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
type_: str = field(name='type') type_: str = field(name="type")
linkedTowerId: Union[str, None] linkedTowerId: Union[str, None]
sortId: int sortId: int
name: str name: str
@ -147,7 +147,7 @@ class ClimbTowerMainCardData(BaseStruct):
class ClimbTowerSubCardData(BaseStruct): class ClimbTowerSubCardData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
mainCardId: str mainCardId: str
sortId: int sortId: int
name: str name: str
@ -157,7 +157,7 @@ class ClimbTowerSubCardData(BaseStruct):
class ClimbTowerCurseCardData(BaseStruct): class ClimbTowerCurseCardData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
towerIdList: List[str] towerIdList: List[str]
name: str name: str
desc: str desc: str
@ -165,7 +165,7 @@ class ClimbTowerCurseCardData(BaseStruct):
class ClimbTowerSeasonInfoData(BaseStruct): class ClimbTowerSeasonInfoData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
startTs: int startTs: int
endTs: int endTs: int
@ -199,16 +199,16 @@ class ClimbTowerRewardInfo(BaseStruct):
class MissionDisplayRewards(BaseStruct): class MissionDisplayRewards(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
class MissionData(BaseStruct): class MissionData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
sortId: int sortId: int
description: str description: str
type_: str = field(name='type') type_: str = field(name="type")
itemBgType: str itemBgType: str
preMissionIds: Union[List[str], None] preMissionIds: Union[List[str], None]
template: str template: str
@ -231,9 +231,9 @@ class ClimbTowerMissionData(MissionData):
class MissionGroup(BaseStruct): class MissionGroup(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
title: Union[str, None] title: Union[str, None]
type_: str = field(name='type') type_: str = field(name="type")
preMissionGroup: Union[str, None] preMissionGroup: Union[str, None]
period: Union[List[int], None] period: Union[List[int], None]
rewards: List[MissionDisplayRewards] rewards: List[MissionDisplayRewards]
@ -243,7 +243,7 @@ class MissionGroup(BaseStruct):
class ClimbTowerTable(BaseStruct): class ClimbTowerTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
towers: Dict[str, ClimbTowerSingleTowerData] towers: Dict[str, ClimbTowerSingleTowerData]
levels: Dict[str, ClimbTowerSingleLevelData] levels: Dict[str, ClimbTowerSingleLevelData]

View File

@ -21,7 +21,7 @@ class MeetingClueDataReceiveTimeBonus(BaseStruct):
class ClueData(BaseStruct): class ClueData(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
clues: List[MeetingClueDataClueData] clues: List[MeetingClueDataClueData]
clueTypes: List[MeetingClueDataClueTypeData] clueTypes: List[MeetingClueDataClueTypeData]

View File

@ -6,9 +6,9 @@ from msgspec import field
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class StringKeyFrames(BaseStruct): class StringKeyFrames(BaseStruct):
@ -34,7 +34,7 @@ class CrisisMapRankInfo(BaseStruct):
class CrisisTable(BaseStruct): class CrisisTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
seasonInfo: List[CrisisClientDataSeasonInfo] seasonInfo: List[CrisisClientDataSeasonInfo]
meta: str meta: str

View File

@ -7,9 +7,9 @@ from msgspec import field
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class StringKeyFrames(BaseStruct): class StringKeyFrames(BaseStruct):
@ -31,13 +31,13 @@ class CrisisV2ConstData(BaseStruct):
class appraiseType(Enum): class appraiseType(Enum):
RANK_D = 'RANK_D' RANK_D = "RANK_D"
RANK_C = 'RANK_C' RANK_C = "RANK_C"
RANK_B = 'RANK_B' RANK_B = "RANK_B"
RANK_A = 'RANK_A' RANK_A = "RANK_A"
RANK_S = 'RANK_S' RANK_S = "RANK_S"
RANK_SS = 'RANK_SS' RANK_SS = "RANK_SS"
RANK_SSS = 'RANK_SSS' RANK_SSS = "RANK_SSS"
class CrisisV2ScoreLevelToAppraiseData(BaseStruct): class CrisisV2ScoreLevelToAppraiseData(BaseStruct):
@ -45,7 +45,7 @@ class CrisisV2ScoreLevelToAppraiseData(BaseStruct):
class CrisisV2Table(BaseStruct): class CrisisV2Table(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
seasonInfoDataMap: Dict seasonInfoDataMap: Dict
scoreLevelToAppraiseDataMap: Dict[str, CrisisV2ScoreLevelToAppraiseData] scoreLevelToAppraiseDataMap: Dict[str, CrisisV2ScoreLevelToAppraiseData]

View File

@ -42,8 +42,8 @@ class HomeBackgroundSingleData(BaseStruct):
class HomeBackgroundThemeData(BaseStruct): class HomeBackgroundThemeData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
type_: str = field(name='type') type_: str = field(name="type")
sortId: int sortId: int
startTime: int startTime: int
tmName: str tmName: str
@ -62,7 +62,7 @@ class ThemeLimitInfo(BaseStruct):
class HomeBackgroundThemeLimitData(BaseStruct): class HomeBackgroundThemeLimitData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
limitInfos: List[ThemeLimitInfo] limitInfos: List[ThemeLimitInfo]
@ -75,6 +75,7 @@ class HomeBackgroundData(BaseStruct):
defaultBgMusicId: str defaultBgMusicId: str
themeStartTime: int themeStartTime: int
# class # class
# class NameCardV2Data(BaseStruct): # class NameCardV2Data(BaseStruct):
@ -85,7 +86,7 @@ class HomeBackgroundData(BaseStruct):
class DisplayMetaTable(BaseStruct): class DisplayMetaTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
playerAvatarData: PlayerAvatarData playerAvatarData: PlayerAvatarData
homeBackgroundData: HomeBackgroundData homeBackgroundData: HomeBackgroundData

View File

@ -31,14 +31,14 @@ class EnemyHandBookData(BaseStruct):
class EnemyHandbookLevelInfoDataRangePair(BaseStruct): class EnemyHandbookLevelInfoDataRangePair(BaseStruct):
min_: float = field(name='min') min_: float = field(name="min")
max_: float = field(name='max') max_: float = field(name="max")
class EnemyHandbookLevelInfoData(BaseStruct): class EnemyHandbookLevelInfoData(BaseStruct):
classLevel: str classLevel: str
attack: EnemyHandbookLevelInfoDataRangePair attack: EnemyHandbookLevelInfoDataRangePair
def_: EnemyHandbookLevelInfoDataRangePair = field(name='def') def_: EnemyHandbookLevelInfoDataRangePair = field(name="def")
magicRes: EnemyHandbookLevelInfoDataRangePair magicRes: EnemyHandbookLevelInfoDataRangePair
maxHP: EnemyHandbookLevelInfoDataRangePair maxHP: EnemyHandbookLevelInfoDataRangePair
moveSpeed: EnemyHandbookLevelInfoDataRangePair moveSpeed: EnemyHandbookLevelInfoDataRangePair
@ -48,13 +48,13 @@ class EnemyHandbookLevelInfoData(BaseStruct):
class EnemyHandbookRaceData(BaseStruct): class EnemyHandbookRaceData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
raceName: str raceName: str
sortId: int sortId: int
class EnemyHandbookTable(BaseStruct): class EnemyHandbookTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
levelInfoList: List[EnemyHandbookLevelInfoData] levelInfoList: List[EnemyHandbookLevelInfoData]
enemyData: Dict[str, EnemyHandBookData] enemyData: Dict[str, EnemyHandBookData]

View File

@ -15,7 +15,7 @@ class FavorDataFrames(BaseStruct):
class FavorTable(BaseStruct): class FavorTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
maxFavor: int maxFavor: int
favorFrames: List[FavorDataFrames] favorFrames: List[FavorDataFrames]

View File

@ -32,9 +32,9 @@ class GachaDataCarouselData(BaseStruct):
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class GachaDataRecruitRange(BaseStruct): class GachaDataRecruitRange(BaseStruct):
@ -131,7 +131,7 @@ class GachaDataFesGachaPoolRelateItem(BaseStruct):
class GachaTable(BaseStruct): class GachaTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
gachaTags: List[GachaTag] gachaTags: List[GachaTag]
carousel: List[GachaDataCarouselData] carousel: List[GachaDataCarouselData]

View File

@ -6,9 +6,9 @@ from msgspec import field
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class GameDataConstsCharAssistRefreshTimeState(BaseStruct): class GameDataConstsCharAssistRefreshTimeState(BaseStruct):
@ -23,7 +23,7 @@ class TermDescriptionData(BaseStruct):
class GamedataConst(BaseStruct): class GamedataConst(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
addedRewardDisplayZone: str addedRewardDisplayZone: str
advancedGachaCrystalCost: int advancedGachaCrystalCost: int

View File

@ -13,9 +13,9 @@ class HandbookUnlockParam(BaseStruct):
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class HandbookStageTimeData(BaseStruct): class HandbookStageTimeData(BaseStruct):
@ -43,11 +43,11 @@ class HandbookStoryStageData(BaseStruct):
class HandbookDisplayCondition(BaseStruct): class HandbookDisplayCondition(BaseStruct):
charId: str charId: str
conditionCharId: str conditionCharId: str
type_: str = field(name='type') type_: str = field(name="type")
class HandbookTeamMission(BaseStruct): class HandbookTeamMission(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
sort: int sort: int
powerId: str powerId: str
powerName: str powerName: str
@ -122,7 +122,7 @@ class HandbookInfoData(BaseStruct):
class HandbookInfoTable(BaseStruct): class HandbookInfoTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
handbookDict: Dict[str, HandbookInfoData] handbookDict: Dict[str, HandbookInfoData]
npcDict: Dict[str, NPCData] npcDict: Dict[str, NPCData]

View File

@ -40,6 +40,6 @@ class CharHandbook(BaseStruct):
class HandbookTable(BaseStruct): class HandbookTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
char_102_texas: CharHandbook char_102_texas: CharHandbook

View File

@ -15,6 +15,6 @@ class HandbookTeam(BaseStruct):
class HandbookTeamTable(BaseStruct): class HandbookTeamTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
team: Dict[str, HandbookTeam] team: Dict[str, HandbookTeam]

View File

@ -1,4 +1,4 @@
from typing import Dict, List, Union from typing import ClassVar, Dict, List, Union
from ..common import BaseStruct from ..common import BaseStruct
@ -16,9 +16,9 @@ class ItemDataBuildingProductInfo(BaseStruct):
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class FavorCharacterInfo(BaseStruct): class FavorCharacterInfo(BaseStruct):
@ -47,13 +47,13 @@ class UniCollectionInfo(BaseStruct):
class ApSupplyFeature(BaseStruct): class ApSupplyFeature(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
ap: int ap: int
hasTs: bool hasTs: bool
class ExpItemFeature(BaseStruct): class ExpItemFeature(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
gainExp: int gainExp: int
@ -70,9 +70,9 @@ class ItemData(BaseStruct):
sortId: int sortId: int
classifyType: str classifyType: str
itemType: str itemType: str
stageDropList: List[Union[ItemDataStageDropInfo, None]] = [] stageDropList: ClassVar[List[Union[ItemDataStageDropInfo, None]]] = []
buildingProductList: List[Union[ItemDataBuildingProductInfo, None]] = [] buildingProductList: ClassVar[List[Union[ItemDataBuildingProductInfo, None]]] = []
voucherRelateList: List[Union[ItemDataVoucherRelateInfo, None]] = [] voucherRelateList: ClassVar[List[Union[ItemDataVoucherRelateInfo, None]]] = []
overrideBkg: Union[str, None] = None overrideBkg: Union[str, None] = None
usage: Union[str, None] = None usage: Union[str, None] = None
description: Union[str, None] = None description: Union[str, None] = None
@ -83,7 +83,7 @@ class ItemData(BaseStruct):
class CharVoucherItemFeature(BaseStruct): class CharVoucherItemFeature(BaseStruct):
displayType: int displayType: int
id_: str = field(name='id') id_: str = field(name="id")
class ServerItemReminderMailData(BaseStruct): class ServerItemReminderMailData(BaseStruct):
@ -98,7 +98,7 @@ class ServerItemReminderInfo(BaseStruct):
class ItemTable(BaseStruct): class ItemTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
activityPotentialCharacters: Dict[str, ActivityPotentialCharacterInfo] activityPotentialCharacters: Dict[str, ActivityPotentialCharacterInfo]
apSupplies: Dict[str, ApSupplyFeature] apSupplies: Dict[str, ApSupplyFeature]

View File

@ -8,13 +8,13 @@ from msgspec import field
class MedalExpireTime(BaseStruct): class MedalExpireTime(BaseStruct):
start: int start: int
end: int end: int
type_: str = field(name='type') type_: str = field(name="type")
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class MedalGroupData(BaseStruct): class MedalGroupData(BaseStruct):
@ -61,7 +61,7 @@ class MedalPerData(BaseStruct):
class MedalTable(BaseStruct): class MedalTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
medalList: List[MedalPerData] medalList: List[MedalPerData]
medalTypeData: Dict[str, MedalTypeData] medalTypeData: Dict[str, MedalTypeData]

View File

@ -6,8 +6,8 @@ from msgspec import field
class MissionDisplayRewards(BaseStruct): class MissionDisplayRewards(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
@ -28,26 +28,26 @@ class MissionWeeklyRewardConf(BaseStruct):
beginTime: int beginTime: int
endTime: int endTime: int
groupId: str groupId: str
id_: str = field(name='id') id_: str = field(name="id")
periodicalPointCost: int periodicalPointCost: int
type_: str = field(name='type') type_: str = field(name="type")
sortIndex: int sortIndex: int
rewards: List[MissionDisplayRewards] rewards: List[MissionDisplayRewards]
class MissionDailyRewardConf(BaseStruct): class MissionDailyRewardConf(BaseStruct):
groupId: str groupId: str
id_: str = field(name='id') id_: str = field(name="id")
periodicalPointCost: int periodicalPointCost: int
type_: str = field(name='type') type_: str = field(name="type")
sortIndex: int sortIndex: int
rewards: List[MissionDisplayRewards] rewards: List[MissionDisplayRewards]
class MissionGroup(BaseStruct): class MissionGroup(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
title: Union[str, None] title: Union[str, None]
type_: str = field(name='type') type_: str = field(name="type")
preMissionGroup: Union[str, None] preMissionGroup: Union[str, None]
period: Union[List[int], None] period: Union[List[int], None]
rewards: Union[List[MissionDisplayRewards], None] rewards: Union[List[MissionDisplayRewards], None]
@ -57,10 +57,10 @@ class MissionGroup(BaseStruct):
class MissionData(BaseStruct): class MissionData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
sortId: int sortId: int
description: str description: str
type_: str = field(name='type') type_: str = field(name="type")
itemBgType: str itemBgType: str
preMissionIds: Union[List[str], None] preMissionIds: Union[List[str], None]
template: str template: str
@ -90,7 +90,7 @@ class CrossAppShareMissions(BaseStruct):
class MissionTable(BaseStruct): class MissionTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
missions: Dict[str, MissionData] missions: Dict[str, MissionData]
missionGroups: Dict[str, MissionGroup] missionGroups: Dict[str, MissionGroup]

View File

@ -6,21 +6,21 @@ from msgspec import field
class RewardItem(BaseStruct): class RewardItem(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
sortId: int sortId: int
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
class MissionDisplayRewards(BaseStruct): class MissionDisplayRewards(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
@ -42,7 +42,7 @@ class ReturnCheckinData(BaseStruct):
class ReturnLongTermTaskData(BaseStruct): class ReturnLongTermTaskData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
sortId: int sortId: int
template: str template: str
param: List[str] param: List[str]
@ -53,7 +53,7 @@ class ReturnLongTermTaskData(BaseStruct):
class ReturnDailyTaskData(BaseStruct): class ReturnDailyTaskData(BaseStruct):
groupId: str groupId: str
id_: str = field(name='id') id_: str = field(name="id")
groupSortId: int groupSortId: int
taskSortId: int taskSortId: int
template: str template: str
@ -105,10 +105,10 @@ class ChainLoginData(BaseStruct):
class MissionData(BaseStruct): class MissionData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
sortId: int sortId: int
description: str description: str
type_: str = field(name='type') type_: str = field(name="type")
itemBgType: str itemBgType: str
preMissionIds: None preMissionIds: None
template: str template: str
@ -126,9 +126,9 @@ class MissionData(BaseStruct):
class MissionGroup(BaseStruct): class MissionGroup(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
title: None title: None
type_: str = field(name='type') type_: str = field(name="type")
preMissionGroup: None preMissionGroup: None
period: None period: None
rewards: None rewards: None
@ -145,7 +145,7 @@ class OpenServerData(BaseStruct):
class OpenServerScheduleItem(BaseStruct): class OpenServerScheduleItem(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
startTs: int startTs: int
endTs: int endTs: int
totalCheckinDescption: str totalCheckinDescption: str
@ -269,7 +269,7 @@ class OpenServerNewbieCheckInPackage(BaseStruct):
class OpenServerTable(BaseStruct): class OpenServerTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
schedule: List[OpenServerScheduleItem] schedule: List[OpenServerScheduleItem]
dataMap: Dict[str, OpenServerData] dataMap: Dict[str, OpenServerData]

View File

@ -21,7 +21,7 @@ class PlayerAvatarPerData(BaseStruct):
class PlayerAvatarTable(BaseStruct): class PlayerAvatarTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
avatarList: List[PlayerAvatarPerData] avatarList: List[PlayerAvatarPerData]
avatarTypeData: Dict[str, PlayerAvatarGroupData] avatarTypeData: Dict[str, PlayerAvatarGroupData]

View File

@ -18,13 +18,13 @@ class ObscuredRect(BaseStruct):
class Stage(BaseStruct): class Stage(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
direction: int direction: int
grids: List[GridPosition] grids: List[GridPosition]
boundingBoxes: Union[List[ObscuredRect], None] = None boundingBoxes: Union[List[ObscuredRect], None] = None
class RangeTable(BaseStruct): class RangeTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
range_: Dict[str, Stage] range_: Dict[str, Stage]

View File

@ -6,9 +6,9 @@ from msgspec import field
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class ReplicateData(BaseStruct): class ReplicateData(BaseStruct):
@ -21,6 +21,6 @@ class ReplicateList(BaseStruct):
class ReplicateTable(BaseStruct): class ReplicateTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
replicate: Dict[str, ReplicateList] replicate: Dict[str, ReplicateList]

View File

@ -6,14 +6,14 @@ from msgspec import field
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class StageDataDisplayRewards(BaseStruct): class StageDataDisplayRewards(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
dropType: int dropType: int
@ -32,8 +32,8 @@ class Act17sideDataChoiceNodeOptionData(BaseStruct):
class StageDataDisplayDetailRewards(BaseStruct): class StageDataDisplayDetailRewards(BaseStruct):
occPercent: int occPercent: int
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
dropType: int dropType: int
CannotGetPercent: Union[float, None] = None CannotGetPercent: Union[float, None] = None
GetPercent: Union[float, None] = None GetPercent: Union[float, None] = None
@ -69,7 +69,7 @@ class Act17sideDataMainlineChapterData(BaseStruct):
chapterDes: str chapterDes: str
chapterIcon: str chapterIcon: str
unlockDes: str unlockDes: str
id_: str = field(name='id') id_: str = field(name="id")
class RunesSelector(BaseStruct): class RunesSelector(BaseStruct):
@ -95,7 +95,7 @@ class TechTreeBranchRunes(BaseStruct):
class BranchRuneData(BaseStruct): class BranchRuneData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
points: float points: float
mutexGroupKey: None mutexGroupKey: None
description: str description: str
@ -266,7 +266,7 @@ class RuneData(BaseStruct):
class RuneTablePackedRuneData(BaseStruct): class RuneTablePackedRuneData(BaseStruct):
description: str description: str
id_: str = field(name='id') id_: str = field(name="id")
points: float points: float
runes: List[RuneData] runes: List[RuneData]
mutexGroupKey: Union[str, None] = None mutexGroupKey: Union[str, None] = None
@ -322,8 +322,8 @@ class RetroTrailRuleData(BaseStruct):
class WeightItemBundle(BaseStruct): class WeightItemBundle(BaseStruct):
count: int count: int
dropType: str dropType: str
id_: str = field(name='id') id_: str = field(name="id")
type_: str = field(name='type') type_: str = field(name="type")
weight: int weight: int
@ -407,7 +407,7 @@ class RetroTrailData(BaseStruct):
class RetroActData(BaseStruct): class RetroActData(BaseStruct):
retroId: str retroId: str
type_: int = field(name='type') type_: int = field(name="type")
linkedActId: List[str] linkedActId: List[str]
startTime: int startTime: int
trailStartTime: int trailStartTime: int
@ -436,7 +436,7 @@ class RetroStageOverrideInfo(BaseStruct):
class RetroTable(BaseStruct): class RetroTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
customData: ActivityCustomData customData: ActivityCustomData
initRetroCoin: int initRetroCoin: int

View File

@ -28,12 +28,12 @@ class RoguelikeOuterBuff(BaseStruct):
class RoguelikeOutBuffData(BaseStruct): class RoguelikeOutBuffData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
buffs: Dict[str, RoguelikeOuterBuff] buffs: Dict[str, RoguelikeOuterBuff]
class RoguelikeEndingData(BaseStruct): class RoguelikeEndingData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
backgroundId: str backgroundId: str
name: str name: str
description: str description: str
@ -43,7 +43,7 @@ class RoguelikeEndingData(BaseStruct):
class RoguelikeModeData(BaseStruct): class RoguelikeModeData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
canUnlockItem: int canUnlockItem: int
scoreFactor: float scoreFactor: float
@ -56,24 +56,24 @@ class RoguelikeModeData(BaseStruct):
class RoguelikeChoiceSceneData(BaseStruct): class RoguelikeChoiceSceneData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
title: str title: str
description: str description: str
background: str background: str
class RoguelikeChoiceData(BaseStruct): class RoguelikeChoiceData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
title: str title: str
description: Union[str, None] description: Union[str, None]
type_: str = field(name='type') type_: str = field(name="type")
nextSceneId: Union[str, None] nextSceneId: Union[str, None]
icon: Union[str, None] icon: Union[str, None]
param: Dict[str, object] param: Dict[str, object]
class RoguelikeZoneData(BaseStruct): class RoguelikeZoneData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
description: str description: str
endingDescription: str endingDescription: str
@ -82,7 +82,7 @@ class RoguelikeZoneData(BaseStruct):
class RoguelikeStageData(BaseStruct): class RoguelikeStageData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
linkedStageId: str linkedStageId: str
levelId: str levelId: str
code: str code: str
@ -96,12 +96,12 @@ class RoguelikeStageData(BaseStruct):
class RoguelikeRelicFeature(BaseStruct): class RoguelikeRelicFeature(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
buffs: List[RoguelikeBuff] buffs: List[RoguelikeBuff]
class RoguelikeUpgradeTicketFeature(BaseStruct): class RoguelikeUpgradeTicketFeature(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
profession: int profession: int
rarity: int rarity: int
professionList: List[str] professionList: List[str]
@ -109,7 +109,7 @@ class RoguelikeUpgradeTicketFeature(BaseStruct):
class RoguelikeRecruitTicketFeature(BaseStruct): class RoguelikeRecruitTicketFeature(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
profession: int profession: int
rarity: int rarity: int
professionList: List[str] professionList: List[str]
@ -125,13 +125,13 @@ class RelicStableUnlockParam(BaseStruct):
class RoguelikeItemData(BaseStruct): class RoguelikeItemData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
description: Union[str, None] description: Union[str, None]
usage: str usage: str
obtainApproach: str obtainApproach: str
iconId: str iconId: str
type_: str = field(name='type') type_: str = field(name="type")
rarity: str rarity: str
value: int value: int
sortId: int sortId: int
@ -193,7 +193,7 @@ class RoguelikeConstTable(BaseStruct):
class RoguelikeTable(BaseStruct): class RoguelikeTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
constTable: RoguelikeConstTable constTable: RoguelikeConstTable
itemTable: RoguelikeItemTable itemTable: RoguelikeItemTable

View File

@ -21,7 +21,7 @@ class RoguelikeTopicConfig(BaseStruct):
class RoguelikeTopicBasicData(BaseStruct): class RoguelikeTopicBasicData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
startTime: int startTime: int
disappearTimeOnMainScreen: int disappearTimeOnMainScreen: int
@ -68,7 +68,7 @@ class RoguelikeTopicEnroll(BaseStruct):
class RoguelikeTopicBP(BaseStruct): class RoguelikeTopicBP(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
level: int level: int
tokenNum: int tokenNum: int
nextTokenNum: int nextTokenNum: int
@ -88,9 +88,9 @@ class RoguelikeTopicMilestoneUpdateData(BaseStruct):
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class RoguelikeTopicBPGrandPrize(BaseStruct): class RoguelikeTopicBPGrandPrize(BaseStruct):
@ -111,7 +111,7 @@ class RoguelikeTopicBPGrandPrize(BaseStruct):
class RoguelikeTopicMonthMission(BaseStruct): class RoguelikeTopicMonthMission(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
taskName: str taskName: str
taskClass: str taskClass: str
innerClassWeight: int innerClassWeight: int
@ -122,7 +122,7 @@ class RoguelikeTopicMonthMission(BaseStruct):
class RoguelikeTopicMonthSquad(BaseStruct): class RoguelikeTopicMonthSquad(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
teamName: str teamName: str
teamSubName: Union[str, None] teamSubName: Union[str, None]
teamFlavorDesc: Union[str, None] teamFlavorDesc: Union[str, None]
@ -298,8 +298,8 @@ class ActArchiveBuffData(BaseStruct):
class ActArchiveTotemItemData(BaseStruct): class ActArchiveTotemItemData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
type_: int = field(name='type') type_: int = field(name="type")
enrollConditionId: Union[str, None] enrollConditionId: Union[str, None]
sortId: int sortId: int
@ -309,7 +309,7 @@ class ActArchiveTotemData(BaseStruct):
class ActArchiveChaosItemData(BaseStruct): class ActArchiveChaosItemData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
isHidden: bool isHidden: bool
enrollId: Union[str, None] enrollId: Union[str, None]
sortId: int sortId: int
@ -420,7 +420,7 @@ class RoguelikeGameInitData(BaseStruct):
class RoguelikeGameStageData(BaseStruct): class RoguelikeGameStageData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
linkedStageId: str linkedStageId: str
levelId: str levelId: str
code: str code: str
@ -439,7 +439,7 @@ class RoguelikeGameStageData(BaseStruct):
class RoguelikeGameZoneData(BaseStruct): class RoguelikeGameZoneData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
clockPerformance: Union[str, None] clockPerformance: Union[str, None]
displayTime: Union[str, None] displayTime: Union[str, None]
@ -462,7 +462,7 @@ class RoguelikeGameTrapData(BaseStruct):
class RoguelikeGameRecruitTicketData(BaseStruct): class RoguelikeGameRecruitTicketData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
profession: int profession: int
rarity: int rarity: int
professionList: List[str] professionList: List[str]
@ -473,7 +473,7 @@ class RoguelikeGameRecruitTicketData(BaseStruct):
class RoguelikeGameUpgradeTicketData(BaseStruct): class RoguelikeGameUpgradeTicketData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
profession: int profession: int
rarity: int rarity: int
professionList: List[str] professionList: List[str]
@ -481,7 +481,7 @@ class RoguelikeGameUpgradeTicketData(BaseStruct):
class RoguelikeGameCustomTicketData(BaseStruct): class RoguelikeGameCustomTicketData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
subType: str subType: str
discardText: str discardText: str
@ -498,7 +498,7 @@ class RoguelikeBuff(BaseStruct):
class RoguelikeGameRelicData(BaseStruct): class RoguelikeGameRelicData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
buffs: List[RoguelikeBuff] buffs: List[RoguelikeBuff]
@ -509,13 +509,13 @@ class RoguelikeGameRelicCheckParam(BaseStruct):
class RoguelikeGameRelicParamData(BaseStruct): class RoguelikeGameRelicParamData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
checkCharBoxTypes: List[str] checkCharBoxTypes: List[str]
checkCharBoxParams: List[RoguelikeGameRelicCheckParam] checkCharBoxParams: List[RoguelikeGameRelicCheckParam]
class RoguelikeGameRecruitGrpData(BaseStruct): class RoguelikeGameRecruitGrpData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
iconId: str iconId: str
name: str name: str
desc: str desc: str
@ -523,7 +523,7 @@ class RoguelikeGameRecruitGrpData(BaseStruct):
class RoguelikeChoiceDisplayData(BaseStruct): class RoguelikeChoiceDisplayData(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
funcIconId: Union[str, None] funcIconId: Union[str, None]
itemId: Union[str, None] itemId: Union[str, None]
taskId: Union[str, None] taskId: Union[str, None]
@ -533,11 +533,11 @@ class RoguelikeChoiceDisplayData(BaseStruct):
class RoguelikeGameChoiceData(BaseStruct): class RoguelikeGameChoiceData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
title: str title: str
description: Union[str, None] description: Union[str, None]
lockedCoverDesc: Union[str, None] lockedCoverDesc: Union[str, None]
type_: str = field(name='type') type_: str = field(name="type")
leftDecoType: str leftDecoType: str
nextSceneId: Union[str, None] nextSceneId: Union[str, None]
icon: Union[str, None] icon: Union[str, None]
@ -546,7 +546,7 @@ class RoguelikeGameChoiceData(BaseStruct):
class RoguelikeGameChoiceSceneData(BaseStruct): class RoguelikeGameChoiceSceneData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
title: str title: str
description: str description: str
background: Union[str, None] background: Union[str, None]
@ -569,8 +569,8 @@ class RoguelikeGameNodeSubTypeData(BaseStruct):
class RoguelikeGameVariationData(BaseStruct): class RoguelikeGameVariationData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
type_: str = field(name='type') type_: str = field(name="type")
outerName: str outerName: str
innerName: str innerName: str
functionDesc: str functionDesc: str
@ -580,7 +580,7 @@ class RoguelikeGameVariationData(BaseStruct):
class RoguelikeGameCharBuffData(BaseStruct): class RoguelikeGameCharBuffData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
iconId: str iconId: str
outerName: str outerName: str
innerName: str innerName: str
@ -590,7 +590,7 @@ class RoguelikeGameCharBuffData(BaseStruct):
class RoguelikeGameSquadBuffData(BaseStruct): class RoguelikeGameSquadBuffData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
iconId: str iconId: str
outerName: str outerName: str
innerName: str innerName: str
@ -672,7 +672,7 @@ class RoguelikeGameEndingDataLevelIcon(BaseStruct):
class RoguelikeGameEndingData(BaseStruct): class RoguelikeGameEndingData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
familyId: int familyId: int
name: str name: str
desc: str desc: str
@ -694,13 +694,13 @@ class TipData(BaseStruct):
class RoguelikeGameItemData(BaseStruct): class RoguelikeGameItemData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
description: Union[str, None] description: Union[str, None]
usage: str usage: str
obtainApproach: str obtainApproach: str
iconId: str iconId: str
type_: str = field(name='type') type_: str = field(name="type")
subType: str subType: str
rarity: str rarity: str
value: int value: int
@ -804,7 +804,7 @@ class RoguelikeTopicDetail(BaseStruct):
] ]
styleConfig: Dict[str, RoguelikePredefinedStyleData] styleConfig: Dict[str, RoguelikePredefinedStyleData]
exploreTools: Union[Dict[str, RoguelikeGameExploreToolData], None] = None exploreTools: Union[Dict[str, RoguelikeGameExploreToolData], None] = None
styles: Union[Dict[str, RoguelikePredefinedStyleData], None] = {} styles: Union[Dict[str, RoguelikePredefinedStyleData], None] = None
class RoguelikeModuleBaseData(BaseStruct): class RoguelikeModuleBaseData(BaseStruct):
@ -970,7 +970,7 @@ class RoguelikeVisionData(BaseStruct):
class RoguelikeVisionModuleDataVisionChoiceConfig(BaseStruct): class RoguelikeVisionModuleDataVisionChoiceConfig(BaseStruct):
value: int value: int
type_: int = field(name='type') type_: int = field(name="type")
class RoguelikeVisionModuleConsts(BaseStruct): class RoguelikeVisionModuleConsts(BaseStruct):
@ -1236,7 +1236,7 @@ class RoguelikeTopicCustomizeData(BaseStruct):
class RoguelikeTopicTable(BaseStruct): class RoguelikeTopicTable(BaseStruct):
__version__ = '23-12-02-09-28-50-918524' __version__ = "23-12-02-09-28-50-918524"
topics: Dict[str, RoguelikeTopicBasicData] topics: Dict[str, RoguelikeTopicBasicData]
constant: RoguelikeTopicConst constant: RoguelikeTopicConst

View File

@ -873,7 +873,7 @@ class SandboxPermItemData(BaseStruct):
class SandboxPermTable(BaseStruct): class SandboxPermTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
basicInfo: Dict[str, SandboxPermBasicData] basicInfo: Dict[str, SandboxPermBasicData]
detail: SandboxPermDetailData detail: SandboxPermDetailData

View File

@ -240,7 +240,7 @@ class SandboxEventData(BaseStruct):
class SandboxEventSceneData(BaseStruct): class SandboxEventSceneData(BaseStruct):
choiceSceneId: str choiceSceneId: str
type_: str = field(name='type') type_: str = field(name="type")
title: str title: str
description: str description: str
choices: List[str] choices: List[str]
@ -248,7 +248,7 @@ class SandboxEventSceneData(BaseStruct):
class SandboxEventChoiceData(BaseStruct): class SandboxEventChoiceData(BaseStruct):
choiceId: str choiceId: str
type_: str = field(name='type') type_: str = field(name="type")
costAction: int costAction: int
finishScene: bool finishScene: bool
title: str title: str
@ -272,12 +272,12 @@ class SandboxMissionData(BaseStruct):
class SandboxUnitData(BaseStruct): class SandboxUnitData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
class SandboxDailyDescTemplateData(BaseStruct): class SandboxDailyDescTemplateData(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
templateDesc: List[str] templateDesc: List[str]
@ -296,7 +296,7 @@ class RushEnemyGroupConfig(BaseStruct):
class RushEnemyGroupRushEnemyDBRef(BaseStruct): class RushEnemyGroupRushEnemyDBRef(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
level: int level: int
@ -331,7 +331,7 @@ class RuneData(BaseStruct):
class RuneTablePackedRuneData(BaseStruct): class RuneTablePackedRuneData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
points: Union[int, float] points: Union[int, float]
mutexGroupKey: Union[str, None] mutexGroupKey: Union[str, None]
description: str description: str
@ -398,7 +398,7 @@ class SandboxItemData(BaseStruct):
class SandboxTable(BaseStruct): class SandboxTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
sandboxActTables: Dict[str, SandboxActTable] sandboxActTables: Dict[str, SandboxActTable]
itemDatas: Dict[str, SandboxItemData] itemDatas: Dict[str, SandboxItemData]

View File

@ -20,7 +20,7 @@ class ShopRecommendGroup(BaseStruct):
class ShopKeeperWord(BaseStruct): class ShopKeeperWord(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
text: str text: str
@ -92,7 +92,7 @@ class ShopCreditUnlockItem(BaseStruct):
class ShopCreditUnlockGroup(BaseStruct): class ShopCreditUnlockGroup(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
index: str index: str
startDateTime: int startDateTime: int
charDict: List[ShopCreditUnlockItem] charDict: List[ShopCreditUnlockItem]
@ -145,7 +145,7 @@ class LMTGSShopOverlaySchedule(BaseStruct):
class ShopClientTable(BaseStruct): class ShopClientTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
recommendList: List[ShopRecommendItem] recommendList: List[ShopRecommendItem]
creditUnlockGroup: Dict[str, ShopCreditUnlockGroup] creditUnlockGroup: Dict[str, ShopCreditUnlockGroup]

View File

@ -6,9 +6,9 @@ from msgspec import field
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class SpData(BaseStruct): class SpData(BaseStruct):
@ -46,6 +46,6 @@ class SkillDataBundle(BaseStruct):
class SkillTable(BaseStruct): class SkillTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
skills: Dict[str, SkillDataBundle] skills: Dict[str, SkillDataBundle]

View File

@ -82,7 +82,7 @@ class SpecialSkinInfo(BaseStruct):
class SkinTable(BaseStruct): class SkinTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
charSkins: Dict[str, CharSkinData] charSkins: Dict[str, CharSkinData]
buildinEvolveMap: Dict[str, Dict[str, str]] buildinEvolveMap: Dict[str, Dict[str, str]]

View File

@ -11,15 +11,15 @@ class StageDataConditionDesc(BaseStruct):
class StageDataDisplayRewards(BaseStruct): class StageDataDisplayRewards(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
dropType: int dropType: int
class StageDataDisplayDetailRewards(BaseStruct): class StageDataDisplayDetailRewards(BaseStruct):
occPercent: int occPercent: int
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
dropType: int dropType: int
@ -44,9 +44,9 @@ class ProgressInfo(BaseStruct):
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class ExtraInfo(BaseStruct): class ExtraInfo(BaseStruct):
@ -139,7 +139,7 @@ class TileAppendInfo(BaseStruct):
class WeeklyForceOpenTable(BaseStruct): class WeeklyForceOpenTable(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
startTime: int startTime: int
endTime: int endTime: int
forceOpenList: List[str] forceOpenList: List[str]
@ -241,7 +241,7 @@ class ApProtectZoneInfo(BaseStruct):
class StageTable(BaseStruct): class StageTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
stages: Dict[str, StageData] stages: Dict[str, StageData]
runeStageGroups: Dict[str, RuneStageGroupData] runeStageGroups: Dict[str, RuneStageGroupData]

View File

@ -11,9 +11,9 @@ class MiniActTrialDataRuleData(BaseStruct):
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class MiniActTrialDataMiniActTrialRewardData(BaseStruct): class MiniActTrialDataMiniActTrialRewardData(BaseStruct):
@ -38,23 +38,23 @@ class MiniActTrialData(BaseStruct):
class ActArchiveResDataPicArchiveResItemData(BaseStruct): class ActArchiveResDataPicArchiveResItemData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
desc: str desc: str
assetPath: str assetPath: str
type_: str = field(name='type') type_: str = field(name="type")
subType: Union[str, None] subType: Union[str, None]
picDescription: str picDescription: str
kvId: Union[str, None] kvId: Union[str, None]
class ActArchiveResDataAudioArchiveResItemData(BaseStruct): class ActArchiveResDataAudioArchiveResItemData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
desc: str desc: str
name: str name: str
class ActArchiveResDataAvgArchiveResItemData(BaseStruct): class ActArchiveResDataAvgArchiveResItemData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
desc: str desc: str
breifPath: Union[str, None] breifPath: Union[str, None]
contentPath: str contentPath: str
@ -64,7 +64,7 @@ class ActArchiveResDataAvgArchiveResItemData(BaseStruct):
class ActArchiveResDataStoryArchiveResItemData(BaseStruct): class ActArchiveResDataStoryArchiveResItemData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
desc: str desc: str
date: Union[str, None] date: Union[str, None]
pic: str pic: str
@ -86,7 +86,7 @@ class ActArchiveResDataActivityNewsLine(BaseStruct):
class ActArchiveResDataNewsArchiveResItemData(BaseStruct): class ActArchiveResDataNewsArchiveResItemData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
desc: str desc: str
newsType: str newsType: str
newsFormat: ActArchiveResDataNewsFormatData newsFormat: ActArchiveResDataNewsFormatData
@ -229,7 +229,7 @@ class ActArchiveComponentTable(BaseStruct):
class StoryReviewMetaTable(BaseStruct): class StoryReviewMetaTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
miniActTrialData: MiniActTrialData miniActTrialData: MiniActTrialData
actArchiveResData: ActArchiveResData actArchiveResData: ActArchiveResData

View File

@ -6,9 +6,9 @@ from msgspec import field
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class StoryDataConditionStageCondition(BaseStruct): class StoryDataConditionStageCondition(BaseStruct):
@ -40,7 +40,7 @@ class StoryReviewInfoClientData(BaseStruct):
class StoryReviewGroupClientData(BaseStruct): class StoryReviewGroupClientData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
entryType: str entryType: str
actType: str actType: str
@ -60,6 +60,6 @@ class StoryReviewGroupClientData(BaseStruct):
class StoryReviewTable(BaseStruct): class StoryReviewTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
storyreviewtable: Dict[str, StoryReviewGroupClientData] storyreviewtable: Dict[str, StoryReviewGroupClientData]

View File

@ -6,7 +6,7 @@ from msgspec import field
class StoryDataTrigger(BaseStruct): class StoryDataTrigger(BaseStruct):
type_: str = field(name='type') type_: str = field(name="type")
key: Union[str, None] key: Union[str, None]
useRegex: bool useRegex: bool
@ -27,13 +27,13 @@ class StoryDataCondition(BaseStruct):
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class StoryData(BaseStruct): class StoryData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
needCommit: bool needCommit: bool
repeatable: bool repeatable: bool
disabled: bool disabled: bool
@ -46,6 +46,6 @@ class StoryData(BaseStruct):
class StoryTable(BaseStruct): class StoryTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
stories: Dict[str, StoryData] stories: Dict[str, StoryData]

View File

@ -27,7 +27,7 @@ class RuneData(BaseStruct):
class PackedRuneData(BaseStruct): class PackedRuneData(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
points: float points: float
mutexGroupKey: Union[str, None] mutexGroupKey: Union[str, None]
description: str description: str
@ -35,6 +35,6 @@ class PackedRuneData(BaseStruct):
class TechBuffTable(BaseStruct): class TechBuffTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
runes: List[PackedRuneData] runes: List[PackedRuneData]

View File

@ -17,7 +17,7 @@ class WorldViewTip(BaseStruct):
class TipTable(BaseStruct): class TipTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
tips: List[TipData] tips: List[TipData]
worldViewTips: List[WorldViewTip] worldViewTips: List[WorldViewTip]

View File

@ -32,7 +32,7 @@ class CharacterDataTraitDataBundle(BaseStruct):
class AttributesData(BaseStruct): class AttributesData(BaseStruct):
maxHp: int maxHp: int
atk: int atk: int
def_: int = field(name='def') def_: int = field(name="def")
magicResistance: float magicResistance: float
cost: int cost: int
blockCnt: int blockCnt: int
@ -61,9 +61,9 @@ class CharacterDataAttributesKeyFrame(BaseStruct):
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class CharacterDataPhaseData(BaseStruct): class CharacterDataPhaseData(BaseStruct):
@ -124,7 +124,7 @@ class ExternalBuff(BaseStruct):
class CharacterDataPotentialRank(BaseStruct): class CharacterDataPotentialRank(BaseStruct):
type_: int = field(name='type') type_: int = field(name="type")
description: str description: str
buff: Union[ExternalBuff, None] buff: Union[ExternalBuff, None]
equivalentCost: Union[ItemBundle, None] equivalentCost: Union[ItemBundle, None]
@ -171,6 +171,6 @@ class TokenCharacterData(BaseStruct):
class TokenTable(BaseStruct): class TokenTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
tokens: Dict[str, TokenCharacterData] tokens: Dict[str, TokenCharacterData]

View File

@ -6,9 +6,9 @@ from msgspec import field
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class UnlockCondition(BaseStruct): class UnlockCondition(BaseStruct):
@ -39,7 +39,7 @@ class UniEquipData(BaseStruct):
unlockFavorPercent: int unlockFavorPercent: int
missionList: List[str] missionList: List[str]
itemCost: Union[List[ItemBundle], None] itemCost: Union[List[ItemBundle], None]
type_: str = field(name='type') type_: str = field(name="type")
traitDescBundle: List[TraitDescBundle] traitDescBundle: List[TraitDescBundle]
@ -59,7 +59,7 @@ class SubProfessionData(BaseStruct):
class UniequipData(BaseStruct): class UniequipData(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
equipDict: Dict[str, UniEquipData] equipDict: Dict[str, UniEquipData]
missionList: Dict[str, UniEquipMissionData] missionList: Dict[str, UniEquipMissionData]

View File

@ -6,9 +6,9 @@ from msgspec import field
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class UniEquipData(BaseStruct): class UniEquipData(BaseStruct):
@ -29,7 +29,7 @@ class UniEquipData(BaseStruct):
unlockFavorPoint: int unlockFavorPoint: int
missionList: List[str] missionList: List[str]
itemCost: Union[Dict[str, List[ItemBundle]], None] itemCost: Union[Dict[str, List[ItemBundle]], None]
type_: str = field(name='type') type_: str = field(name="type")
uniEquipGetTime: int uniEquipGetTime: int
charEquipOrder: int charEquipOrder: int
@ -61,7 +61,7 @@ class UniEquipTimeInfo(BaseStruct):
class UniEquipTable(BaseStruct): class UniEquipTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
equipDict: Dict[str, UniEquipData] equipDict: Dict[str, UniEquipData]
missionList: Dict[str, UniEquipMissionData] missionList: Dict[str, UniEquipMissionData]

View File

@ -8,7 +8,7 @@ from msgspec import field
class ZoneData(BaseStruct): class ZoneData(BaseStruct):
zoneID: str zoneID: str
zoneIndex: int zoneIndex: int
type_: str = field(name='type') type_: str = field(name="type")
zoneNameFirst: Union[str, None] zoneNameFirst: Union[str, None]
zoneNameSecond: Union[str, None] zoneNameSecond: Union[str, None]
zoneNameTitleCurrent: Union[str, None] zoneNameTitleCurrent: Union[str, None]
@ -21,7 +21,7 @@ class ZoneData(BaseStruct):
class WeeklyZoneData(BaseStruct): class WeeklyZoneData(BaseStruct):
daysOfWeek: List[int] daysOfWeek: List[int]
type_: str = field(name='type') type_: str = field(name="type")
class ZoneValidInfo(BaseStruct): class ZoneValidInfo(BaseStruct):
@ -47,9 +47,9 @@ class MainlineZoneData(BaseStruct):
class ItemBundle(BaseStruct): class ItemBundle(BaseStruct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class RecordRewardInfo(BaseStruct): class RecordRewardInfo(BaseStruct):
@ -101,7 +101,7 @@ class ZoneMetaData(BaseStruct):
class ZoneTable(BaseStruct): class ZoneTable(BaseStruct):
__version__ = '24-02-02-10-18-07-831ad8' __version__ = "24-02-02-10-18-07-831ad8"
zones: Dict[str, ZoneData] zones: Dict[str, ZoneData]
weeklyAdditionInfo: Dict[str, WeeklyZoneData] weeklyAdditionInfo: Dict[str, WeeklyZoneData]

View File

@ -6,8 +6,8 @@ from msgspec import Struct, field
# ArknightsAttendanceCalendar Start # ArknightsAttendanceCalendar Start
################ ################
class ArknightsAttendanceAwardResource(Struct): class ArknightsAttendanceAwardResource(Struct):
id_: str = field(name='id') id_: str = field(name="id")
type_: str = field(name='type') type_: str = field(name="type")
name: str name: str
rarity: int rarity: int
@ -15,13 +15,13 @@ class ArknightsAttendanceAwardResource(Struct):
class ArknightsAttendanceRecord(Struct): class ArknightsAttendanceRecord(Struct):
ts: str ts: str
resourceId: str resourceId: str
type_: str = field(name='type') type_: str = field(name="type")
count: int count: int
class ArknightsAttendanceCalendar(Struct): class ArknightsAttendanceCalendar(Struct):
resourceId: str resourceId: str
type_: str = field(name='type') type_: str = field(name="type")
count: int count: int
available: bool available: bool
done: bool done: bool
@ -40,7 +40,7 @@ class ArknightsAttendanceCalendarModel(Struct):
class ArknightsAttendanceAward(Struct): class ArknightsAttendanceAward(Struct):
resource: ArknightsAttendanceAwardResource resource: ArknightsAttendanceAwardResource
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
class ArknightsAttendanceModel(Struct): class ArknightsAttendanceModel(Struct):
@ -69,7 +69,7 @@ class UserMeModerator(Struct):
class UserGameStatusAp(Struct): class UserGameStatusAp(Struct):
current: int current: int
max_: int = field(name='max') max_: int = field(name="max")
lastApAddTime: int lastApAddTime: int
completeRecoveryTime: int completeRecoveryTime: int
@ -80,8 +80,8 @@ class UserGameStatusSecretary(Struct):
class UserGameStatusAvatar(Struct): class UserGameStatusAvatar(Struct):
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
class UserGameStatus(Struct): class UserGameStatus(Struct):
@ -113,7 +113,7 @@ class UserMeInfoRts(Struct):
class UserMeInfo(Struct): class UserMeInfo(Struct):
id_: str = field(name='id') id_: str = field(name="id")
nickname: str nickname: str
profile: str profile: str
avatarCode: int avatarCode: int
@ -152,7 +152,7 @@ class ArknightsUserMeModel(Struct, omit_defaults=True):
class PlayerManufactureFormulaInfo(Struct): class PlayerManufactureFormulaInfo(Struct):
id_: str = field(name='id') id_: str = field(name="id")
itemId: str itemId: str
count: int count: int
weight: int weight: int
@ -161,7 +161,7 @@ class PlayerManufactureFormulaInfo(Struct):
class PlayerEquipmentInfo(Struct): class PlayerEquipmentInfo(Struct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
typeIcon: str typeIcon: str
shiningColor: str shiningColor: str
@ -170,7 +170,7 @@ class PlayerEquipmentInfo(Struct):
class PlayerCampaignZoneInfo(Struct): class PlayerCampaignZoneInfo(Struct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
@ -179,19 +179,19 @@ class PlayerMedalInfo(Struct):
class PlayerCampaignInfo(Struct): class PlayerCampaignInfo(Struct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
campaignZoneId: str campaignZoneId: str
class PlayerRogueInfo(Struct): class PlayerRogueInfo(Struct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
sort: int sort: int
class PlayerTowerInfo(Struct): class PlayerTowerInfo(Struct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
subName: str subName: str
hasHard: Union[bool, None] = None hasHard: Union[bool, None] = None
@ -199,28 +199,28 @@ class PlayerTowerInfo(Struct):
class PlayerZoneInfo(Struct): class PlayerZoneInfo(Struct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
class PlayerActivityInfo(Struct): class PlayerActivityInfo(Struct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
startTime: int startTime: int
endTime: int endTime: int
rewardEndTime: int rewardEndTime: int
isReplicate: bool isReplicate: bool
type_: str = field(name='type') type_: str = field(name="type")
class PlayerStageInfo(Struct): class PlayerStageInfo(Struct):
id_: str = field(name='id') id_: str = field(name="id")
code: str code: str
name: str name: str
class PlayerSkinInfo(Struct): class PlayerSkinInfo(Struct):
id_: str = field(name='id') id_: str = field(name="id")
brandId: str brandId: str
sortId: int sortId: int
displayTagId: str displayTagId: str
@ -235,7 +235,7 @@ class PlayerSkinInfo(Struct):
class PlayerCharInfo(Struct): class PlayerCharInfo(Struct):
id_: str = field(name='id') id_: str = field(name="id")
name: str name: str
nationId: str nationId: str
groupId: str groupId: str
@ -262,7 +262,7 @@ 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_: Union[str, None] = field(name="type", default=None)
class RewoardItem(Struct): class RewoardItem(Struct):
@ -451,14 +451,14 @@ class BuildingDormitories(Struct):
class BuildingStockDelivery(Struct): class BuildingStockDelivery(Struct):
id_: str = field(name='id') id_: str = field(name="id")
count: int count: int
type_: str = field(name='type') type_: str = field(name="type")
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
@ -522,17 +522,17 @@ class PlayerBuilding(Struct):
class PlayerInfoSkin(Struct): class PlayerInfoSkin(Struct):
id_: str = field(name='id') id_: str = field(name="id")
ts: int ts: int
class PlayerInfoCharSkill(Struct): class PlayerInfoCharSkill(Struct):
id_: str = field(name='id') id_: str = field(name="id")
specializeLevel: int specializeLevel: int
class PlayerInfoCharEquip(Struct): class PlayerInfoCharEquip(Struct):
id_: str = field(name='id') id_: str = field(name="id")
level: int level: int
@ -552,7 +552,7 @@ class PlayerInfoChar(Struct):
class PlayerAssistCharEquip(Struct): class PlayerAssistCharEquip(Struct):
id_: str = field(name='id') id_: str = field(name="id")
level: int level: int
@ -569,7 +569,7 @@ class PlayerAssistChar(Struct):
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[Union[str, None]]
@ -589,8 +589,8 @@ class PlayerStatusSecretary(Struct):
class PlayerStatusAvatar(Struct): class PlayerStatusAvatar(Struct):
type_: str = field(name='type') type_: str = field(name="type")
id_: str = field(name='id') id_: str = field(name="id")
class PlayerStatus(Struct): class PlayerStatus(Struct):

View File

@ -2,26 +2,26 @@ import sys
from gsuid_core.data_store import get_res_path from gsuid_core.data_store import get_res_path
MAIN_PATH = get_res_path() / 'ArknightsUID' MAIN_PATH = get_res_path() / "ArknightsUID"
sys.path.append(str(MAIN_PATH)) sys.path.append(str(MAIN_PATH))
CU_BG_PATH = MAIN_PATH / 'bg' CU_BG_PATH = MAIN_PATH / "bg"
CONFIG_PATH = MAIN_PATH / 'config.json' CONFIG_PATH = MAIN_PATH / "config.json"
PLAYER_PATH = MAIN_PATH / 'players' PLAYER_PATH = MAIN_PATH / "players"
RESOURCE_PATH = MAIN_PATH / 'resource' RESOURCE_PATH = MAIN_PATH / "resource"
GAMEDATA_PATH = RESOURCE_PATH / 'gamedata' GAMEDATA_PATH = RESOURCE_PATH / "gamedata"
CHAR_AVATAR_PATH = RESOURCE_PATH / 'char_avatar' CHAR_AVATAR_PATH = RESOURCE_PATH / "char_avatar"
CHARARTS_PATH = RESOURCE_PATH / 'chararts' CHARARTS_PATH = RESOURCE_PATH / "chararts"
MEDAL_DIY_FRAME_BKG_PATH = RESOURCE_PATH / 'medal_diy_frame_bkg' MEDAL_DIY_FRAME_BKG_PATH = RESOURCE_PATH / "medal_diy_frame_bkg"
MEDAL_ICONS_PATH = RESOURCE_PATH / 'medal_icons' MEDAL_ICONS_PATH = RESOURCE_PATH / "medal_icons"
PLAYER_AVATAR_LIST = RESOURCE_PATH / 'player_avatar_list' PLAYER_AVATAR_LIST = RESOURCE_PATH / "player_avatar_list"
SKILL_ICONS_PATH = RESOURCE_PATH / 'skill_icons' SKILL_ICONS_PATH = RESOURCE_PATH / "skill_icons"
SKINPACK_PATH = RESOURCE_PATH / 'skinpack' SKINPACK_PATH = RESOURCE_PATH / "skinpack"
SUB_PROFESSION_ICON_PATH = RESOURCE_PATH / 'sub_profession_icon' SUB_PROFESSION_ICON_PATH = RESOURCE_PATH / "sub_profession_icon"
TEAM_ICON_PATH = RESOURCE_PATH / 'team_icon' TEAM_ICON_PATH = RESOURCE_PATH / "team_icon"
def init_dir(): def init_dir():

View File

@ -7,5 +7,5 @@ async def download_all_resource():
ret = await asyncio.gather(download_all_file_from_cos()) ret = await asyncio.gather(download_all_file_from_cos())
ret = [str(x) for x in ret if x] ret = [str(x) for x in ret if x]
if ret: if ret:
return '\n'.join(ret) return "\n".join(ret)
return 'arknights全部资源下载完成!' return "arknights全部资源下载完成!"

View File

@ -16,17 +16,17 @@ from .RESOURCE_PATH import (
async def download_all_file_from_cos(): async def download_all_file_from_cos():
await download_all_file( await download_all_file(
'ArknightsUID', "ArknightsUID",
{ {
'resource/gamedata': GAMEDATA_PATH, "resource/gamedata": GAMEDATA_PATH,
'resource/char_avatar': CHAR_AVATAR_PATH, "resource/char_avatar": CHAR_AVATAR_PATH,
'resource/chararts': CHARARTS_PATH, "resource/chararts": CHARARTS_PATH,
'resource/medal_diy_frame_bkg': MEDAL_DIY_FRAME_BKG_PATH, "resource/medal_diy_frame_bkg": MEDAL_DIY_FRAME_BKG_PATH,
'resource/medal_icons': MEDAL_ICONS_PATH, "resource/medal_icons": MEDAL_ICONS_PATH,
'resource/player_avatar_list': PLAYER_AVATAR_LIST, "resource/player_avatar_list": PLAYER_AVATAR_LIST,
'resource/skill_icons': SKILL_ICONS_PATH, "resource/skill_icons": SKILL_ICONS_PATH,
'resource/skinpack': SKINPACK_PATH, "resource/skinpack": SKINPACK_PATH,
'resource/sub_profession_icon': SUB_PROFESSION_ICON_PATH, "resource/sub_profession_icon": SUB_PROFESSION_ICON_PATH,
'resource/team_icon': TEAM_ICON_PATH, "resource/team_icon": TEAM_ICON_PATH,
}, },
) )

View File

@ -1,3 +1,3 @@
ArknightsUID_version = '0.1.0' ArknightsUID_version = "0.1.0"
Arknights_Client_version = '2.2.01' Arknights_Client_version = "2.2.21"
Arknights_Res_version = '24-02-02-10-18-07-831ad8' Arknights_Res_version = "24-03-06-07-46-40-d13e0f"

View File

@ -56,10 +56,32 @@ pythonVersion = "3.8"
pythonPlatform = "All" pythonPlatform = "All"
[tool.ruff] [tool.ruff]
select = ["E", "W", "F", "UP", "C", "T", "PYI", "PT", "Q"] line-length = 88
ignore = ["C901", "Q000", "Q003"]
line-length = 108
target-version = "py38" target-version = "py38"
[tool.ruff.format] [tool.ruff.lint]
quote-style = "single" select = [
"F", # Pyflakes
"W", # pycodestyle warnings
"E", # pycodestyle errors
"UP", # pyupgrade
"ASYNC", # flake8-async
"C4", # flake8-comprehensions
"T10", # flake8-debugger
"T20", # flake8-print
"PYI", # flake8-pyi
"PT", # flake8-pytest-style
"Q", # flake8-quotes
"RUF", # Ruff-specific rules
]
ignore = [
"E402", # module-import-not-at-top-of-file
"UP037", # quoted-annotation
"RUF001", # ambiguous-unicode-character-string
"RUF002", # ambiguous-unicode-character-docstring
"RUF003", # ambiguous-unicode-character-comment
]
[tool.ruff.lint.flake8-pytest-style]
fixture-parentheses = false
mark-parentheses = false