mirror of
https://github.com/baiqwerdvd/ArknightsUID.git
synced 2025-05-04 19:17:33 +08:00
format and bug fix
This commit is contained in:
parent
401244c50e
commit
e8e54dd79d
@ -12,55 +12,55 @@ from ..utils.ark_prefix import PREFIX
|
||||
from .draw_ap_card import get_ap_img
|
||||
from .notice import get_notice_list
|
||||
|
||||
sv_get_ap = SV('ark查询体力')
|
||||
sv_get_ap_admin = SV('ark强制推送', pm=1)
|
||||
sv_get_ap = SV("ark查询体力")
|
||||
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):
|
||||
await bot.logger.info('开始执行[ark强制推送体力信息]')
|
||||
await bot.logger.info("开始执行[ark强制推送体力信息]")
|
||||
await ark_notice_job()
|
||||
|
||||
|
||||
@scheduler.scheduled_job('cron', minute='*/30')
|
||||
@scheduler.scheduled_job("cron", minute="*/30")
|
||||
async def ark_notice_job():
|
||||
result = await get_notice_list()
|
||||
logger.info('[ark推送检查]完成!等待消息推送中...')
|
||||
logger.info("[ark推送检查]完成!等待消息推送中...")
|
||||
logger.debug(result)
|
||||
|
||||
# 执行私聊推送
|
||||
for bot_id in result:
|
||||
for BOT_ID in gss.active_bot:
|
||||
bot = gss.active_bot[BOT_ID]
|
||||
for user_id in result[bot_id]['direct']:
|
||||
msg = result[bot_id]['direct'][user_id]
|
||||
await bot.target_send(msg, 'direct', user_id, bot_id, '', '')
|
||||
for user_id in result[bot_id]["direct"]:
|
||||
msg = result[bot_id]["direct"][user_id]
|
||||
await bot.target_send(msg, "direct", user_id, bot_id, "", "")
|
||||
await asyncio.sleep(0.5)
|
||||
logger.info('[ark推送检查] 私聊推送完成')
|
||||
for gid in result[bot_id]['group']:
|
||||
logger.info("[ark推送检查] 私聊推送完成")
|
||||
for gid in result[bot_id]["group"]:
|
||||
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 = result[bot_id]['group'][gid][user_id]
|
||||
msg = result[bot_id]["group"][gid][user_id]
|
||||
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)
|
||||
logger.info('[ark推送检查] 群聊推送完成')
|
||||
logger.info("[ark推送检查] 群聊推送完成")
|
||||
|
||||
|
||||
@sv_get_ap.on_fullmatch(
|
||||
(
|
||||
f'{PREFIX}每日',
|
||||
f'{PREFIX}mr',
|
||||
f'{PREFIX}实时便笺',
|
||||
f'{PREFIX}便笺',
|
||||
f'{PREFIX}便签',
|
||||
f"{PREFIX}每日",
|
||||
f"{PREFIX}mr",
|
||||
f"{PREFIX}实时便笺",
|
||||
f"{PREFIX}便笺",
|
||||
f"{PREFIX}便签",
|
||||
)
|
||||
)
|
||||
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
|
||||
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)
|
||||
await bot.send(im)
|
||||
|
@ -16,17 +16,17 @@ from ..utils.fonts.source_han_sans import (
|
||||
)
|
||||
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')
|
||||
up_bar = Image.open(TEXT_PATH / 'up_bar.png')
|
||||
brain_pic = Image.open(TEXT_PATH / 'brain.png')
|
||||
warn_pic = Image.open(TEXT_PATH / 'warn.png')
|
||||
mask_pic = Image.open(TEXT_PATH / 'mask.png').convert('RGBA')
|
||||
logo_white = Image.open(TEXT_PATH / 'logo_white.png')
|
||||
white_bg = Image.open(TEXT_PATH / "white_bg.png")
|
||||
up_bar = Image.open(TEXT_PATH / "up_bar.png")
|
||||
brain_pic = Image.open(TEXT_PATH / "brain.png")
|
||||
warn_pic = Image.open(TEXT_PATH / "warn.png")
|
||||
mask_pic = Image.open(TEXT_PATH / "mask.png").convert("RGBA")
|
||||
logo_white = Image.open(TEXT_PATH / "logo_white.png")
|
||||
|
||||
blue_bar_bg1 = Image.open(TEXT_PATH / 'blue_bar_bg1.png')
|
||||
grey_bar_bg1 = Image.open(TEXT_PATH / 'grey_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")
|
||||
|
||||
based_w = 850
|
||||
based_h = 1750
|
||||
@ -39,29 +39,31 @@ red_color = (235, 61, 75)
|
||||
async def get_ap_img(bot_id: str, user_id: str):
|
||||
try:
|
||||
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
|
||||
useable_uid_list = []
|
||||
if uid_list is None:
|
||||
return '请先绑定一个可用CRED & UID再来查询哦~'
|
||||
return "请先绑定一个可用CRED & UID再来查询哦~"
|
||||
for uid in uid_list:
|
||||
status = await ark_skd_api.check_cred_valid(uid=uid)
|
||||
if status is not bool:
|
||||
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:
|
||||
return '请先绑定一个可用CRED & UID再来查询哦~'
|
||||
return "请先绑定一个可用CRED & UID再来查询哦~"
|
||||
# 开始绘图任务
|
||||
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):
|
||||
task.append(_draw_all_ap_img(img, uid, uid_index))
|
||||
await asyncio.gather(*task)
|
||||
res = await convert_img(img)
|
||||
logger.info('[查询每日信息]绘图已完成,等待发送!')
|
||||
logger.info("[查询每日信息]绘图已完成,等待发送!")
|
||||
except TypeError:
|
||||
logger.exception('[查询每日信息]绘图失败!')
|
||||
res = '你绑定过的UID中可能存在过期CRED~请重新绑定一下噢~'
|
||||
logger.exception("[查询每日信息]绘图失败!")
|
||||
res = "你绑定过的UID中可能存在过期CRED~请重新绑定一下噢~"
|
||||
|
||||
return res
|
||||
|
||||
@ -77,28 +79,32 @@ def get_error(img: Image.Image, uid: str, daily_data: int):
|
||||
# 写UID
|
||||
img_draw.text(
|
||||
(350, 680),
|
||||
f'UID{uid}',
|
||||
f"UID{uid}",
|
||||
font=sans_font_26,
|
||||
fill=first_color,
|
||||
anchor='mm',
|
||||
anchor="mm",
|
||||
)
|
||||
img_draw.text(
|
||||
(350, 650),
|
||||
f'错误码 {daily_data}',
|
||||
f"错误码 {daily_data}",
|
||||
font=sans_font_26,
|
||||
fill=red_color,
|
||||
anchor='mm',
|
||||
anchor="mm",
|
||||
)
|
||||
return img
|
||||
|
||||
|
||||
async def draw_ap_img(uid: str) -> Image.Image:
|
||||
# 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_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)
|
||||
|
||||
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.text(
|
||||
(40, 130),
|
||||
f'Dr.{nickname}',
|
||||
f"Dr.{nickname}",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
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.text(
|
||||
(135, 255),
|
||||
f'{current_ap}/{max_ap}',
|
||||
f"{current_ap}/{max_ap}",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
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.text(
|
||||
(170, 60),
|
||||
'公开招募',
|
||||
"公开招募",
|
||||
font=sans_font_34,
|
||||
fill=first_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
|
||||
if recruit_task_finish_count == len(recruit):
|
||||
blue_bar_bg1_draw.text(
|
||||
(540, 70),
|
||||
'招募已全部完成',
|
||||
"招募已全部完成",
|
||||
font=sans_font_18,
|
||||
fill=first_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
else:
|
||||
blue_bar_bg1_draw.text(
|
||||
(540, 70),
|
||||
f'{delta_hour}小时{delta_minute}分钟后全部完成',
|
||||
f"{delta_hour}小时{delta_minute}分钟后全部完成",
|
||||
font=sans_font_18,
|
||||
fill=first_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
|
||||
blue_bar_bg1_draw.text(
|
||||
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,
|
||||
fill=white_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
|
||||
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
|
||||
grey_bar_bg1_draw.text(
|
||||
(170, 60),
|
||||
'公开刷新',
|
||||
"公开刷新",
|
||||
font=sans_font_34,
|
||||
fill=first_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
grey_bar_bg1_draw.text(
|
||||
(540, 70),
|
||||
f'{delta_hour}小时{delta_minute}分钟后获取刷新次数',
|
||||
f"{delta_hour}小时{delta_minute}分钟后获取刷新次数",
|
||||
font=sans_font_18,
|
||||
fill=first_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
grey_bar_bg1_draw.text(
|
||||
xy=(777, 58),
|
||||
text='联络中',
|
||||
text="联络中",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
img.paste(grey_bar_bg1_img, (-20, 910), grey_bar_bg1_img)
|
||||
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.text(
|
||||
(170, 60),
|
||||
'公开招募刷新',
|
||||
"公开招募刷新",
|
||||
font=sans_font_34,
|
||||
fill=first_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
blue_bar_bg1_draw.text(
|
||||
(540, 70),
|
||||
'可进行公开招募刷新',
|
||||
"可进行公开招募刷新",
|
||||
font=sans_font_18,
|
||||
fill=first_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
blue_bar_bg1_draw.text(
|
||||
xy=(777, 58),
|
||||
text='可刷新',
|
||||
text="可刷新",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
img.paste(blue_bar_bg1_img, (-20, 910), blue_bar_bg1_img)
|
||||
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.text(
|
||||
(170, 60),
|
||||
'暂无数据',
|
||||
"暂无数据",
|
||||
font=sans_font_34,
|
||||
fill=first_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
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.text(
|
||||
(170, 60),
|
||||
'训练室',
|
||||
"训练室",
|
||||
font=sans_font_34,
|
||||
fill=first_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
blue_bar_bg1_draw.text(
|
||||
(540, 70),
|
||||
f'{remain_time}后完成专精' if remain_secs != -1 else '设备空闲中',
|
||||
f"{remain_time}后完成专精" if remain_secs != -1 else "设备空闲中",
|
||||
font=sans_font_18,
|
||||
fill=first_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
blue_bar_bg1_draw.text(
|
||||
xy=(777, 58),
|
||||
text=f'{char_cn_name}',
|
||||
text=f"{char_cn_name}",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
img.paste(blue_bar_bg1_img, (-20, 1020), blue_bar_bg1_img)
|
||||
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.text(
|
||||
(170, 60),
|
||||
'训练室',
|
||||
"训练室",
|
||||
font=sans_font_34,
|
||||
fill=first_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
grey_bar_bg1_draw.text(
|
||||
(540, 70),
|
||||
'设备空闲中',
|
||||
"设备空闲中",
|
||||
font=sans_font_18,
|
||||
fill=first_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
grey_bar_bg1_draw.text(
|
||||
xy=(777, 58),
|
||||
text='无干员',
|
||||
text="无干员",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
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.text(
|
||||
(170, 60),
|
||||
'每周报酬合成玉',
|
||||
"每周报酬合成玉",
|
||||
font=sans_font_34,
|
||||
fill=first_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
|
||||
# 获取当前时间与下一周周一早上4点的时间差, 转换为几天几小时
|
||||
@ -356,18 +362,18 @@ async def draw_ap_img(uid: str) -> Image.Image:
|
||||
delta_hour = delta.seconds // 3600
|
||||
blue_bar_bg1_draw.text(
|
||||
(540, 70),
|
||||
f'{delta_day}天{delta_hour}小时后刷新',
|
||||
f"{delta_day}天{delta_hour}小时后刷新",
|
||||
font=sans_font_18,
|
||||
fill=first_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
|
||||
blue_bar_bg1_draw.text(
|
||||
xy=(777, 58),
|
||||
text=f'{campaign_reward.current}/{campaign_reward.total}',
|
||||
text=f"{campaign_reward.current}/{campaign_reward.total}",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
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.text(
|
||||
(170, 60),
|
||||
'每日任务',
|
||||
"每日任务",
|
||||
font=sans_font_34,
|
||||
fill=first_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
blue_bar_bg1_draw.text(
|
||||
(540, 70),
|
||||
f'{delta_hour}小时{delta_minute}分钟后刷新',
|
||||
f"{delta_hour}小时{delta_minute}分钟后刷新",
|
||||
font=sans_font_18,
|
||||
fill=first_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
blue_bar_bg1_draw.text(
|
||||
xy=(777, 58),
|
||||
text=f'{routine_daily.current}/{routine_daily.total}',
|
||||
text=f"{routine_daily.current}/{routine_daily.total}",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
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.text(
|
||||
(170, 60),
|
||||
'每周任务',
|
||||
"每周任务",
|
||||
font=sans_font_34,
|
||||
fill=first_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
blue_bar_bg1_draw.text(
|
||||
(540, 70),
|
||||
f'{delta_day}天{delta_hour}小时后刷新',
|
||||
f"{delta_day}天{delta_hour}小时后刷新",
|
||||
font=sans_font_18,
|
||||
fill=first_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
blue_bar_bg1_draw.text(
|
||||
xy=(777, 58),
|
||||
text=f'{routine_weekly.current}/{routine_weekly.total}',
|
||||
text=f"{routine_weekly.current}/{routine_weekly.total}",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
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.text(
|
||||
(170, 60),
|
||||
'数据增补仪',
|
||||
"数据增补仪",
|
||||
font=sans_font_34,
|
||||
fill=first_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
blue_bar_bg1_draw.text(
|
||||
(540, 70),
|
||||
f'{delta_day}天{delta_hour}小时后刷新',
|
||||
f"{delta_day}天{delta_hour}小时后刷新",
|
||||
font=sans_font_18,
|
||||
fill=first_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
blue_bar_bg1_draw.text(
|
||||
xy=(777, 58),
|
||||
text=f'{higher_item.current}/{higher_item.total}',
|
||||
text=f"{higher_item.current}/{higher_item.total}",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
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.text(
|
||||
(170, 60),
|
||||
'数据增补条',
|
||||
"数据增补条",
|
||||
font=sans_font_34,
|
||||
fill=first_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
blue_bar_bg1_draw.text(
|
||||
(540, 70),
|
||||
f'{delta_day}天{delta_hour}小时后刷新',
|
||||
f"{delta_day}天{delta_hour}小时后刷新",
|
||||
font=sans_font_18,
|
||||
fill=first_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
blue_bar_bg1_draw.text(
|
||||
xy=(777, 58),
|
||||
text=f'{lower_item.current}/{lower_item.total}',
|
||||
text=f"{lower_item.current}/{lower_item.total}",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='rm',
|
||||
anchor="rm",
|
||||
)
|
||||
img.paste(blue_bar_bg1_img, (-20, 1570), blue_bar_bg1_img)
|
||||
|
||||
img_draw = ImageDraw.Draw(img)
|
||||
img_draw.text(
|
||||
(425, 1710),
|
||||
'Powerd By ArknightsUID | GsCore',
|
||||
"Powerd By ArknightsUID | GsCore",
|
||||
font=sans_font_26,
|
||||
fill=first_color,
|
||||
anchor='mm',
|
||||
anchor="mm",
|
||||
)
|
||||
|
||||
return img
|
||||
|
@ -9,11 +9,11 @@ from ..utils.database.models import ArknightsPush, ArknightsUser
|
||||
from ..utils.models.skland.models import ArknightsPlayerInfoModel
|
||||
from .utils import now_ap
|
||||
|
||||
MR_NOTICE = '\n可发送[arkmr]或者[ark每日]来查看更多信息!\n'
|
||||
MR_NOTICE = "\n可发送[arkmr]或者[ark每日]来查看更多信息!\n"
|
||||
|
||||
NOTICE = {
|
||||
'ap': f'你的理智快满啦!{MR_NOTICE}',
|
||||
'training': f'你的专精即将可收取!{MR_NOTICE}',
|
||||
"ap": 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:
|
||||
raw_data = await ark_skd_api.get_game_player_info(user.uid)
|
||||
if isinstance(raw_data, int):
|
||||
logger.error(f'[ark推送提醒]获取{user.uid}的数据失败!')
|
||||
logger.error(f"[ark推送提醒]获取{user.uid}的数据失败!")
|
||||
continue
|
||||
push_data = await ArknightsPush.select_push_data(user.uid)
|
||||
msg_dict = await all_check(
|
||||
@ -49,48 +49,48 @@ async def all_check(
|
||||
) -> Dict[str, Dict[str, Dict]]:
|
||||
for mode in NOTICE.keys():
|
||||
# 检查条件
|
||||
if push_data[f'{mode}_is_push'] is True:
|
||||
if arkconfig.get_config('CrazyNotice').data:
|
||||
if not await check(mode, raw_data, push_data[f'{mode}_value']):
|
||||
if push_data[f"{mode}_is_push"] is True:
|
||||
if arkconfig.get_config("CrazyNotice").data:
|
||||
if not await check(mode, raw_data, push_data[f"{mode}_value"]):
|
||||
await ArknightsPush.update_push_data(
|
||||
uid,
|
||||
{f'{mode}_is_push': False},
|
||||
{f"{mode}_is_push": False},
|
||||
)
|
||||
continue
|
||||
# 准备推送
|
||||
if await check(mode, raw_data, push_data[f'{mode}_value']):
|
||||
if push_data[f'{mode}_push'] is False:
|
||||
if await check(mode, raw_data, push_data[f"{mode}_value"]):
|
||||
if push_data[f"{mode}_push"] is False:
|
||||
pass
|
||||
# on 推送到私聊
|
||||
else:
|
||||
# 初始化
|
||||
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']:
|
||||
msg_dict[bot_id]['direct'][user_id] = NOTICE[mode]
|
||||
if user_id not in msg_dict[bot_id]["direct"]:
|
||||
msg_dict[bot_id]["direct"][user_id] = NOTICE[mode]
|
||||
else:
|
||||
msg_dict[bot_id]['direct'][user_id] += NOTICE[mode]
|
||||
await ArknightsPush.update_push_data(uid, {f'{mode}_is_push': True})
|
||||
msg_dict[bot_id]["direct"][user_id] += NOTICE[mode]
|
||||
await ArknightsPush.update_push_data(uid, {f"{mode}_is_push": True})
|
||||
# 群号推送到群聊
|
||||
else:
|
||||
# 初始化
|
||||
gid = push_data[f'{mode}_push']
|
||||
if gid not in msg_dict[bot_id]['group']:
|
||||
msg_dict[bot_id]['group'][gid] = {}
|
||||
gid = push_data[f"{mode}_push"]
|
||||
if gid not in msg_dict[bot_id]["group"]:
|
||||
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]
|
||||
if user_id not in msg_dict[bot_id]["group"][gid]:
|
||||
msg_dict[bot_id]["group"][gid][user_id] = NOTICE[mode]
|
||||
else:
|
||||
msg_dict[bot_id]['group'][gid][user_id] += NOTICE[mode]
|
||||
await ArknightsPush.update_push_data(uid, {f'{mode}_is_push': True})
|
||||
msg_dict[bot_id]["group"][gid][user_id] += NOTICE[mode]
|
||||
await ArknightsPush.update_push_data(uid, {f"{mode}_is_push": True})
|
||||
return msg_dict
|
||||
|
||||
|
||||
async def check(mode: str, data: ArknightsPlayerInfoModel, limit: int) -> bool:
|
||||
if mode == 'ap':
|
||||
if mode == "ap":
|
||||
current_ap = now_ap(data.status.ap)
|
||||
if current_ap >= limit:
|
||||
return True
|
||||
@ -98,7 +98,7 @@ async def check(mode: str, data: ArknightsPlayerInfoModel, limit: int) -> bool:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
if mode == 'training':
|
||||
if mode == "training":
|
||||
if data.building.training:
|
||||
remain_secs = data.building.training.remainSecs
|
||||
if remain_secs <= limit * 60:
|
||||
|
@ -7,7 +7,7 @@ from ..utils.models.skland.models import PlayerStatusAp
|
||||
def seconds2hours_zhcn(seconds: int) -> str:
|
||||
m, s = divmod(int(seconds), 60)
|
||||
h, m = divmod(m, 60)
|
||||
return '%02d小时%02d分钟' % (h, m)
|
||||
return "%02d小时%02d分钟" % (h, m)
|
||||
|
||||
|
||||
def now_ap(ap: PlayerStatusAp) -> int:
|
||||
|
@ -9,7 +9,7 @@ from gsuid_core.utils.error_reply import UID_HINT
|
||||
from ..utils.database.models import ArknightsBind
|
||||
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配置", "方舟配置"))
|
||||
@ -19,46 +19,46 @@ sv_self_config = SV('ark配置')
|
||||
# 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):
|
||||
logger.info('开始执行[设置阈值信息]')
|
||||
logger.info("开始执行[设置阈值信息]")
|
||||
|
||||
uid = await ArknightsBind.get_uid_by_game(ev.user_id, bot.bot_id)
|
||||
if uid is None:
|
||||
return await bot.send(UID_HINT)
|
||||
|
||||
func = ''.join(re.findall('[\u4e00-\u9fa5]', ev.text.replace('阈值', '')))
|
||||
value = re.findall(r'\d+', ev.text)
|
||||
func = "".join(re.findall("[\u4e00-\u9fa5]", ev.text.replace("阈值", "")))
|
||||
value = re.findall(r"\d+", ev.text)
|
||||
value = value[0] if value else 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))
|
||||
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):
|
||||
user_id = ev.user_id
|
||||
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
|
||||
gid = ev.group_id if ev.group_id else 'on'
|
||||
gid = ev.group_id if ev.group_id else "on"
|
||||
else:
|
||||
query = False
|
||||
gid = 'off'
|
||||
gid = "off"
|
||||
|
||||
is_admin = ev.user_pm <= 2
|
||||
if ev.at and is_admin:
|
||||
user_id = 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)
|
||||
if uid is None:
|
||||
|
@ -3,4 +3,4 @@ from gsuid_core.utils.plugins_config.gs_config import StringConfig
|
||||
from ..utils.resource.RESOURCE_PATH import CONFIG_PATH
|
||||
from .config_default import CONIFG_DEFAULT
|
||||
|
||||
arkconfig = StringConfig('ArknightsUID', CONFIG_PATH, CONIFG_DEFAULT)
|
||||
arkconfig = StringConfig("ArknightsUID", CONFIG_PATH, CONIFG_DEFAULT)
|
||||
|
@ -7,25 +7,27 @@ from gsuid_core.utils.plugins_config.models import (
|
||||
)
|
||||
|
||||
CONIFG_DEFAULT: Dict[str, GSC] = {
|
||||
'SignTime': GsListStrConfig('每晚签到时间设置', '每晚森空岛签到时间设置(时,分)', ['0', '38']),
|
||||
'SignReportSimple': GsBoolConfig(
|
||||
'简洁签到报告',
|
||||
'开启后可以大大减少每日签到报告字数',
|
||||
"SignTime": GsListStrConfig(
|
||||
"每晚签到时间设置", "每晚森空岛签到时间设置(时,分)", ["0", "38"]
|
||||
),
|
||||
"SignReportSimple": GsBoolConfig(
|
||||
"简洁签到报告",
|
||||
"开启后可以大大减少每日签到报告字数",
|
||||
True,
|
||||
),
|
||||
'SchedSignin': GsBoolConfig(
|
||||
'定时签到',
|
||||
'开启后每晚00:30将开始自动签到任务',
|
||||
"SchedSignin": GsBoolConfig(
|
||||
"定时签到",
|
||||
"开启后每晚00:30将开始自动签到任务",
|
||||
True,
|
||||
),
|
||||
'ArknightsPrefix': GsStrConfig(
|
||||
'插件命令前缀(确认无冲突再修改)',
|
||||
'用于本插件的前缀设定',
|
||||
'ark',
|
||||
"ArknightsPrefix": GsStrConfig(
|
||||
"插件命令前缀(确认无冲突再修改)",
|
||||
"用于本插件的前缀设定",
|
||||
"ark",
|
||||
),
|
||||
'CrazyNotice': GsBoolConfig(
|
||||
'催命模式',
|
||||
'开启后当达到推送阈值将会一直推送',
|
||||
"CrazyNotice": GsBoolConfig(
|
||||
"催命模式",
|
||||
"开启后当达到推送阈值将会一直推送",
|
||||
False,
|
||||
),
|
||||
}
|
||||
|
@ -7,13 +7,13 @@ from .ark_config import arkconfig
|
||||
from .config_default import CONIFG_DEFAULT
|
||||
|
||||
PUSH_MAP = {
|
||||
'理智': 'ap',
|
||||
'训练室': 'train',
|
||||
'版本更新': 'version',
|
||||
"理智": "ap",
|
||||
"训练室": "train",
|
||||
"版本更新": "version",
|
||||
}
|
||||
PRIV_MAP = {
|
||||
'自动签到': 'sign',
|
||||
'推送': 'push',
|
||||
"自动签到": "sign",
|
||||
"推送": "push",
|
||||
}
|
||||
|
||||
|
||||
@ -21,20 +21,20 @@ async def set_push_value(bot_id: str, func: str, uid: str, value: int):
|
||||
if func in PUSH_MAP:
|
||||
status = PUSH_MAP[func]
|
||||
else:
|
||||
return '该配置项不存在!'
|
||||
logger.info(f'[设置推送阈值]func: {status}, value: {value}')
|
||||
if await ArknightsPush.update_push_data(uid, {f'{status}_value': value}):
|
||||
return f'设置成功!\n当前{func}推送阈值:{value}'
|
||||
return "该配置项不存在!"
|
||||
logger.info(f"[设置推送阈值]func: {status}, value: {value}")
|
||||
if await ArknightsPush.update_push_data(uid, {f"{status}_value": value}):
|
||||
return f"设置成功!\n当前{func}推送阈值:{value}"
|
||||
else:
|
||||
return '设置失败!\n请检查参数是否正确!'
|
||||
return "设置失败!\n请检查参数是否正确!"
|
||||
|
||||
|
||||
async def set_config_func(
|
||||
bot_id: str,
|
||||
config_name: str = '',
|
||||
uid: str = '0',
|
||||
user_id: str = '',
|
||||
option: str = '0',
|
||||
config_name: str = "",
|
||||
uid: str = "0",
|
||||
user_id: str = "",
|
||||
option: str = "0",
|
||||
query: Optional[bool] = None,
|
||||
is_admin: bool = False,
|
||||
):
|
||||
@ -46,17 +46,17 @@ async def set_config_func(
|
||||
break
|
||||
else:
|
||||
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:
|
||||
# 执行设置
|
||||
await ArknightsUser.update_user_data(
|
||||
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(
|
||||
uid,
|
||||
{
|
||||
@ -64,24 +64,24 @@ async def set_config_func(
|
||||
},
|
||||
)
|
||||
else:
|
||||
return '该配置项不存在!'
|
||||
return "该配置项不存在!"
|
||||
|
||||
if option == 'on':
|
||||
succeed_msg = '开启至私聊消息!'
|
||||
elif option == 'off':
|
||||
succeed_msg = '关闭!'
|
||||
if option == "on":
|
||||
succeed_msg = "开启至私聊消息!"
|
||||
elif option == "off":
|
||||
succeed_msg = "关闭!"
|
||||
else:
|
||||
succeed_msg = f'开启至群{option}'
|
||||
return f'{config_name}已{succeed_msg}'
|
||||
succeed_msg = f"开启至群{option}"
|
||||
return f"{config_name}已{succeed_msg}"
|
||||
|
||||
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:
|
||||
arkconfig.set_config(name, query)
|
||||
im = '成功设置{}为{}。'.format(config_name, '开' if query else '关')
|
||||
im = "成功设置{}为{}。".format(config_name, "开" if query else "关")
|
||||
else:
|
||||
im = '未传入参数query!'
|
||||
im = "未传入参数query!"
|
||||
else:
|
||||
im = '只有管理员才能设置群服务。'
|
||||
im = "只有管理员才能设置群服务。"
|
||||
return im
|
||||
|
@ -6,11 +6,11 @@ from gsuid_core.sv import SV
|
||||
from ..utils.ark_prefix import PREFIX
|
||||
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):
|
||||
logger.info('开始执行[ark帮助]')
|
||||
logger.info("开始执行[ark帮助]")
|
||||
im = await get_core_help()
|
||||
await bot.send(im)
|
||||
|
@ -8,15 +8,19 @@ from msgspec import json as msgjson
|
||||
from PIL import Image
|
||||
|
||||
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'
|
||||
HELP_DATA = Path(__file__).parent / 'Help.json'
|
||||
TEXT_PATH = Path(__file__).parent / "texture2d"
|
||||
HELP_DATA = Path(__file__).parent / "Help.json"
|
||||
|
||||
|
||||
async def get_help_data() -> Union[Dict[str, PluginHelp], None]:
|
||||
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(
|
||||
await file.read(),
|
||||
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]:
|
||||
help_data = await get_help_data()
|
||||
if help_data is None:
|
||||
return '暂未找到帮助数据...'
|
||||
return "暂未找到帮助数据..."
|
||||
|
||||
img = await get_help(
|
||||
'ArknightsUID',
|
||||
f'版本号:{ArknightsUID_version}',
|
||||
"ArknightsUID",
|
||||
f"版本号:{ArknightsUID_version}",
|
||||
help_data,
|
||||
Image.open(TEXT_PATH / 'bg.jpg'),
|
||||
Image.open(TEXT_PATH / 'icon.png'),
|
||||
Image.open(TEXT_PATH / 'badge.png'),
|
||||
Image.open(TEXT_PATH / 'banner.png'),
|
||||
Image.open(TEXT_PATH / 'button.png'),
|
||||
Image.open(TEXT_PATH / "bg.jpg"),
|
||||
Image.open(TEXT_PATH / "icon.png"),
|
||||
Image.open(TEXT_PATH / "badge.png"),
|
||||
Image.open(TEXT_PATH / "banner.png"),
|
||||
Image.open(TEXT_PATH / "button.png"),
|
||||
source_han_sans_cn_origin,
|
||||
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
|
||||
|
@ -23,7 +23,7 @@
|
||||
# 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):
|
||||
# await bot.logger.info('开始执行[ark推送版本更新]')
|
||||
# await ark_version_job()
|
||||
|
@ -6,17 +6,17 @@ from gsuid_core.plugins.ArknightsUID.ArknightsUID.utils.resource.download_all_re
|
||||
)
|
||||
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):
|
||||
await bot.send('正在开始下载~可能需要较久的时间!')
|
||||
await bot.send("正在开始下载~可能需要较久的时间!")
|
||||
im = await download_all_resource()
|
||||
await bot.send(im)
|
||||
|
||||
|
||||
async def startup():
|
||||
logger.info('[资源文件下载] 正在检查与下载缺失的资源文件, 可能需要较长时间, 请稍等')
|
||||
logger.info("[资源文件下载] 正在检查与下载缺失的资源文件, 可能需要较长时间, 请稍等")
|
||||
await download_all_resource()
|
||||
logger.info('[资源文件下载] 完毕')
|
||||
logger.info("[资源文件下载] 完毕")
|
||||
|
@ -1,9 +1,10 @@
|
||||
import asyncio
|
||||
from pathlib import Path
|
||||
import json
|
||||
import threading
|
||||
|
||||
from ..utils.resource.download_all_resource import download_all_resource
|
||||
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.BuildingData import BuildingData
|
||||
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.CrisisTable import CrisisTable
|
||||
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.FavorTable import FavorTable
|
||||
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.
|
||||
"""
|
||||
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)
|
||||
except (FileNotFoundError, json.JSONDecodeError) as e:
|
||||
logger.error(f'Error reading JSON file: {e}')
|
||||
logger.error(f"Error reading JSON file: {e}")
|
||||
return {}
|
||||
|
||||
|
||||
threading.Thread(
|
||||
target=lambda: asyncio.run(download_all_resource()), daemon=True
|
||||
).start()
|
||||
# ACTIVITY_TABLE = ActivityTable.convert(read_json(GAMEDATA_PATH / 'activity_table.json'))
|
||||
# AUDIO_DATA = AudioData.convert(read_json(GAMEDATA_PATH / 'audio_data.json'))
|
||||
|
||||
BATTLE_EQUIP_TABLE = BattleEquipTable.convert(
|
||||
{'equips': read_json(GAMEDATA_PATH / 'battle_equip_table.json')}
|
||||
{"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'))
|
||||
CHAPTER_TABLE = ChapterTable.convert({'chapters': read_json(GAMEDATA_PATH / 'chapter_table.json')})
|
||||
CHARACTER_TABLE = CharacterTable.convert({'chars': read_json(GAMEDATA_PATH / 'character_table.json')})
|
||||
CHAR_META_TABLE = CharMetaTable.convert(read_json(GAMEDATA_PATH / 'char_meta_table.json'))
|
||||
CHARM_TABLE = CharmTable.convert(read_json(GAMEDATA_PATH / 'charm_table.json'))
|
||||
CHAR_PATH_TABLE = CharPatchTable.convert(read_json(GAMEDATA_PATH / 'char_patch_table.json'))
|
||||
CHARWORD_TABLE = CharwordTable.convert(read_json(GAMEDATA_PATH / 'charword_table.json'))
|
||||
CHECKIN_TABLE = CheckinTable.convert(read_json(GAMEDATA_PATH / 'checkin_table.json'))
|
||||
CLIMB_TOWER_TABLE = ClimbTowerTable.convert(read_json(GAMEDATA_PATH / 'climb_tower_table.json'))
|
||||
CLUE_DATA = ClueData.convert(read_json(GAMEDATA_PATH / 'clue_data.json'))
|
||||
CRISIS_TABLE = CrisisTable.convert(read_json(GAMEDATA_PATH / 'crisis_table.json'))
|
||||
CRISIS_V2_TABLE = CrisisV2Table.convert(read_json(GAMEDATA_PATH / 'crisis_v2_table.json'))
|
||||
CAMPAIGN_TABLE = CampaignTable.convert(read_json(GAMEDATA_PATH / "campaign_table.json"))
|
||||
CHAPTER_TABLE = ChapterTable.convert(
|
||||
{"chapters": read_json(GAMEDATA_PATH / "chapter_table.json")}
|
||||
)
|
||||
CHARACTER_TABLE = CharacterTable.convert(
|
||||
{"chars": read_json(GAMEDATA_PATH / "character_table.json")}
|
||||
)
|
||||
CHAR_META_TABLE = CharMetaTable.convert(
|
||||
read_json(GAMEDATA_PATH / "char_meta_table.json")
|
||||
)
|
||||
CHARM_TABLE = CharmTable.convert(read_json(GAMEDATA_PATH / "charm_table.json"))
|
||||
CHAR_PATH_TABLE = CharPatchTable.convert(
|
||||
read_json(GAMEDATA_PATH / "char_patch_table.json")
|
||||
)
|
||||
CHARWORD_TABLE = CharwordTable.convert(read_json(GAMEDATA_PATH / "charword_table.json"))
|
||||
CHECKIN_TABLE = CheckinTable.convert(read_json(GAMEDATA_PATH / "checkin_table.json"))
|
||||
CLIMB_TOWER_TABLE = ClimbTowerTable.convert(
|
||||
read_json(GAMEDATA_PATH / "climb_tower_table.json")
|
||||
)
|
||||
CLUE_DATA = ClueData.convert(read_json(GAMEDATA_PATH / "clue_data.json"))
|
||||
CRISIS_TABLE = CrisisTable.convert(read_json(GAMEDATA_PATH / "crisis_table.json"))
|
||||
CRISIS_V2_TABLE = CrisisV2Table.convert(
|
||||
read_json(GAMEDATA_PATH / "crisis_v2_table.json")
|
||||
)
|
||||
|
||||
# DISPLAY_META_TABLE = DisplayMetaTable.convert(read_json(GAMEDATA_PATH / 'display_meta_table.json'))
|
||||
|
||||
ENEMY_HANDBOOK_TABLE = EnemyHandbookTable.convert(read_json(GAMEDATA_PATH / 'enemy_handbook_table.json'))
|
||||
|
||||
FAVOR_TABLE = FavorTable.convert(read_json(GAMEDATA_PATH / 'favor_table.json'))
|
||||
|
||||
GACHA_TABLE = GachaTable.convert(read_json(GAMEDATA_PATH / 'gacha_table.json'))
|
||||
GAMEDATA_CONST = GamedataConst.convert(read_json(GAMEDATA_PATH / 'gamedata_const.json'))
|
||||
|
||||
HANDBOOK_INFO_TABLE = HandbookInfoTable.convert(read_json(GAMEDATA_PATH / 'handbook_info_table.json'))
|
||||
HANDBOOK_TABLE = HandbookTable.convert(read_json(GAMEDATA_PATH / 'handbook_table.json'))
|
||||
HANDBOOK_TEAM_TABLE = HandbookTeamTable.convert(
|
||||
{'team': read_json(GAMEDATA_PATH / 'handbook_team_table.json')}
|
||||
ENEMY_HANDBOOK_TABLE = EnemyHandbookTable.convert(
|
||||
read_json(GAMEDATA_PATH / "enemy_handbook_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'))
|
||||
MISSION_TABLE = MissionTable.convert(read_json(GAMEDATA_PATH / 'mission_table.json'))
|
||||
GACHA_TABLE = GachaTable.convert(read_json(GAMEDATA_PATH / "gacha_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')})
|
||||
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'))
|
||||
MEDAL_TABLE = MedalTable.convert(read_json(GAMEDATA_PATH / "medal_table.json"))
|
||||
MISSION_TABLE = MissionTable.convert(read_json(GAMEDATA_PATH / "mission_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'))
|
||||
OPEN_SERVER_TABLE = OpenServerTable.convert(
|
||||
read_json(GAMEDATA_PATH / "open_server_table.json")
|
||||
)
|
||||
|
||||
PLAYER_AVATAR_TABLE = PlayerAvatarTable.convert(
|
||||
read_json(GAMEDATA_PATH / "player_avatar_table.json")
|
||||
)
|
||||
|
||||
RANGE_TABLE = RangeTable.convert(
|
||||
{"range_": read_json(GAMEDATA_PATH / "range_table.json")}
|
||||
)
|
||||
REPLICATE_TABLE = ReplicateTable.convert(
|
||||
{"replicate": read_json(GAMEDATA_PATH / "replicate_table.json")}
|
||||
)
|
||||
RETRO_TABLE = RetroTable.convert(read_json(GAMEDATA_PATH / "retro_table.json"))
|
||||
ROGUELIKE_TABLE = RoguelikeTable.convert(
|
||||
read_json(GAMEDATA_PATH / "roguelike_table.json")
|
||||
)
|
||||
ROGUELIKE_TOPIC_TABLE = RoguelikeTopicTable.convert(
|
||||
read_json(GAMEDATA_PATH / "roguelike_topic_table.json")
|
||||
)
|
||||
|
||||
SANDBOX_TABLE = SandboxTable.convert(read_json(GAMEDATA_PATH / "sandbox_table.json"))
|
||||
SANDBOX_PERM_TABLE = SandboxPermTable.convert(
|
||||
read_json(GAMEDATA_PATH / "sandbox_perm_table.json")
|
||||
)
|
||||
SHOP_CLIENT_TABLE = ShopClientTable.convert(
|
||||
read_json(GAMEDATA_PATH / "shop_client_table.json")
|
||||
)
|
||||
SKILL_TABLE = SkillTable.convert(
|
||||
{"skills": read_json(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(
|
||||
read_json(GAMEDATA_PATH / 'story_review_meta_table.json')
|
||||
read_json(GAMEDATA_PATH / "story_review_meta_table.json")
|
||||
)
|
||||
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'))
|
||||
TIP_TABLE = TipTable.convert(read_json(GAMEDATA_PATH / 'tip_table.json'))
|
||||
TOKEN_TABLE = TokenTable.convert({'tokens': read_json(GAMEDATA_PATH / 'token_table.json')})
|
||||
TECH_BUFF_TABLE = TechBuffTable.convert(
|
||||
read_json(GAMEDATA_PATH / "tech_buff_table.json")
|
||||
)
|
||||
TIP_TABLE = TipTable.convert(read_json(GAMEDATA_PATH / "tip_table.json"))
|
||||
TOKEN_TABLE = TokenTable.convert(
|
||||
{"tokens": read_json(GAMEDATA_PATH / "token_table.json")}
|
||||
)
|
||||
|
||||
UNIEQUIP_DATA = UniequipData.convert(read_json(GAMEDATA_PATH / 'uniequip_data.json'))
|
||||
UNIEQUIP_TABLE = UniEquipTable.convert(read_json(GAMEDATA_PATH / 'uniequip_table.json'))
|
||||
ZONE_TABLE = ZoneTable.convert(read_json(GAMEDATA_PATH / 'zone_table.json'))
|
||||
UNIEQUIP_DATA = UniequipData.convert(read_json(GAMEDATA_PATH / "uniequip_data.json"))
|
||||
UNIEQUIP_TABLE = UniEquipTable.convert(read_json(GAMEDATA_PATH / "uniequip_table.json"))
|
||||
ZONE_TABLE = ZoneTable.convert(read_json(GAMEDATA_PATH / "zone_table.json"))
|
||||
|
@ -7,14 +7,14 @@ from ..utils.ark_prefix import PREFIX
|
||||
from ..utils.database.models import ArknightsBind
|
||||
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):
|
||||
uid = await get_uid(bot, ev, bind_model=ArknightsBind)
|
||||
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))
|
||||
|
@ -10,9 +10,9 @@ from ..utils.ark_api import ark_skd_api
|
||||
from ..utils.fonts.source_han_serif import sans_font_28
|
||||
from ..utils.resource.RESOURCE_PATH import SKINPACK_PATH
|
||||
|
||||
TEXT_PATH = Path(__file__).parent / 'texture2D'
|
||||
bg_img = Image.open(TEXT_PATH / 'bg.png')
|
||||
base_info_img = Image.open(TEXT_PATH / 'base_info.png')
|
||||
TEXT_PATH = Path(__file__).parent / "texture2D"
|
||||
bg_img = Image.open(TEXT_PATH / "bg.png")
|
||||
base_info_img = Image.open(TEXT_PATH / "base_info.png")
|
||||
|
||||
|
||||
async def get_role_img(uid: str):
|
||||
@ -20,9 +20,9 @@ async def get_role_img(uid: str):
|
||||
if isinstance(player_info, int):
|
||||
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))
|
||||
|
||||
# 放 background
|
||||
@ -31,10 +31,12 @@ async def get_role_img(uid: str):
|
||||
# 放干员主立绘
|
||||
secretary = player_info.status.secretary
|
||||
# secretary_charId = secretary.charId
|
||||
secretary_skinId = secretary.skinId.replace('@', '_')
|
||||
secretary_skinId = secretary.skinId.replace("@", "_")
|
||||
|
||||
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)
|
||||
|
||||
@ -46,12 +48,12 @@ async def get_role_img(uid: str):
|
||||
player_info.status.name,
|
||||
(255, 255, 255),
|
||||
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.show()
|
||||
|
@ -14,46 +14,46 @@ from ..utils.ark_prefix import PREFIX
|
||||
from ..utils.database.models import ArknightsBind
|
||||
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_config = SV('森空岛管理', pm=2)
|
||||
sv_sign = SV("森空岛签到")
|
||||
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():
|
||||
if arkconfig.get_config('SchedSignin').data:
|
||||
if arkconfig.get_config("SchedSignin").data:
|
||||
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):
|
||||
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)
|
||||
if ark_uid is None:
|
||||
return '你还没有绑定UID噢,请使用[ark绑定uid123]完成绑定!'
|
||||
await bot.logger.info(f'[ARK签到]UID: {ark_uid}')
|
||||
return "你还没有绑定UID噢,请使用[ark绑定uid123]完成绑定!"
|
||||
await bot.logger.info(f"[ARK签到]UID: {ark_uid}")
|
||||
await bot.send(await sign_in(ark_uid))
|
||||
return None
|
||||
|
||||
|
||||
@sv_sign_config.on_fullmatch(f'{PREFIX}全部重签')
|
||||
@sv_sign_config.on_fullmatch(f"{PREFIX}全部重签")
|
||||
async def recheck(bot: Bot, ev: Event):
|
||||
await bot.logger.info('开始执行[ARK全部重签]')
|
||||
await bot.send('已开始执行')
|
||||
await bot.logger.info("开始执行[ARK全部重签]")
|
||||
await bot.send("已开始执行")
|
||||
await send_daily_sign()
|
||||
await bot.send('执行完成')
|
||||
await bot.send("执行完成")
|
||||
|
||||
|
||||
async def send_daily_sign():
|
||||
logger.info('开始执行[ARK每日全部签到]')
|
||||
logger.info("开始执行[ARK每日全部签到]")
|
||||
# 执行签到 并获得推送消息
|
||||
result = await daily_sign()
|
||||
private_msg_list = result['private_msg_list']
|
||||
group_msg_list = result['group_msg_list']
|
||||
logger.info('[ARK每日全部签到]完成')
|
||||
private_msg_list = result["private_msg_list"]
|
||||
group_msg_list = result["group_msg_list"]
|
||||
logger.info("[ARK每日全部签到]完成")
|
||||
|
||||
# 执行私聊推送
|
||||
for qid in private_msg_list:
|
||||
@ -61,41 +61,41 @@ async def send_daily_sign():
|
||||
for bot_id in gss.active_bot:
|
||||
for single in private_msg_list[qid]:
|
||||
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:
|
||||
logger.warning(f'[ARK每日全部签到] QQ {qid} 私聊推送失败!错误信息:{e}')
|
||||
logger.warning(f"[ARK每日全部签到] QQ {qid} 私聊推送失败!错误信息:{e}")
|
||||
await asyncio.sleep(0.5)
|
||||
logger.info('[ARK每日全部签到]私聊推送完成')
|
||||
logger.info("[ARK每日全部签到]私聊推送完成")
|
||||
|
||||
# 执行群聊推送
|
||||
for gid in group_msg_list:
|
||||
# 根据succee数判断是否为简洁推送
|
||||
if group_msg_list[gid]['success'] >= 0:
|
||||
if group_msg_list[gid]["success"] >= 0:
|
||||
report = (
|
||||
'以下为签到失败报告:{}'.format(group_msg_list[gid]['push_message'])
|
||||
if group_msg_list[gid]['push_message'] != ''
|
||||
else ''
|
||||
"以下为签到失败报告:{}".format(group_msg_list[gid]["push_message"])
|
||||
if group_msg_list[gid]["push_message"] != ""
|
||||
else ""
|
||||
)
|
||||
msg_title = '森空岛今日自动签到已完成!\n本群共签到成功{}人,共签到失败{}人。{}'.format(
|
||||
group_msg_list[gid]['success'],
|
||||
group_msg_list[gid]['failed'],
|
||||
msg_title = "森空岛今日自动签到已完成!\n本群共签到成功{}人,共签到失败{}人。{}".format(
|
||||
group_msg_list[gid]["success"],
|
||||
group_msg_list[gid]["failed"],
|
||||
report,
|
||||
)
|
||||
else:
|
||||
msg_title = group_msg_list[gid]['push_message']
|
||||
msg_title = group_msg_list[gid]["push_message"]
|
||||
# 发送群消息
|
||||
try:
|
||||
for bot_id in gss.active_bot:
|
||||
await gss.active_bot[bot_id].target_send(
|
||||
msg_title,
|
||||
'group',
|
||||
"group",
|
||||
gid,
|
||||
group_msg_list[gid]['bot_id'],
|
||||
'',
|
||||
'',
|
||||
group_msg_list[gid]["bot_id"],
|
||||
"",
|
||||
"",
|
||||
)
|
||||
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))
|
||||
logger.info('[ARK每日全部签到]群聊推送完成')
|
||||
logger.info("[ARK每日全部签到]群聊推送完成")
|
||||
|
@ -2,7 +2,7 @@ import asyncio
|
||||
import random
|
||||
from copy import deepcopy
|
||||
from datetime import datetime
|
||||
from typing import List
|
||||
from typing import Sequence
|
||||
|
||||
from gsuid_core.gss import gss
|
||||
from gsuid_core.logger import logger
|
||||
@ -18,106 +18,108 @@ already = 0
|
||||
|
||||
# 签到函数
|
||||
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)
|
||||
# 初步校验数据
|
||||
if isinstance(sign_info, int):
|
||||
logger.warning(f'[ARK签到] {ark_uid} 出错, 请检查森空岛Cred是否过期!')
|
||||
return '签到失败...请检查森空岛Cred是否过期!'
|
||||
logger.warning(f"[ARK签到] {ark_uid} 出错, 请检查森空岛Cred是否过期!")
|
||||
return "签到失败...请检查森空岛Cred是否过期!"
|
||||
# 检测是否已签到
|
||||
for calendar in sign_info.calendar:
|
||||
if calendar.available:
|
||||
break
|
||||
else:
|
||||
logger.info(f'[ARK签到] {ark_uid} 该用户今日已签到,跳过...')
|
||||
global already # noqa: PLW0603
|
||||
logger.info(f"[ARK签到] {ark_uid} 该用户今日已签到,跳过...")
|
||||
global already
|
||||
already += 1
|
||||
# 获取今天和月初的日期,计算漏签次数
|
||||
day_of_month = datetime.now().day
|
||||
special_count = 0
|
||||
count = 0
|
||||
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
|
||||
if done is True:
|
||||
count += 1
|
||||
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)
|
||||
# 检测数据
|
||||
if isinstance(sign_data, int):
|
||||
logger.warning(f'[ARK签到] {ark_uid} 出错, 请检查森空岛Cred是否过期!')
|
||||
return 'ark签到失败...请检查森空岛Cred是否过期!'
|
||||
logger.warning(f"[ARK签到] {ark_uid} 出错, 请检查森空岛Cred是否过期!")
|
||||
return "ark签到失败...请检查森空岛Cred是否过期!"
|
||||
# 获取签到奖励物品,拿旧的总签到天数 + 1 为新的签到天数,再 -1 即为今日奖励物品的下标
|
||||
getitem = sign_data.awards
|
||||
get_im = ''
|
||||
get_im = ""
|
||||
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)
|
||||
# 校验数据
|
||||
if isinstance(new_sign_info, int):
|
||||
logger.warning(f'[ARK签到] {ark_uid} 出错, 请检查森空岛Cred是否过期!')
|
||||
return '签到失败...请检查森空岛Cred是否过期!'
|
||||
logger.warning(f"[ARK签到] {ark_uid} 出错, 请检查森空岛Cred是否过期!")
|
||||
return "签到失败...请检查森空岛Cred是否过期!"
|
||||
# 获取今天和月初的日期,计算漏签次数
|
||||
day_of_month = datetime.now().day
|
||||
special_count = 0
|
||||
count = 0
|
||||
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
|
||||
if done is True:
|
||||
count += 1
|
||||
sign_missed = day_of_month - count + special_count
|
||||
im = f'ark签到成功!\n{get_im}\n本月漏签次数:{sign_missed}'
|
||||
logger.info(f'[ARK签到] {ark_uid} 签到完成, 结果: ark签到成功, 漏签次数: {sign_missed}')
|
||||
im = f"ark签到成功!\n{get_im}\n本月漏签次数:{sign_missed}"
|
||||
logger.info(
|
||||
f"[ARK签到] {ark_uid} 签到完成, 结果: ark签到成功, 漏签次数: {sign_missed}"
|
||||
)
|
||||
return im
|
||||
|
||||
|
||||
async def single_daily_sign(bot_id: str, ark_uid: str, gid: str, qid: str):
|
||||
im = await sign_in(ark_uid)
|
||||
if gid == 'on':
|
||||
if gid == "on":
|
||||
if qid not in private_msg_list:
|
||||
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:
|
||||
# 向群消息推送列表添加这个群
|
||||
if gid not in group_msg_list:
|
||||
group_msg_list[gid] = {
|
||||
'bot_id': bot_id,
|
||||
'success': 0,
|
||||
'failed': 0,
|
||||
'push_message': '',
|
||||
"bot_id": bot_id,
|
||||
"success": 0,
|
||||
"failed": 0,
|
||||
"push_message": "",
|
||||
}
|
||||
# 检查是否开启简洁签到
|
||||
if arkconfig.get_config('SignReportSimple').data:
|
||||
if arkconfig.get_config("SignReportSimple").data:
|
||||
# 如果失败, 则添加到推送列表
|
||||
if im.startswith(('ark签到失败', '网络有点忙', 'OK', 'ok')):
|
||||
message = f'[CQ:at,qq={qid}] {im}'
|
||||
group_msg_list[gid]['failed'] += 1
|
||||
group_msg_list[gid]['push_message'] += '\n' + message
|
||||
if im.startswith(("ark签到失败", "网络有点忙", "OK", "ok")):
|
||||
message = f"[CQ:at,qq={qid}] {im}"
|
||||
group_msg_list[gid]["failed"] += 1
|
||||
group_msg_list[gid]["push_message"] += "\n" + message
|
||||
else:
|
||||
group_msg_list[gid]['success'] += 1
|
||||
group_msg_list[gid]["success"] += 1
|
||||
# 没有开启简洁签到, 则每条消息都要携带@信息
|
||||
else:
|
||||
# 不用MessageSegment.at(row[2]),因为不方便移植
|
||||
message = f'[CQ:at,qq={qid}] {im}'
|
||||
group_msg_list[gid]['push_message'] += '\n' + message
|
||||
group_msg_list[gid]['success'] -= 1
|
||||
message = f"[CQ:at,qq={qid}] {im}"
|
||||
group_msg_list[gid]["push_message"] += "\n" + message
|
||||
group_msg_list[gid]["success"] -= 1
|
||||
|
||||
|
||||
async def daily_sign():
|
||||
global already # noqa: PLW0603
|
||||
global already
|
||||
tasks = []
|
||||
for _ in gss.active_bot:
|
||||
user_list: List[ArknightsUser] = await ArknightsUser.get_all_user()
|
||||
logger.info(f'[ARK签到] 共有{len(user_list)}个用户需要签到')
|
||||
logger.info(f'[ARK签到] {user_list}')
|
||||
user_list: Sequence[ArknightsUser] = await ArknightsUser.get_all_user()
|
||||
logger.info(f"[ARK签到] 共有{len(user_list)}个用户需要签到")
|
||||
logger.info(f"[ARK签到] {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(
|
||||
single_daily_sign(
|
||||
user.bot_id,
|
||||
@ -132,15 +134,17 @@ async def daily_sign():
|
||||
delay = 1
|
||||
else:
|
||||
delay = 50 + random.randint(3, 45)
|
||||
logger.info(f'[ARK签到] 已签到{len(tasks)}个用户, 等待{delay}秒进行下一次签到')
|
||||
logger.info(
|
||||
f"[ARK签到] 已签到{len(tasks)}个用户, 等待{delay}秒进行下一次签到"
|
||||
)
|
||||
tasks.clear()
|
||||
already = 0
|
||||
await asyncio.sleep(delay)
|
||||
await asyncio.gather(*tasks)
|
||||
tasks.clear()
|
||||
result = {
|
||||
'private_msg_list': deepcopy(private_msg_list),
|
||||
'group_msg_list': deepcopy(group_msg_list),
|
||||
"private_msg_list": deepcopy(private_msg_list),
|
||||
"group_msg_list": deepcopy(group_msg_list),
|
||||
}
|
||||
private_msg_list.clear()
|
||||
group_msg_list.clear()
|
||||
|
@ -3,13 +3,13 @@ import threading
|
||||
|
||||
from gsuid_core.logger import logger
|
||||
|
||||
from ..arknightsuid_resource import startup
|
||||
# from ..arknightsuid_resource import startup
|
||||
from ..utils.database.startup import ark_adapter
|
||||
|
||||
|
||||
async def all_start():
|
||||
try:
|
||||
await startup()
|
||||
# await startup()
|
||||
await ark_adapter()
|
||||
except Exception as e:
|
||||
logger.exception(e)
|
||||
|
@ -10,10 +10,10 @@ from .deal_skd_cred import deal_skd_cred
|
||||
|
||||
# from .draw_user_card import get_user_card
|
||||
|
||||
sv_user_config = SV('ark用户管理', pm=2)
|
||||
sv_user_add = SV('ark用户添加')
|
||||
sv_user_info = SV('ark用户信息')
|
||||
ark_skd_cred_add = SV('森空岛cred绑定')
|
||||
sv_user_config = SV("ark用户管理", pm=2)
|
||||
sv_user_add = SV("ark用户添加")
|
||||
sv_user_info = SV("ark用户信息")
|
||||
ark_skd_cred_add = SV("森空岛cred绑定")
|
||||
# sv_user_help = SV('ark绑定帮助')
|
||||
|
||||
|
||||
@ -25,47 +25,49 @@ ark_skd_cred_add = SV('森空岛cred绑定')
|
||||
# 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):
|
||||
await bot.logger.info('开始执行[绑定/解绑用户信息]')
|
||||
await bot.logger.info("开始执行[绑定/解绑用户信息]")
|
||||
qid = ev.user_id
|
||||
await bot.logger.info(f'[绑定/解绑]UserID: {qid}')
|
||||
await bot.logger.info(f"[绑定/解绑]UserID: {qid}")
|
||||
|
||||
ark_uid = ev.text.strip()
|
||||
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)
|
||||
return await send_diff_msg(
|
||||
bot,
|
||||
data,
|
||||
{
|
||||
0: f'绑定ARK_UID{ark_uid}成功!',
|
||||
-1: f'ARK_UID{ark_uid}的位数不正确!',
|
||||
-2: f'ARK_UID{ark_uid}已经绑定过了!',
|
||||
-3: '你输入了错误的格式!',
|
||||
0: f"绑定ARK_UID{ark_uid}成功!",
|
||||
-1: f"ARK_UID{ark_uid}的位数不正确!",
|
||||
-2: f"ARK_UID{ark_uid}已经绑定过了!",
|
||||
-3: "你输入了错误的格式!",
|
||||
},
|
||||
)
|
||||
elif '切换' in ev.command:
|
||||
elif "切换" in ev.command:
|
||||
data = await ArknightsBind.switch_uid_by_game(qid, ev.bot_id, ark_uid)
|
||||
if isinstance(data, List):
|
||||
return await bot.send(f'切换ARK_UID{ark_uid}成功!')
|
||||
return await bot.send(f"切换ARK_UID{ark_uid}成功!")
|
||||
else:
|
||||
return await bot.send(f'尚未绑定该ARK_UID{ark_uid}')
|
||||
return await bot.send(f"尚未绑定该ARK_UID{ark_uid}")
|
||||
else:
|
||||
data = await ArknightsBind.delete_uid(qid, ev.bot_id, ark_uid)
|
||||
return await send_diff_msg(
|
||||
bot,
|
||||
data,
|
||||
{
|
||||
0: f'删除ARK_UID{ark_uid}成功!',
|
||||
-1: f'该ARK_UID{ark_uid}不在已绑定列表中!',
|
||||
0: 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):
|
||||
im = await deal_skd_cred(ev.bot_id, ev.text, ev.user_id)
|
||||
await bot.send(im)
|
||||
|
@ -3,8 +3,8 @@ import re
|
||||
from ..utils.ark_api import ark_skd_api
|
||||
from ..utils.database.models import ArknightsBind, ArknightsPush, ArknightsUser
|
||||
|
||||
ERROR_HINT = '添加失败, 格式为: skd添加cred Cred 例如: skd添加cred VropL583Sb1hClS5buQ4nSASkDlL8tMT'
|
||||
UID_HINT = '添加失败, 请先绑定明日方舟UID'
|
||||
ERROR_HINT = "添加失败, 格式为: skd添加cred Cred 例如: skd添加cred VropL583Sb1hClS5buQ4nSASkDlL8tMT"
|
||||
UID_HINT = "添加失败, 请先绑定明日方舟UID"
|
||||
|
||||
|
||||
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:
|
||||
return UID_HINT
|
||||
|
||||
match = re.search(r'\S+', cred)
|
||||
match = re.search(r"\S+", cred)
|
||||
if not match:
|
||||
return 'Cred无效!'
|
||||
return "Cred无效!"
|
||||
|
||||
# refresh token
|
||||
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):
|
||||
return 'Cred无效!'
|
||||
return "Cred无效!"
|
||||
else:
|
||||
skd_uid = check_cred.user.id_
|
||||
uid = check_cred.gameStatus.uid
|
||||
if uid not in uid_list:
|
||||
return '请先绑定该 Cred 对应的 uid'
|
||||
return "请先绑定该 Cred 对应的 uid"
|
||||
|
||||
# 检查是否已经绑定过 Cred, 如果有的话就 update
|
||||
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:
|
||||
await ArknightsPush.insert_push_data(bot_id, uid=uid, skd_uid=skd_uid)
|
||||
return '添加成功!'
|
||||
return "添加成功!"
|
||||
|
@ -15,23 +15,25 @@ from ..arknightsuid_wiki.draw_wiki_img import (
|
||||
from ..arknightsuid_resource.constants import CHARACTER_TABLE
|
||||
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):
|
||||
if text.endswith('\n'):
|
||||
if text.endswith("\n"):
|
||||
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)
|
||||
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)))
|
||||
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):
|
||||
char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', ev.text))
|
||||
char_name = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text))
|
||||
|
||||
char_id = None
|
||||
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_
|
||||
break
|
||||
if not char_id:
|
||||
await bot.send('未找到该干员')
|
||||
await bot.send("未找到该干员")
|
||||
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 get_wiki_info(char_id=char_id)
|
||||
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):
|
||||
char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', ev.text))
|
||||
char_name = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text))
|
||||
|
||||
char_id = None
|
||||
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_
|
||||
break
|
||||
if not char_id:
|
||||
await bot.send('未找到该干员')
|
||||
await bot.send("未找到该干员")
|
||||
return
|
||||
await bot.logger.info(f'开始获取{char_name}图鉴')
|
||||
await bot.logger.info(f"开始获取{char_name}图鉴")
|
||||
img = await get_equip_info(char_id=char_id)
|
||||
await bot.send(await text2pic(img))
|
||||
|
@ -4,7 +4,6 @@ from pathlib import Path
|
||||
from pprint import pformat
|
||||
from typing import Dict, Union
|
||||
|
||||
from colorama import Fore, Style
|
||||
from gsuid_core.utils.colortext.ColorText import ColorTextGroup, split_ctg
|
||||
from gsuid_core.utils.image.image_tools import draw_text_by_line
|
||||
from jinja2 import Template
|
||||
@ -16,23 +15,18 @@ from ..arknightsuid_resource.constants import (
|
||||
RANGE_TABLE,
|
||||
SKILL_TABLE,
|
||||
UNIEQUIP_TABLE,
|
||||
CharacterTable,
|
||||
)
|
||||
from ..utils.fonts.source_han_sans import (
|
||||
sans_font_18,
|
||||
sans_font_20,
|
||||
sans_font_24,
|
||||
sans_font_26,
|
||||
sans_font_34,
|
||||
sans_font_50,
|
||||
sans_font_120,
|
||||
)
|
||||
|
||||
TEXTURE2D_PATH = Path(__file__).parent / 'texture2D'
|
||||
TEXTURE2D_PATH = Path(__file__).parent / "texture2D"
|
||||
|
||||
bg_img = Image.open(TEXTURE2D_PATH / 'bg.jpg')
|
||||
title_img = Image.open(TEXTURE2D_PATH / 'title.png')
|
||||
vvan_img = Image.open(TEXTURE2D_PATH / 'char_4098_vvana_2b.png').resize((2000, 2000))
|
||||
bg_img = Image.open(TEXTURE2D_PATH / "bg.jpg")
|
||||
title_img = Image.open(TEXTURE2D_PATH / "title.png")
|
||||
vvan_img = Image.open(TEXTURE2D_PATH / "char_4098_vvana_2b.png").resize((2000, 2000))
|
||||
|
||||
first_color = (29, 29, 29)
|
||||
white_color = (255, 255, 255)
|
||||
@ -40,36 +34,36 @@ red_color = (235, 61, 75)
|
||||
black_color = (0, 0, 0)
|
||||
|
||||
profession_en_to_cn = {
|
||||
'WARRIOR': '近卫',
|
||||
'SNIPER': '狙击',
|
||||
'TANK': '重装',
|
||||
'MEDIC': '医疗',
|
||||
'SUPPORT': '辅助',
|
||||
'CASTER': '术师',
|
||||
'SPECIAL': '特种',
|
||||
'PIONEER': '先锋',
|
||||
'TOKEN': '召唤物',
|
||||
'TRAP': '陷阱',
|
||||
"WARRIOR": "近卫",
|
||||
"SNIPER": "狙击",
|
||||
"TANK": "重装",
|
||||
"MEDIC": "医疗",
|
||||
"SUPPORT": "辅助",
|
||||
"CASTER": "术师",
|
||||
"SPECIAL": "特种",
|
||||
"PIONEER": "先锋",
|
||||
"TOKEN": "召唤物",
|
||||
"TRAP": "陷阱",
|
||||
}
|
||||
|
||||
char_position_en_to_cn = {
|
||||
'MELEE': '近战',
|
||||
'RANGED': '远程',
|
||||
'ALL': '近战/远程',
|
||||
'NONE': '无',
|
||||
"MELEE": "近战",
|
||||
"RANGED": "远程",
|
||||
"ALL": "近战/远程",
|
||||
"NONE": "无",
|
||||
}
|
||||
|
||||
attr_en_to_cn = {
|
||||
'maxHp': '生命',
|
||||
'atk': '攻击',
|
||||
'def_': '防御',
|
||||
'magicResistance': '法抗',
|
||||
'cost': '部署费用',
|
||||
'blockCnt': '阻挡',
|
||||
"maxHp": "生命",
|
||||
"atk": "攻击",
|
||||
"def_": "防御",
|
||||
"magicResistance": "法抗",
|
||||
"cost": "部署费用",
|
||||
"blockCnt": "阻挡",
|
||||
# "moveSpeed": "移动速度",
|
||||
'attackSpeed': '攻击速度',
|
||||
'baseAttackTime': '攻击间隔',
|
||||
'respawnTime': '再部署时间',
|
||||
"attackSpeed": "攻击速度",
|
||||
"baseAttackTime": "攻击间隔",
|
||||
"respawnTime": "再部署时间",
|
||||
# "hpRecoveryPerSec": "生命回复",
|
||||
# "spRecoveryPerSec": "技力回复",
|
||||
# "maxDeployCount": "部署数量上限",
|
||||
@ -85,50 +79,47 @@ attr_en_to_cn = {
|
||||
}
|
||||
|
||||
potential_id_to_cn = {
|
||||
0: '潜能2',
|
||||
1: '潜能3',
|
||||
2: '潜能4',
|
||||
3: '潜能5',
|
||||
4: '潜能6',
|
||||
0: "潜能2",
|
||||
1: "潜能3",
|
||||
2: "潜能4",
|
||||
3: "潜能5",
|
||||
4: "潜能6",
|
||||
}
|
||||
|
||||
|
||||
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))
|
||||
f_ = pformat(split_ctg(groups_, length)).split('\n')
|
||||
print(Fore.CYAN, '\t', f_[0], '\n\t'.join(f_[0:]))
|
||||
f_ = pformat(split_ctg(groups_, length)).split("\n")
|
||||
|
||||
|
||||
def render_template(template_str: str, data: Dict[str, Union[float, Union[int, None]]]):
|
||||
matches = re.finditer(r'\{([^}:]+)\}', template_str)
|
||||
matches_1 = re.finditer(r'\{([^{}]+):([^{}]+)\}', template_str)
|
||||
matches = re.finditer(r"\{([^}:]+)\}", template_str)
|
||||
matches_1 = re.finditer(r"\{([^{}]+):([^{}]+)\}", template_str)
|
||||
|
||||
placeholder_data = {}
|
||||
for match in matches:
|
||||
placeholder = match.groups()
|
||||
formatting_option = ''
|
||||
placeholder_data[placeholder[0]] = (formatting_option, data.get(placeholder[0], ''))
|
||||
formatting_option = ""
|
||||
placeholder_data[placeholder[0]] = (
|
||||
formatting_option,
|
||||
data.get(placeholder[0], ""),
|
||||
)
|
||||
for match in matches_1:
|
||||
placeholder, formatting_option = match.groups()
|
||||
value = data.get(placeholder.replace('-', ''), '')
|
||||
value = data.get(placeholder.replace("-", ""), "")
|
||||
# 可以在下列状态和初始状态间切换:\n攻击范围缩小,防御力+{def:0%},
|
||||
# 每秒恢复最大生命的{HP_RECOVERY_PER_SEC_BY_MAX_HP_RATIO:0.0%}
|
||||
# {'def': 1, 'hp_recovery_per_sec_by_max_hp_ratio': 0.06}
|
||||
if value == '':
|
||||
value = data.get(placeholder.replace('-', '_').lower(), '')
|
||||
if value == "":
|
||||
value = data.get(placeholder.replace("-", "_").lower(), "")
|
||||
placeholder_data[placeholder] = (formatting_option, value)
|
||||
|
||||
for placeholder, (formatting_option, value) in placeholder_data.items():
|
||||
if formatting_option == '':
|
||||
template_str = template_str.replace(f'{{{placeholder}}}', f'{value}')
|
||||
if formatting_option == "":
|
||||
template_str = template_str.replace(f"{{{placeholder}}}", f"{value}")
|
||||
else:
|
||||
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)
|
||||
@ -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):
|
||||
im = ''
|
||||
im = ""
|
||||
|
||||
try:
|
||||
char_equip_id_list = UNIEQUIP_TABLE.charEquip[char_id]
|
||||
except KeyError:
|
||||
return '该干员没有模组'
|
||||
return "该干员没有模组"
|
||||
for char_equip_id in char_equip_id_list:
|
||||
equip_dict = UNIEQUIP_TABLE.equipDict[char_equip_id]
|
||||
uniequip_name = equip_dict.uniEquipName
|
||||
@ -153,12 +144,12 @@ async def get_equip_info(char_id: str):
|
||||
except KeyError:
|
||||
continue
|
||||
|
||||
im += f'模组名: {uniequip_name}\n'
|
||||
im += f"模组名: {uniequip_name}\n"
|
||||
|
||||
for equip_phase in char_equip_phases:
|
||||
equip_level = equip_phase.equipLevel
|
||||
im += '-----------------\n'
|
||||
im += f'等级: {equip_level}\n'
|
||||
im += "-----------------\n"
|
||||
im += f"等级: {equip_level}\n"
|
||||
equip_attribute_add_dict = {}
|
||||
equip_attribute_blackboard = equip_phase.attributeBlackboard
|
||||
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:
|
||||
if attr in attr_en_to_cn:
|
||||
im += f'{attr_en_to_cn[attr]}: +{equip_attribute_add_dict[attr]}\n'
|
||||
im += '-----------------\n'
|
||||
im += '效果:\n'
|
||||
im += f"{attr_en_to_cn[attr]}: +{equip_attribute_add_dict[attr]}\n"
|
||||
im += "-----------------\n"
|
||||
im += "效果:\n"
|
||||
for part in equip_phase.parts:
|
||||
target = part.target
|
||||
if target == 'TRAIT':
|
||||
if target == "TRAIT":
|
||||
overrideTraitDataBundle = part.overrideTraitDataBundle
|
||||
assert overrideTraitDataBundle.candidates is not None
|
||||
for candidate in overrideTraitDataBundle.candidates:
|
||||
@ -181,12 +172,18 @@ async def get_equip_info(char_id: str):
|
||||
for blackboard_ in blackboard:
|
||||
blackboard_dict[blackboard_.key] = blackboard_.value
|
||||
if additionalDescription:
|
||||
additionalDescription = re.sub(r'<[^>]+>', '', additionalDescription)
|
||||
additionalDescription = render_template(additionalDescription, blackboard_dict)
|
||||
additionalDescription = re.sub(r'.000000', '', additionalDescription)
|
||||
im += f'{additionalDescription}\n'
|
||||
additionalDescription = re.sub(
|
||||
r"<[^>]+>", "", additionalDescription
|
||||
)
|
||||
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
|
||||
assert addOrOverrideTalentDataBundle.candidates is not None
|
||||
for candidate in addOrOverrideTalentDataBundle.candidates:
|
||||
@ -195,10 +192,12 @@ async def get_equip_info(char_id: str):
|
||||
upgradeDescription = candidate.upgradeDescription
|
||||
blackboard = candidate.blackboard
|
||||
if upgradeDescription and blackboard:
|
||||
upgradeDescription = re.sub(r'<[^>]+>', '', upgradeDescription)
|
||||
im += f'{upgradeDescription}\n'
|
||||
upgradeDescription = re.sub(
|
||||
r"<[^>]+>", "", upgradeDescription
|
||||
)
|
||||
im += f"{upgradeDescription}\n"
|
||||
|
||||
elif target == 'DISPLAY':
|
||||
elif target == "DISPLAY":
|
||||
overrideTraitDataBundle = part.overrideTraitDataBundle
|
||||
assert overrideTraitDataBundle.candidates is not None
|
||||
for candidate in overrideTraitDataBundle.candidates:
|
||||
@ -208,23 +207,31 @@ async def get_equip_info(char_id: str):
|
||||
for blackboard_ in blackboard:
|
||||
blackboard_dict[blackboard_.key] = blackboard_.value
|
||||
if additionalDescription and blackboard:
|
||||
additionalDescription = re.sub(r'<[^>]+>', '', additionalDescription)
|
||||
additionalDescription = render_template(additionalDescription, blackboard_dict)
|
||||
additionalDescription = re.sub(r'.000000', '', additionalDescription)
|
||||
im += f'{additionalDescription}\n'
|
||||
additionalDescription = re.sub(
|
||||
r"<[^>]+>", "", additionalDescription
|
||||
)
|
||||
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
|
||||
assert addOrOverrideTalentDataBundle.candidates is not None
|
||||
for candidate in addOrOverrideTalentDataBundle.candidates:
|
||||
upgradeDescription = candidate.upgradeDescription
|
||||
if upgradeDescription == '':
|
||||
if upgradeDescription == "":
|
||||
continue
|
||||
else:
|
||||
upgradeDescription = re.sub(r'<[^>]+>', '', upgradeDescription)
|
||||
im += f'{upgradeDescription}\n'
|
||||
upgradeDescription = re.sub(
|
||||
r"<[^>]+>", "", upgradeDescription
|
||||
)
|
||||
im += f"{upgradeDescription}\n"
|
||||
|
||||
elif target == 'TRAIT_DATA_ONLY':
|
||||
elif target == "TRAIT_DATA_ONLY":
|
||||
overrideTraitDataBundle = part.overrideTraitDataBundle
|
||||
assert overrideTraitDataBundle.candidates is not None
|
||||
for candidate in overrideTraitDataBundle.candidates:
|
||||
@ -234,13 +241,17 @@ async def get_equip_info(char_id: str):
|
||||
for blackboard_ in blackboard:
|
||||
blackboard_dict[blackboard_.key] = blackboard_.value
|
||||
if overrideDescripton and blackboard:
|
||||
overrideDescripton = re.sub(r'<[^>]+>', '', overrideDescripton)
|
||||
overrideDescripton = render_template(overrideDescripton, blackboard_dict)
|
||||
im += f'{overrideDescripton}\n'
|
||||
overrideDescripton = re.sub(
|
||||
r"<[^>]+>", "", overrideDescripton
|
||||
)
|
||||
overrideDescripton = render_template(
|
||||
overrideDescripton, blackboard_dict
|
||||
)
|
||||
im += f"{overrideDescripton}\n"
|
||||
else:
|
||||
raise NotImplementedError
|
||||
|
||||
im += '-----------------\n'
|
||||
im += "-----------------\n"
|
||||
|
||||
im = im[:-19]
|
||||
|
||||
@ -248,39 +259,39 @@ async def get_equip_info(char_id: str):
|
||||
|
||||
|
||||
async def get_wiki_info(char_id: str):
|
||||
im = ''
|
||||
im = ""
|
||||
|
||||
character_data = CHARACTER_TABLE[char_id]
|
||||
|
||||
char_name = character_data.name
|
||||
im += f'干员名: {char_name}\n'
|
||||
im += '-----------------\n'
|
||||
im += f"干员名: {char_name}\n"
|
||||
im += "-----------------\n"
|
||||
char_rarity = character_data.rarity
|
||||
im += f'星级: {str(char_rarity + 1)}\n'
|
||||
im += '-----------------\n'
|
||||
im += f"星级: {char_rarity + 1!s}\n"
|
||||
im += "-----------------\n"
|
||||
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
|
||||
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 = UNIEQUIP_TABLE.subProfDict[sub_profession_id].subProfessionName
|
||||
im += f'子职业: {sub_profession}\n'
|
||||
im += '-----------------\n'
|
||||
im += f"子职业: {sub_profession}\n"
|
||||
im += "-----------------\n"
|
||||
nation_id = character_data.nationId
|
||||
group_id = character_data.groupId
|
||||
team_id = character_data.teamId
|
||||
|
||||
im += '属性:\n'
|
||||
im += "属性:\n"
|
||||
char_phases_data = character_data.phases[-1]
|
||||
char_max_phase = len(character_data.phases)
|
||||
char_max_level = char_phases_data.maxLevel
|
||||
char_attributes_key_frame = char_phases_data.attributesKeyFrames[-1].data
|
||||
for idx, attr in enumerate(char_attributes_key_frame):
|
||||
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:
|
||||
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_description = talent_candidates[-1].description
|
||||
if char_talent_description:
|
||||
char_talent_description = re.sub(r'<[^>]+>', '', char_talent_description)
|
||||
im += f'{char_talent_name}: {char_talent_description}\n'
|
||||
char_talent_description = re.sub(
|
||||
r"<[^>]+>", "", char_talent_description
|
||||
)
|
||||
im += f"{char_talent_name}: {char_talent_description}\n"
|
||||
|
||||
char_potential_data = character_data.potentialRanks
|
||||
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):
|
||||
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:
|
||||
potential_add_attribute = potential.buff.attributes.attributeModifiers
|
||||
if len(potential.buff.attributes.attributeModifiers) == 1:
|
||||
@ -312,81 +325,83 @@ async def get_wiki_info(char_id: str):
|
||||
)
|
||||
else:
|
||||
raise NotImplementedError
|
||||
im += '-----------------\n'
|
||||
im += "-----------------\n"
|
||||
|
||||
if character_data.favorKeyFrames:
|
||||
char_favor_add_data = character_data.favorKeyFrames[-1].data
|
||||
im += '满信赖加成\n'
|
||||
im += "满信赖加成\n"
|
||||
for attr in char_favor_add_data:
|
||||
if attr[0] in ['maxHp', 'atk', 'def_', 'magicResistance'] and attr[1] != 0:
|
||||
im += f'{attr_en_to_cn[attr[0]]}: +{attr[1]}\n'
|
||||
if attr[0] in ["maxHp", "atk", "def_", "magicResistance"] and attr[1] != 0:
|
||||
im += f"{attr_en_to_cn[attr[0]]}: +{attr[1]}\n"
|
||||
|
||||
im += '-----------------\n'
|
||||
im += "-----------------\n"
|
||||
skill_id_list: list[str] = []
|
||||
for skill in character_data.skills:
|
||||
if skill.skillId is None:
|
||||
continue
|
||||
skill_id_list.append(skill.skillId)
|
||||
|
||||
im += '技能:\n'
|
||||
im += "技能:\n"
|
||||
|
||||
for skill in skill_id_list:
|
||||
skill_data = SKILL_TABLE.skills[skill]
|
||||
skill_level_data = skill_data.levels[-1]
|
||||
skill_name = skill_level_data.name
|
||||
im += f'技能名: {skill_name}\n'
|
||||
im += f"技能名: {skill_name}\n"
|
||||
skill_type = skill_level_data.skillType
|
||||
skill_description = skill_level_data.description
|
||||
skill_sp_data = skill_level_data.spData
|
||||
skill_sp_type = skill_sp_data.spType
|
||||
|
||||
if skill_sp_type == 1:
|
||||
im += '自动回复 '
|
||||
im += "自动回复 "
|
||||
elif skill_sp_type == 2:
|
||||
im += '攻击回复 '
|
||||
im += "攻击回复 "
|
||||
elif skill_sp_type == 4:
|
||||
im += '受击回复 '
|
||||
im += "受击回复 "
|
||||
elif skill_sp_type == 8:
|
||||
pass
|
||||
else:
|
||||
raise NotImplementedError
|
||||
|
||||
if skill_type == 1:
|
||||
im += '手动触发\n'
|
||||
im += "手动触发\n"
|
||||
elif skill_type == 2:
|
||||
im += '自动触发\n'
|
||||
im += "自动触发\n"
|
||||
elif skill_type == 0:
|
||||
pass
|
||||
else:
|
||||
raise NotImplementedError
|
||||
|
||||
skill_duration = skill_level_data.duration
|
||||
im += f'消耗: {skill_sp_data.spCost} '
|
||||
im += f'初始: {skill_sp_data.initSp} '
|
||||
im += f'持续: {str(skill_duration)}\n'
|
||||
im += f"消耗: {skill_sp_data.spCost} "
|
||||
im += f"初始: {skill_sp_data.initSp} "
|
||||
im += f"持续: {skill_duration!s}\n"
|
||||
skill_blackboard_data = skill_level_data.blackboard
|
||||
black_board_dict: dict[str, Union[Union[int, float], None]] = {}
|
||||
for black_board in skill_blackboard_data:
|
||||
black_board_dict[black_board.key] = black_board.value
|
||||
if skill_description:
|
||||
skill_description = skill_description.replace(':0.0', '')
|
||||
skill_description = re.sub(r'<[^>]+>', '', skill_description)
|
||||
skill_description = render_template(skill_description, black_board_dict).replace('--', '-')
|
||||
last_skill_description = re.sub(r'.000000', '', skill_description)
|
||||
if '{' in last_skill_description:
|
||||
skill_description = skill_description.replace(":0.0", "")
|
||||
skill_description = re.sub(r"<[^>]+>", "", skill_description)
|
||||
skill_description = render_template(
|
||||
skill_description, black_board_dict
|
||||
).replace("--", "-")
|
||||
last_skill_description = re.sub(r".000000", "", skill_description)
|
||||
if "{" in last_skill_description:
|
||||
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:
|
||||
im += f'{skill_desc_line}\n'
|
||||
im += '-----------------\n'
|
||||
im += f"{skill_desc_line}\n"
|
||||
im += "-----------------\n"
|
||||
im = im[:-19]
|
||||
|
||||
return im
|
||||
|
||||
|
||||
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)
|
||||
|
||||
img.paste(bg_img, (0, 0))
|
||||
@ -401,19 +416,19 @@ async def draw_wiki(char_id: str):
|
||||
char_name,
|
||||
font=sans_font_120,
|
||||
fill=black_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
|
||||
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)
|
||||
|
||||
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)
|
||||
|
||||
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
|
||||
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
|
||||
bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
|
||||
light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
|
||||
bar_img.paste(light_line, (290, 60), light_line)
|
||||
bar_img_draw = ImageDraw.ImageDraw(bar_img)
|
||||
|
||||
@ -424,7 +439,7 @@ async def draw_wiki(char_id: str):
|
||||
char_position_cn,
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
|
||||
sub_profession_id = character_data.subProfessionId
|
||||
@ -434,70 +449,70 @@ async def draw_wiki(char_id: str):
|
||||
sub_profession,
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
img.paste(bar_img, (40, 110), bar_img)
|
||||
|
||||
nation_id = character_data.nationId
|
||||
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
|
||||
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
|
||||
bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
|
||||
light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
|
||||
bar_img.paste(light_line, (290, 60), light_line)
|
||||
bar_img_draw = ImageDraw.ImageDraw(bar_img)
|
||||
bar_img_draw.text(
|
||||
(155, 100),
|
||||
'势力',
|
||||
"势力",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
bar_img_draw.text(
|
||||
(355, 100),
|
||||
nation_id if nation_id else '未知',
|
||||
nation_id if nation_id else "未知",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
img.paste(bar_img, (940, 180 - 50), bar_img)
|
||||
|
||||
group_id = character_data.groupId
|
||||
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
|
||||
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
|
||||
bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
|
||||
light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
|
||||
bar_img.paste(light_line, (290, 60), light_line)
|
||||
bar_img_draw = ImageDraw.ImageDraw(bar_img)
|
||||
bar_img_draw.text(
|
||||
(155, 100),
|
||||
'阵营',
|
||||
"阵营",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
bar_img_draw.text(
|
||||
(355, 100),
|
||||
group_id if group_id else '未知',
|
||||
group_id if group_id else "未知",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
img.paste(bar_img, (940, 188 + 20), bar_img)
|
||||
|
||||
team_id = character_data.teamId
|
||||
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
|
||||
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
|
||||
bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
|
||||
light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
|
||||
bar_img.paste(light_line, (290, 60), light_line)
|
||||
bar_img_draw = ImageDraw.ImageDraw(bar_img)
|
||||
bar_img_draw.text(
|
||||
(155, 100),
|
||||
'队伍',
|
||||
"队伍",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
bar_img_draw.text(
|
||||
(355, 100),
|
||||
team_id if team_id else '未知',
|
||||
team_id if team_id else "未知",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
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_attributes_key_frame = char_phases_data.attributesKeyFrames[-1].data
|
||||
|
||||
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
|
||||
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
|
||||
bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
|
||||
light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
|
||||
bar_img.paste(light_line, (320, 60), light_line)
|
||||
bar_img_draw = ImageDraw.ImageDraw(bar_img)
|
||||
bar_img_draw.text(
|
||||
(140, 100),
|
||||
'生命上限',
|
||||
"生命上限",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
bar_img_draw.text(
|
||||
(420, 100),
|
||||
str(char_attributes_key_frame.maxHp),
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='mm',
|
||||
anchor="mm",
|
||||
)
|
||||
img.paste(bar_img, (940, 380), bar_img)
|
||||
|
||||
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
|
||||
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
|
||||
bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
|
||||
light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
|
||||
bar_img.paste(light_line, (320, 60), light_line)
|
||||
bar_img_draw = ImageDraw.ImageDraw(bar_img)
|
||||
bar_img_draw.text(
|
||||
(140, 100),
|
||||
'攻击力',
|
||||
"攻击力",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
bar_img_draw.text(
|
||||
(420, 100),
|
||||
str(char_attributes_key_frame.atk),
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='mm',
|
||||
anchor="mm",
|
||||
)
|
||||
img.paste(bar_img, (940, 380 + 78), bar_img)
|
||||
|
||||
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
|
||||
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
|
||||
bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
|
||||
light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
|
||||
bar_img.paste(light_line, (320, 60), light_line)
|
||||
bar_img_draw = ImageDraw.ImageDraw(bar_img)
|
||||
bar_img_draw.text(
|
||||
(140, 100),
|
||||
'防御力',
|
||||
"防御力",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
bar_img_draw.text(
|
||||
(420, 100),
|
||||
str(char_attributes_key_frame.def_),
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='mm',
|
||||
anchor="mm",
|
||||
)
|
||||
img.paste(bar_img, (940, 380 + 78 * 2), bar_img)
|
||||
|
||||
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
|
||||
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
|
||||
bar_img = Image.open(TEXTURE2D_PATH / "bar.png")
|
||||
light_line = Image.open(TEXTURE2D_PATH / "light_line.png")
|
||||
bar_img.paste(light_line, (320, 60), light_line)
|
||||
bar_img_draw = ImageDraw.ImageDraw(bar_img)
|
||||
bar_img_draw.text(
|
||||
(140, 100),
|
||||
'法抗',
|
||||
"法抗",
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='lm',
|
||||
anchor="lm",
|
||||
)
|
||||
bar_img_draw.text(
|
||||
(420, 100),
|
||||
str(char_attributes_key_frame.magicResistance),
|
||||
font=sans_font_34,
|
||||
fill=white_color,
|
||||
anchor='mm',
|
||||
anchor="mm",
|
||||
)
|
||||
img.paste(bar_img, (940, 380 + 78 * 3), bar_img)
|
||||
|
||||
# 攻击范围
|
||||
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:
|
||||
range_data = RANGE_TABLE.range_[range_id]
|
||||
grids = range_data.grids
|
||||
area_0 = Image.open(TEXTURE2D_PATH / 'area_0.png').resize((58, 58))
|
||||
area_1 = Image.open(TEXTURE2D_PATH / 'area_1.png')
|
||||
area_0 = Image.open(TEXTURE2D_PATH / "area_0.png").resize((58, 58))
|
||||
area_1 = Image.open(TEXTURE2D_PATH / "area_1.png")
|
||||
for grid in grids:
|
||||
col = grid.col
|
||||
row = grid.row
|
||||
@ -638,8 +653,8 @@ async def draw_wiki(char_id: str):
|
||||
skill_id_list.append(skill.skillId)
|
||||
|
||||
for skill in skill_id_list:
|
||||
skill_bg = Image.open(TEXTURE2D_PATH / 'skill_bg.png')
|
||||
skill3_bar_bg = Image.open(TEXTURE2D_PATH / 'skill3_bar.png')
|
||||
skill_bg = Image.open(TEXTURE2D_PATH / "skill_bg.png")
|
||||
skill3_bar_bg = Image.open(TEXTURE2D_PATH / "skill3_bar.png")
|
||||
|
||||
skill_data = SKILL_TABLE.skills[skill]
|
||||
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:
|
||||
black_board_dict[black_board.key] = black_board.value
|
||||
if skill_description:
|
||||
skill_description = re.sub(r'<[^>]+>', '', skill_description)
|
||||
skill_description = render_template(skill_description, black_board_dict).replace('--', '-')
|
||||
last_skill_description = re.sub(r'.000000', '', skill_description)
|
||||
print(last_skill_description)
|
||||
if '{' in last_skill_description:
|
||||
skill_description = re.sub(r"<[^>]+>", "", skill_description)
|
||||
skill_description = render_template(
|
||||
skill_description, black_board_dict
|
||||
).replace("--", "-")
|
||||
last_skill_description = re.sub(r".000000", "", skill_description)
|
||||
if "{" in last_skill_description:
|
||||
raise NotImplementedError
|
||||
# 匹配 -70% +200% 这种格式的数字
|
||||
c = re.sub(r'(\d+)%', r'\1%', last_skill_description)
|
||||
print(c)
|
||||
print(test_ctg(30, last_skill_description))
|
||||
c = re.sub(r"(\d+)%", r"\1%", last_skill_description)
|
||||
draw_text_by_line(
|
||||
img=skill_bg,
|
||||
pos=(70, 20),
|
||||
text=last_skill_description,
|
||||
font=sans_font_24,
|
||||
fill='#3b4354',
|
||||
fill="#3b4354",
|
||||
max_length=400,
|
||||
)
|
||||
# skill_bg.show()
|
||||
@ -677,5 +691,5 @@ async def draw_wiki(char_id: str):
|
||||
return img
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
asyncio.run(draw_wiki(char_id='char_4098_vvana'))
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(draw_wiki(char_id="char_4098_vvana"))
|
||||
|
@ -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_GEN_CRED_BY_CODE = 'https://zonai.skland.com/api/v1/user/auth/generate_cred_by_code'
|
||||
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_SKD_SIGN = 'https://zonai.skland.com/api/v1/game/attendance'
|
||||
ARK_SKD_SIGN = "https://zonai.skland.com/api/v1/game/attendance"
|
||||
|
@ -20,23 +20,23 @@ from ...models.skland.models import (
|
||||
)
|
||||
from .api import ARK_PLAYER_INFO, ARK_REFRESH_TOKEN, ARK_SKD_SIGN, ARK_USER_ME
|
||||
|
||||
proxy_url = core_plugins_config.get_config('proxy').data
|
||||
ssl_verify = core_plugins_config.get_config('MhySSLVerify').data
|
||||
proxy_url = core_plugins_config.get_config("proxy").data
|
||||
ssl_verify = core_plugins_config.get_config("MhySSLVerify").data
|
||||
|
||||
|
||||
_HEADER: Dict[str, str] = {
|
||||
'Host': 'zonai.skland.com',
|
||||
'platform': '1',
|
||||
'Origin': 'https://www.skland.com',
|
||||
'Referer': 'https://www.skland.com/',
|
||||
'Content-Type': 'application/json',
|
||||
'User-Agent': 'Skland/1.5.1 (com.hypergryph.skland; build:100501001; Android 33; ) Okhttp/4.11.0',
|
||||
'vName': '1.5.1',
|
||||
'vCode': '100501001',
|
||||
'nId': '1',
|
||||
'os': '33',
|
||||
'manufacturer': 'Xiaomi',
|
||||
'Connection': 'close',
|
||||
"Host": "zonai.skland.com",
|
||||
"platform": "1",
|
||||
"Origin": "https://www.skland.com",
|
||||
"Referer": "https://www.skland.com/",
|
||||
"Content-Type": "application/json",
|
||||
"User-Agent": "Skland/1.5.1 (com.hypergryph.skland; build:100501001; Android 33; ) Okhttp/4.11.0",
|
||||
"vName": "1.5.1",
|
||||
"vCode": "100501001",
|
||||
"nId": "1",
|
||||
"os": "33",
|
||||
"manufacturer": "Xiaomi",
|
||||
"Connection": "close",
|
||||
}
|
||||
|
||||
|
||||
@ -51,25 +51,31 @@ class TokenRefreshFailed(Exception):
|
||||
class BaseArkApi:
|
||||
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]]:
|
||||
_pass_api = core_plugins_config.get_config('_pass_API').data
|
||||
async def _pass(
|
||||
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:
|
||||
data = await self._ark_request(
|
||||
url=f'{_pass_api}>={gt}&challenge={ch}',
|
||||
method='GET',
|
||||
url=f"{_pass_api}>={gt}&challenge={ch}",
|
||||
method="GET",
|
||||
)
|
||||
if isinstance(data, int) or not data:
|
||||
return None, None
|
||||
else:
|
||||
validate = data['data']['validate']
|
||||
ch = data['data']['challenge']
|
||||
validate = data["data"]["validate"]
|
||||
ch = data["data"]["challenge"]
|
||||
else:
|
||||
validate = None
|
||||
|
||||
return validate, ch
|
||||
|
||||
async def get_game_player_info(self, uid: str) -> Union[int, ArknightsPlayerInfoModel]:
|
||||
cred: Union[str, None] = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred')
|
||||
async def get_game_player_info(
|
||||
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:
|
||||
return -60
|
||||
is_vaild = await self.check_cred_valid(cred)
|
||||
@ -77,11 +83,11 @@ class BaseArkApi:
|
||||
await ArknightsUser.delete_user_data_by_uid(uid)
|
||||
return -61
|
||||
header = deepcopy(_HEADER)
|
||||
header['cred'] = cred
|
||||
header["cred"] = cred
|
||||
header = await self.set_sign(ARK_PLAYER_INFO, header=header)
|
||||
raw_data = await self.ark_request(
|
||||
url=ARK_PLAYER_INFO,
|
||||
params={'uid': uid},
|
||||
params={"uid": uid},
|
||||
header=header,
|
||||
)
|
||||
if isinstance(raw_data, int):
|
||||
@ -95,7 +101,9 @@ class BaseArkApi:
|
||||
return msgspec.convert(unpack_data, type=ArknightsPlayerInfoModel)
|
||||
|
||||
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:
|
||||
return -60
|
||||
is_vaild = await self.check_cred_valid(cred)
|
||||
@ -103,18 +111,18 @@ class BaseArkApi:
|
||||
await ArknightsUser.delete_user_data_by_uid(uid)
|
||||
return -61
|
||||
header = deepcopy(_HEADER)
|
||||
header['cred'] = cred
|
||||
data = {'uid': uid, 'gameId': 1}
|
||||
header["cred"] = cred
|
||||
data = {"uid": uid, "gameId": 1}
|
||||
header = await self.set_sign(
|
||||
ARK_SKD_SIGN,
|
||||
header=header,
|
||||
data=data,
|
||||
)
|
||||
header['Content-Type'] = 'application/json'
|
||||
header['Content-Length'] = str(len(json.dumps(data)))
|
||||
header["Content-Type"] = "application/json"
|
||||
header["Content-Length"] = str(len(json.dumps(data)))
|
||||
raw_data = await self.ark_request(
|
||||
url=ARK_SKD_SIGN,
|
||||
method='POST',
|
||||
method="POST",
|
||||
data=data,
|
||||
header=header,
|
||||
)
|
||||
@ -128,8 +136,12 @@ class BaseArkApi:
|
||||
else:
|
||||
return msgspec.convert(unpack_data, ArknightsAttendanceModel)
|
||||
|
||||
async def get_sign_info(self, uid: str) -> Union[int, ArknightsAttendanceCalendarModel]:
|
||||
cred: Union[str, None] = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred')
|
||||
async def get_sign_info(
|
||||
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:
|
||||
return -60
|
||||
is_vaild = await self.check_cred_valid(cred)
|
||||
@ -137,21 +149,21 @@ class BaseArkApi:
|
||||
await ArknightsUser.delete_user_data_by_uid(uid)
|
||||
return -61
|
||||
header = deepcopy(_HEADER)
|
||||
header['cred'] = cred
|
||||
header["cred"] = cred
|
||||
header = await self.set_sign(
|
||||
ARK_SKD_SIGN,
|
||||
header=header,
|
||||
params={
|
||||
'uid': uid,
|
||||
'gameId': 1,
|
||||
"uid": uid,
|
||||
"gameId": 1,
|
||||
},
|
||||
)
|
||||
raw_data = await self.ark_request(
|
||||
url=ARK_SKD_SIGN,
|
||||
method='GET',
|
||||
method="GET",
|
||||
params={
|
||||
'uid': uid,
|
||||
'gameId': 1,
|
||||
"uid": uid,
|
||||
"gameId": 1,
|
||||
},
|
||||
header=header,
|
||||
)
|
||||
@ -166,43 +178,52 @@ class BaseArkApi:
|
||||
return msgspec.convert(unpack_data, ArknightsAttendanceCalendarModel)
|
||||
|
||||
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]:
|
||||
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)
|
||||
if cred is None:
|
||||
return False
|
||||
header['cred'] = cred
|
||||
header["cred"] = cred
|
||||
header = await self.set_sign(ARK_USER_ME, header=header, token=token)
|
||||
raw_data = await self.ark_request(ARK_USER_ME, header=header)
|
||||
if isinstance(raw_data, int) or not raw_data:
|
||||
return False
|
||||
if 'code' in raw_data and raw_data['code'] == 10001:
|
||||
logger.info(f'cred is invalid {raw_data}')
|
||||
if "code" in raw_data and raw_data["code"] == 10001:
|
||||
logger.info(f"cred is invalid {raw_data}")
|
||||
return False
|
||||
unpack_data = self.unpack(raw_data)
|
||||
return msgspec.convert(unpack_data, type=ArknightsUserMeModel)
|
||||
|
||||
def unpack(self, raw_data: Dict) -> Dict:
|
||||
try:
|
||||
data = raw_data['data']
|
||||
data = raw_data["data"]
|
||||
return data
|
||||
except KeyError:
|
||||
return raw_data
|
||||
|
||||
async def refresh_token(self, cred: str, uid: Union[str, None] = None) -> str:
|
||||
header = deepcopy(_HEADER)
|
||||
header['cred'] = cred
|
||||
header['sign_enable'] = 'false'
|
||||
header["cred"] = cred
|
||||
header["sign_enable"] = "false"
|
||||
raw_data = await self.ark_request(url=ARK_REFRESH_TOKEN, header=header)
|
||||
if isinstance(raw_data, int) or not raw_data:
|
||||
raise TokenRefreshFailed
|
||||
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)
|
||||
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
|
||||
|
||||
async def set_sign(
|
||||
@ -216,49 +237,54 @@ class BaseArkApi:
|
||||
parsed_url = urlparse(url)
|
||||
path = parsed_url.path
|
||||
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(
|
||||
{
|
||||
'platform': header.get('platform', '1'),
|
||||
'timestamp': timestamp,
|
||||
'dId': dId,
|
||||
'vName': header.get('vName', ''),
|
||||
"platform": header.get("platform", "1"),
|
||||
"timestamp": timestamp,
|
||||
"dId": dId,
|
||||
"vName": header.get("vName", ""),
|
||||
},
|
||||
separators=(',', ':'),
|
||||
separators=(",", ":"),
|
||||
)
|
||||
s2 = ''
|
||||
s2 = ""
|
||||
if params:
|
||||
logger.debug(f'params {params}')
|
||||
s2 += '&'.join([str(x) + '=' + str(params[x]) for x in params])
|
||||
logger.debug(f"params {params}")
|
||||
s2 += "&".join([str(x) + "=" + str(params[x]) for x in params])
|
||||
if data:
|
||||
logger.debug(f'data {data}')
|
||||
logger.debug(f"data {data}")
|
||||
s2 += json.dumps(data)
|
||||
logger.debug(f'{path} {s2} {timestamp} {str1}')
|
||||
logger.debug(f"{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_}')
|
||||
token = token if token else token_
|
||||
if token is None:
|
||||
raise Exception('token is None')
|
||||
encode_token = token.encode('utf-8')
|
||||
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')
|
||||
header['sign'] = sign
|
||||
header['timestamp'] = timestamp
|
||||
header['dId'] = dId
|
||||
raise Exception("token is None")
|
||||
encode_token = token.encode("utf-8")
|
||||
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")
|
||||
)
|
||||
header["sign"] = sign
|
||||
header["timestamp"] = timestamp
|
||||
header["dId"] = dId
|
||||
logger.debug(header)
|
||||
return header
|
||||
|
||||
async def ark_request(
|
||||
self,
|
||||
url: str,
|
||||
method: Literal['GET', 'POST'] = 'GET',
|
||||
method: Literal["GET", "POST"] = "GET",
|
||||
header: Dict[str, Any] = _HEADER,
|
||||
params: Union[Dict[str, Any], None] = None,
|
||||
data: Union[Dict[str, Any], None] = None,
|
||||
use_proxy: Union[bool, None] = False,
|
||||
) -> 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:
|
||||
raw_data = await self._ark_request(
|
||||
url=url,
|
||||
@ -269,7 +295,7 @@ class BaseArkApi:
|
||||
use_proxy=use_proxy,
|
||||
)
|
||||
except TokenExpiredError:
|
||||
await self.refresh_token(header['cred'])
|
||||
await self.refresh_token(header["cred"])
|
||||
header = await self.set_sign(url, header, data, params)
|
||||
raw_data = await self._ark_request(
|
||||
url=url,
|
||||
@ -284,15 +310,17 @@ class BaseArkApi:
|
||||
async def _ark_request(
|
||||
self,
|
||||
url: str,
|
||||
method: Literal['GET', 'POST'] = 'GET',
|
||||
method: Literal["GET", "POST"] = "GET",
|
||||
header: Dict[str, Any] = _HEADER,
|
||||
params: Union[Dict[str, Any], None] = None,
|
||||
data: Union[Dict[str, Any], None] = None,
|
||||
use_proxy: Union[bool, None] = False,
|
||||
) -> 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 = {}
|
||||
if 'cred' not in header:
|
||||
if "cred" not in header:
|
||||
return 10001
|
||||
|
||||
async with client.request(
|
||||
@ -308,21 +336,21 @@ class BaseArkApi:
|
||||
raw_data = await resp.json()
|
||||
except ContentTypeError:
|
||||
_raw_data = await resp.text()
|
||||
raw_data = {'code': -999, 'data': _raw_data}
|
||||
raw_data = {"code": -999, "data": _raw_data}
|
||||
logger.info(raw_data)
|
||||
|
||||
# 判断code
|
||||
if raw_data['code'] == 0:
|
||||
if raw_data["code"] == 0:
|
||||
return raw_data
|
||||
|
||||
if raw_data['code'] == 10000:
|
||||
if raw_data["code"] == 10000:
|
||||
# token失效
|
||||
logger.info(f'{url} {raw_data}')
|
||||
logger.info(f"{url} {raw_data}")
|
||||
raise TokenExpiredError
|
||||
|
||||
if raw_data['code'] == 10001:
|
||||
if raw_data["code"] == 10001:
|
||||
# 重复签到
|
||||
return raw_data['code']
|
||||
return raw_data["code"]
|
||||
|
||||
# 判断status
|
||||
# if 'status' in raw_data and 'msg' in raw_data:
|
||||
|
@ -1,3 +1,3 @@
|
||||
from ..arknightsuid_config.ark_config import arkconfig
|
||||
|
||||
PREFIX = arkconfig.get_config('ArknightsPrefix').data
|
||||
PREFIX = arkconfig.get_config("ArknightsPrefix").data
|
||||
|
@ -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 (
|
||||
BaseModel,
|
||||
@ -13,18 +13,18 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy.future import select
|
||||
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):
|
||||
uid: Union[str, None] = Field(default=None, title='明日方舟UID')
|
||||
uid: Union[str, None] = Field(default=None, title="明日方舟UID")
|
||||
|
||||
|
||||
class ArknightsUser(User, table=True):
|
||||
uid: Union[str, None] = Field(default=None, title='明日方舟UID')
|
||||
skd_uid: Union[str, None] = Field(default=None, title='SKD用户ID')
|
||||
cred: Union[str, None] = Field(default=None, title='SKD凭证')
|
||||
token: Union[str, None] = Field(default=None, title='SKD Token')
|
||||
uid: Union[str, None] = Field(default=None, title="明日方舟UID")
|
||||
skd_uid: Union[str, None] = Field(default=None, title="SKD用户ID")
|
||||
cred: Union[str, None] = Field(default=None, title="SKD凭证")
|
||||
token: Union[str, None] = Field(default=None, title="SKD Token")
|
||||
|
||||
@classmethod
|
||||
@with_session
|
||||
@ -40,21 +40,23 @@ class ArknightsUser(User, table=True):
|
||||
|
||||
@classmethod
|
||||
@with_session
|
||||
async def get_all_user(cls: Type[T_ARK_User], session: AsyncSession) -> List[T_ARK_User]:
|
||||
sql = select(cls).where(cls.cred is not None, cls.cred != '')
|
||||
async def get_all_user(
|
||||
cls: Type[T_ARK_User], session: AsyncSession
|
||||
) -> Sequence[T_ARK_User]:
|
||||
sql = select(cls).where(cls.cred is not None, cls.cred != "")
|
||||
result = await session.execute(sql)
|
||||
data: List[T_ARK_User] = result.scalars().all()
|
||||
data: Sequence[T_ARK_User] = result.scalars().all()
|
||||
return data
|
||||
|
||||
@classmethod
|
||||
async def get_token_by_cred(cls, cred: str) -> Union[str, None]:
|
||||
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
|
||||
async def get_uid_by_cred(cls, cred: str) -> Union[str, None]:
|
||||
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
|
||||
async def update_user_attr_by_uid(
|
||||
@ -79,16 +81,20 @@ class ArknightsUser(User, table=True):
|
||||
|
||||
|
||||
class ArknightsPush(Push, table=True):
|
||||
uid: Union[str, None] = Field(default=None, title='明日方舟UID')
|
||||
skd_uid: Union[str, None] = Field(default=None, title='森空岛用户ID')
|
||||
ap_push: Union[bool, None] = Field(default=False, title='理智推送')
|
||||
ap_value: Union[int, None] = Field(default=110, title='理智推送阈值')
|
||||
ap_is_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_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='版本更新是否已经推送')
|
||||
uid: Union[str, None] = Field(default=None, title="明日方舟UID")
|
||||
skd_uid: Union[str, None] = Field(default=None, title="森空岛用户ID")
|
||||
ap_push: Union[bool, None] = Field(default=False, title="理智推送")
|
||||
ap_value: Union[int, None] = Field(default=110, title="理智推送阈值")
|
||||
ap_is_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_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
|
||||
async def insert_push_data(cls, bot_id: str, uid: str, skd_uid: str):
|
||||
@ -131,14 +137,16 @@ class ArknightsPush(Push, table=True):
|
||||
@classmethod
|
||||
async def change_push_status(
|
||||
cls,
|
||||
mode: Literal['ap', 'training'],
|
||||
mode: Literal["ap", "training"],
|
||||
uid: 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
|
||||
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)
|
||||
|
||||
@classmethod
|
||||
@ -148,8 +156,8 @@ class ArknightsPush(Push, table=True):
|
||||
|
||||
@site.register_admin
|
||||
class ArknightsBindadmin(GsAdminModel):
|
||||
pk_name = 'id'
|
||||
page_schema = PageSchema(label='方舟绑定管理', icon='fa fa-users') # type: ignore
|
||||
pk_name = "id"
|
||||
page_schema = PageSchema(label="方舟绑定管理", icon="fa fa-users") # type: ignore
|
||||
|
||||
# 配置管理模型
|
||||
model = ArknightsBind
|
||||
@ -157,8 +165,8 @@ class ArknightsBindadmin(GsAdminModel):
|
||||
|
||||
@site.register_admin
|
||||
class ArknightsUseradmin(GsAdminModel):
|
||||
pk_name = 'id'
|
||||
page_schema = PageSchema(label='方舟SKD CRED管理', icon='fa fa-database') # type: ignore
|
||||
pk_name = "id"
|
||||
page_schema = PageSchema(label="方舟SKD CRED管理", icon="fa fa-database") # type: ignore
|
||||
|
||||
# 配置管理模型
|
||||
model = ArknightsUser
|
||||
@ -166,8 +174,8 @@ class ArknightsUseradmin(GsAdminModel):
|
||||
|
||||
@site.register_admin
|
||||
class ArknightsPushadmin(GsAdminModel):
|
||||
pk_name = 'id'
|
||||
page_schema = PageSchema(label='明日方舟推送管理', icon='fa fa-database') # type: ignore
|
||||
pk_name = "id"
|
||||
page_schema = PageSchema(label="明日方舟推送管理", icon="fa fa-database") # type: ignore
|
||||
|
||||
# 配置管理模型
|
||||
model = ArknightsPush
|
||||
|
@ -3,9 +3,9 @@ from gsuid_core.utils.database.base_models import async_maker
|
||||
from sqlalchemy.sql import text
|
||||
|
||||
exec_list = [
|
||||
'ALTER TABLE arknightspush ADD COLUMN version_push BOOLEAN DEFAULT FALSE;',
|
||||
'ALTER TABLE arknightspush ADD COLUMN version_is_push BOOLEAN DEFAULT FALSE;',
|
||||
'ALTER TABLE arknightsuser ADD COLUMN token TEXT;',
|
||||
"ALTER TABLE arknightspush ADD COLUMN version_push BOOLEAN DEFAULT FALSE;",
|
||||
"ALTER TABLE arknightspush ADD COLUMN version_is_push BOOLEAN DEFAULT FALSE;",
|
||||
"ALTER TABLE arknightsuser ADD COLUMN token TEXT;",
|
||||
]
|
||||
|
||||
|
||||
|
@ -16,7 +16,7 @@ async def download_file(
|
||||
async with sess.get(url) as res:
|
||||
content = await res.read()
|
||||
except ClientConnectorError:
|
||||
logger.warning(f'[Arknights]{name}下载失败')
|
||||
logger.warning(f"[Arknights]{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)
|
||||
|
@ -1,14 +1,14 @@
|
||||
from typing import Union
|
||||
|
||||
|
||||
UID_HINT = '添加失败, 请先绑定明日方舟UID'
|
||||
UID_HINT = "添加失败, 请先绑定明日方舟UID"
|
||||
|
||||
|
||||
def get_error(retcode: Union[int, str]) -> str:
|
||||
if retcode == 10000:
|
||||
return '请求异常, 请检查具体实现代码...'
|
||||
return "请求异常, 请检查具体实现代码..."
|
||||
if retcode == 10001:
|
||||
return '请勿重复签到!'
|
||||
return "请勿重复签到!"
|
||||
if retcode == 10003:
|
||||
return '请勿修改设备时间'
|
||||
return f'API报错, 错误码为{retcode}!'
|
||||
return "请勿修改设备时间"
|
||||
return f"API报错, 错误码为{retcode}!"
|
||||
|
@ -10,10 +10,10 @@ def read_json(file_path: Path, **kwargs) -> Dict:
|
||||
Read a JSON file and return its contents as a dictionary.
|
||||
"""
|
||||
try:
|
||||
with Path.open(file_path, encoding='UTF-8', **kwargs) as file:
|
||||
with Path.open(file_path, encoding="UTF-8", **kwargs) as file:
|
||||
return json.load(file)
|
||||
except (FileNotFoundError, json.JSONDecodeError) as e:
|
||||
logger.error(f'Error reading JSON file: {e}')
|
||||
logger.error(f"Error reading JSON file: {e}")
|
||||
return {}
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@ def write_json(data: Dict, file_path: Path) -> None:
|
||||
Write a dictionary to a JSON file.
|
||||
"""
|
||||
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)
|
||||
except FileNotFoundError as e:
|
||||
logger.error(f'Error writing JSON file: {e}')
|
||||
logger.error(f"Error writing JSON file: {e}")
|
||||
|
@ -2,7 +2,7 @@ from pathlib import Path
|
||||
|
||||
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:
|
||||
|
@ -2,7 +2,7 @@ from pathlib import Path
|
||||
|
||||
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:
|
||||
|
@ -4,9 +4,9 @@ from typing import Union
|
||||
from gsuid_core.utils.image.image_tools import CustomizeImage
|
||||
from PIL import Image
|
||||
|
||||
BG_PATH = Path(__file__).parent / 'bg'
|
||||
NM_BG_PATH = BG_PATH / 'nm_bg'
|
||||
SP_BG_PATH = BG_PATH / 'sp_bg'
|
||||
BG_PATH = Path(__file__).parent / "bg"
|
||||
NM_BG_PATH = BG_PATH / "nm_bg"
|
||||
SP_BG_PATH = BG_PATH / "sp_bg"
|
||||
|
||||
|
||||
async def get_simple_bg(
|
||||
|
@ -6,10 +6,10 @@ from gsuid_core.bot import Bot
|
||||
async def send_diff_msg(bot: Bot, code: Any, data: Union[Dict, None] = None):
|
||||
if data is None:
|
||||
data = {
|
||||
0: '绑定UID成功!',
|
||||
-1: 'UID的位数不正确!',
|
||||
-2: 'UID已经绑定过了!',
|
||||
-3: '你输入了错误的格式!',
|
||||
0: "绑定UID成功!",
|
||||
-1: "UID的位数不正确!",
|
||||
-2: "UID已经绑定过了!",
|
||||
-3: "你输入了错误的格式!",
|
||||
}
|
||||
for retcode in data:
|
||||
if code == retcode:
|
||||
|
@ -6,8 +6,8 @@ from msgspec import Struct, UnsetType, convert, field
|
||||
from msgspec import json as mscjson
|
||||
from typing_extensions import dataclass_transform
|
||||
|
||||
Model = TypeVar('Model', bound='BaseStruct')
|
||||
T = TypeVar('T')
|
||||
Model = TypeVar("Model", bound="BaseStruct")
|
||||
T = TypeVar("T")
|
||||
|
||||
|
||||
def transUnset(v: Union[T, UnsetType], d: Any = None) -> Union[T, Any]:
|
||||
|
@ -7,8 +7,8 @@ from msgspec import field
|
||||
|
||||
|
||||
class ActivityTableBasicData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name="id")
|
||||
type_: str = field(name="type")
|
||||
name: str
|
||||
startTime: int
|
||||
endTime: int
|
||||
@ -32,16 +32,16 @@ class ActivityTableHomeActivityConfig(BaseStruct):
|
||||
|
||||
|
||||
class MissionDisplayRewards(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
|
||||
|
||||
class MissionData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
sortId: int
|
||||
description: str
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
itemBgType: str
|
||||
preMissionIds: Union[List[str], None]
|
||||
template: str
|
||||
@ -59,9 +59,9 @@ class MissionData(BaseStruct):
|
||||
|
||||
|
||||
class MissionGroup(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
title: Union[str, None]
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
preMissionGroup: Union[str, None]
|
||||
period: Union[List[int], None]
|
||||
rewards: Union[List[MissionDisplayRewards], None]
|
||||
@ -79,9 +79,9 @@ class DefaultZoneData(BaseStruct):
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class DefaultShopData(BaseStruct):
|
||||
@ -244,7 +244,7 @@ class Act3D0DataLimitedPoolDetailInfoPoolItemInfo(BaseStruct):
|
||||
perCount: int
|
||||
totalCount: int
|
||||
weight: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
orderId: int
|
||||
|
||||
|
||||
@ -259,7 +259,7 @@ class Act3D0DataInfinitePoolDetailInfoPoolItemInfo(BaseStruct):
|
||||
goodType: str
|
||||
perCount: int
|
||||
weight: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
orderId: int
|
||||
|
||||
|
||||
@ -495,7 +495,7 @@ class RuneData(BaseStruct):
|
||||
|
||||
|
||||
class RuneTablePackedRuneData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
points: float
|
||||
mutexGroupKey: Union[str, None]
|
||||
description: Union[str, None]
|
||||
@ -523,7 +523,7 @@ class Act5D1Data(BaseStruct):
|
||||
|
||||
|
||||
class ActivityCollectionDataCollectionInfo(BaseStruct):
|
||||
id_: int = field(name='id')
|
||||
id_: int = field(name="id")
|
||||
itemType: str
|
||||
itemId: str
|
||||
itemCnt: int
|
||||
@ -736,7 +736,7 @@ class Act13SideDataLongTermMissionData(BaseStruct):
|
||||
|
||||
|
||||
class Act13SideDataDailyMissionData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
sortId: int
|
||||
description: str
|
||||
missionName: str
|
||||
@ -932,7 +932,7 @@ class Act17sideDataMainlineChapterData(BaseStruct):
|
||||
chapterDes: str
|
||||
chapterIcon: str
|
||||
unlockDes: str
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
|
||||
|
||||
class Act17sideDataMainlineData(BaseStruct):
|
||||
@ -1175,9 +1175,9 @@ class SharedCharData(BaseStruct):
|
||||
evolvePhase: int
|
||||
level: 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(
|
||||
name='equip',
|
||||
name="equip",
|
||||
default={},
|
||||
)
|
||||
skillIndex: Union[int, None] = None
|
||||
@ -1244,8 +1244,8 @@ class ActivityBossRushDataBossRushStageAdditionData(BaseStruct):
|
||||
class ActivityBossRushDataDisplayDetailRewards(BaseStruct):
|
||||
occPercent: int
|
||||
dropCount: int
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
dropType: int
|
||||
|
||||
|
||||
@ -1351,15 +1351,15 @@ class ActivityFloatParadeDataDailyData(BaseStruct):
|
||||
|
||||
class ActivityFloatParadeDataRewardPool(BaseStruct):
|
||||
grpId: str
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name="id")
|
||||
type_: str = field(name="type")
|
||||
name: str
|
||||
desc: Union[str, None]
|
||||
reward: ItemBundle
|
||||
|
||||
|
||||
class ActivityFloatParadeDataTactic(BaseStruct):
|
||||
id_: int = field(name='id')
|
||||
id_: int = field(name="id")
|
||||
name: str
|
||||
packName: str
|
||||
briefName: str
|
||||
@ -1398,7 +1398,7 @@ class ActSandboxData(BaseStruct):
|
||||
|
||||
|
||||
class ActivityMainlineBuffDataMissionGroupData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
bindBanner: str
|
||||
sortId: int
|
||||
zoneId: str
|
||||
@ -1414,7 +1414,7 @@ class ActivityMainlineBuffDataPeriodDataStepData(BaseStruct):
|
||||
|
||||
|
||||
class ActivityMainlineBuffDataPeriodData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
startTime: int
|
||||
endTime: int
|
||||
favorUpCharDesc: str
|
||||
@ -1514,23 +1514,23 @@ class Act24SideDataMissionExtraData(BaseStruct):
|
||||
|
||||
|
||||
class WeightItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name="id")
|
||||
type_: str = field(name="type")
|
||||
dropType: str
|
||||
count: int
|
||||
weight: int
|
||||
|
||||
|
||||
class StageDataDisplayRewards(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
dropType: int
|
||||
|
||||
|
||||
class StageDataDisplayDetailRewards(BaseStruct):
|
||||
occPercent: int
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
dropType: int
|
||||
|
||||
|
||||
@ -1602,7 +1602,7 @@ class Act25SideDataArchiveItemData(BaseStruct):
|
||||
|
||||
class Act25SideDataArchiveMapInfoData(BaseStruct):
|
||||
objectId: str
|
||||
type_: int = field(name='type')
|
||||
type_: int = field(name="type")
|
||||
numberId: str
|
||||
areaId: str
|
||||
sortId: int
|
||||
@ -1625,7 +1625,7 @@ class Act25SideDataAreaInfoData(BaseStruct):
|
||||
|
||||
|
||||
class Act25SideDataAreaMissionData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
areaId: str
|
||||
preposedMissionId: Union[str, None]
|
||||
sortId: int
|
||||
@ -1714,7 +1714,7 @@ class Act38D1DataAct38D1DimensionItemData(BaseStruct):
|
||||
|
||||
|
||||
class Act38D1DataAct38D1CommentData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
sortId: int
|
||||
desc: str
|
||||
|
||||
@ -1749,7 +1749,7 @@ class Act38D1Data(BaseStruct):
|
||||
|
||||
|
||||
class Act27SideDataAct27SideGoodData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
typeDesc: str
|
||||
iconId: str
|
||||
@ -1868,7 +1868,7 @@ class Act42D0DataEffectGroupInfoData(BaseStruct):
|
||||
|
||||
|
||||
class Act42D0DataEffectInfoRuneData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
points: int
|
||||
mutexGroupKey: Union[str, None]
|
||||
description: str
|
||||
@ -1961,14 +1961,14 @@ class Act29SideFragData(BaseStruct):
|
||||
|
||||
|
||||
class Act29SideOrcheType(Enum):
|
||||
ORCHE_1 = 'ORCHE_1'
|
||||
ORCHE_2 = 'ORCHE_2'
|
||||
ORCHE_3 = 'ORCHE_3'
|
||||
ENUM = 'ENUM'
|
||||
ORCHE_1 = "ORCHE_1"
|
||||
ORCHE_2 = "ORCHE_2"
|
||||
ORCHE_3 = "ORCHE_3"
|
||||
ENUM = "ENUM"
|
||||
|
||||
|
||||
class Act29SideOrcheData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
desc: str
|
||||
icon: str
|
||||
@ -1977,12 +1977,12 @@ class Act29SideOrcheData(BaseStruct):
|
||||
|
||||
|
||||
class Act29SideProductType(Enum):
|
||||
PRODUCT_TYPE_1 = 'PRODUCT_TYPE_1'
|
||||
PRODUCT_TYPE_2 = 'PRODUCT_TYPE_2'
|
||||
PRODUCT_TYPE_3 = 'PRODUCT_TYPE_3'
|
||||
PRODUCT_TYPE_4 = 'PRODUCT_TYPE_4'
|
||||
PRODUCT_TYPE_5 = 'PRODUCT_TYPE_5'
|
||||
ENUM = 'ENUM'
|
||||
PRODUCT_TYPE_1 = "PRODUCT_TYPE_1"
|
||||
PRODUCT_TYPE_2 = "PRODUCT_TYPE_2"
|
||||
PRODUCT_TYPE_3 = "PRODUCT_TYPE_3"
|
||||
PRODUCT_TYPE_4 = "PRODUCT_TYPE_4"
|
||||
PRODUCT_TYPE_5 = "PRODUCT_TYPE_5"
|
||||
ENUM = "ENUM"
|
||||
|
||||
|
||||
class Act29SideProductGroupData(BaseStruct):
|
||||
@ -2012,7 +2012,7 @@ class Act29SideProductGroupData(BaseStruct):
|
||||
|
||||
|
||||
class Act29SideProductData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
orcheId: Union[str, None]
|
||||
groupId: str
|
||||
formId: Union[str, None]
|
||||
@ -2037,9 +2037,9 @@ class Act29SideInvestResultData(BaseStruct):
|
||||
|
||||
|
||||
class Act29SideInvestType(Enum):
|
||||
MAJOR = 'MAJOR'
|
||||
RARE = 'RARE'
|
||||
NORMAL = 'NORMAL'
|
||||
MAJOR = "MAJOR"
|
||||
RARE = "RARE"
|
||||
NORMAL = "NORMAL"
|
||||
|
||||
|
||||
class Act29SideInvestData(BaseStruct):
|
||||
@ -2145,8 +2145,8 @@ class ActivityThemeDataTimeNode(BaseStruct):
|
||||
|
||||
|
||||
class ActivityThemeData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name="id")
|
||||
type_: str = field(name="type")
|
||||
funcId: str
|
||||
endTs: int
|
||||
sortId: int
|
||||
@ -2368,7 +2368,7 @@ class AprilFoolTable(BaseStruct):
|
||||
class CartComponents(BaseStruct):
|
||||
compId: str
|
||||
sortId: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
posList: List[str]
|
||||
posIdDict: Dict[str, List[str]]
|
||||
name: str
|
||||
@ -2608,7 +2608,7 @@ class ActivityTableExtraData(BaseStruct):
|
||||
|
||||
|
||||
class ActivityTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
basicInfo: Dict[str, ActivityTableBasicData]
|
||||
homeActConfig: Dict[str, ActivityTableHomeActivityConfig]
|
||||
|
@ -62,7 +62,7 @@ class BattleVoiceOption(BaseStruct):
|
||||
|
||||
|
||||
class MusicData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
bank: str
|
||||
|
||||
@ -91,7 +91,7 @@ class AudioDataFadeStyle(BaseStruct):
|
||||
|
||||
|
||||
class AudioData(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
bgmBanks: List[BGMBank]
|
||||
soundFXBanks: List[SoundFXBank]
|
||||
|
@ -78,6 +78,6 @@ class BattleEquipData(BaseStruct):
|
||||
|
||||
|
||||
class BattleEquipTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
equips: Dict[str, BattleEquipData]
|
||||
|
@ -6,13 +6,13 @@ from msgspec import field
|
||||
|
||||
|
||||
class BuildingDataRoomUnlockCondCondItem(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
level: int
|
||||
count: int
|
||||
|
||||
|
||||
class BuildingDataRoomUnlockCond(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
number: Dict[str, BuildingDataRoomUnlockCondCondItem]
|
||||
|
||||
|
||||
@ -22,9 +22,9 @@ class GridPosition(BaseStruct):
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class BuildingDataRoomDataBuildCost(BaseStruct):
|
||||
@ -44,7 +44,7 @@ class BuildingDataRoomDataPhaseData(BaseStruct):
|
||||
|
||||
|
||||
class BuildingDataRoomData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
description: Union[str, None]
|
||||
defaultPrefabId: str
|
||||
@ -56,7 +56,7 @@ class BuildingDataRoomData(BaseStruct):
|
||||
|
||||
|
||||
class BuildingDataLayoutDataRoomSlot(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
cleanCostId: str
|
||||
costLabor: int
|
||||
provideLabor: int
|
||||
@ -71,26 +71,26 @@ class BuildingDataLayoutDataSlotCleanCostCountCost(BaseStruct):
|
||||
|
||||
|
||||
class BuildingDataLayoutDataSlotCleanCost(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
number: Dict[str, BuildingDataLayoutDataSlotCleanCostCountCost]
|
||||
|
||||
|
||||
class BuildingDataLayoutDataStoreyData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
yOffset: int
|
||||
unlockControlLevel: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class BuildingDataLayoutData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
slots: Dict[str, BuildingDataLayoutDataRoomSlot]
|
||||
cleanCosts: Dict[str, BuildingDataLayoutDataSlotCleanCost]
|
||||
storeys: Dict[str, BuildingDataLayoutDataStoreyData]
|
||||
|
||||
|
||||
class BuildingDataPrefabInfo(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
blueprintRoomOverrideId: Union[str, None]
|
||||
size: GridPosition
|
||||
floorGridSize: GridPosition
|
||||
@ -98,45 +98,45 @@ class BuildingDataPrefabInfo(BaseStruct):
|
||||
obstacleId: Union[str, None]
|
||||
|
||||
|
||||
class BuildingDataManufactPhase(BaseStruct, tag='BuildingDataManufactPhase'):
|
||||
class BuildingDataManufactPhase(BaseStruct, tag="BuildingDataManufactPhase"):
|
||||
speed: Union[float, int]
|
||||
outputCapacity: int
|
||||
|
||||
|
||||
class BuildingDataShopPhase(BaseStruct, tag='BuildingDataShopPhase'):
|
||||
class BuildingDataShopPhase(BaseStruct, tag="BuildingDataShopPhase"):
|
||||
counterNum: int
|
||||
speed: Union[float, int]
|
||||
moneyCapacity: int
|
||||
|
||||
|
||||
class BuildingDataHirePhase(BaseStruct, tag='BuildingDataHirePhase'):
|
||||
class BuildingDataHirePhase(BaseStruct, tag="BuildingDataHirePhase"):
|
||||
economizeRate: float
|
||||
resSpeed: int
|
||||
refreshTimes: int
|
||||
|
||||
|
||||
class BuildingDataDormPhase(BaseStruct, tag='BuildingDataDormPhase'):
|
||||
class BuildingDataDormPhase(BaseStruct, tag="BuildingDataDormPhase"):
|
||||
manpowerRecover: int
|
||||
decorationLimit: int
|
||||
|
||||
|
||||
class BuildingDataMeetingPhase(BaseStruct, tag='BuildingDataMeetingPhase'):
|
||||
class BuildingDataMeetingPhase(BaseStruct, tag="BuildingDataMeetingPhase"):
|
||||
friendSlotInc: int
|
||||
maxVisitorNum: int
|
||||
gatheringSpeed: int
|
||||
|
||||
|
||||
class BuildingDataTradingPhase(BaseStruct, tag='BuildingDataTradingPhase'):
|
||||
class BuildingDataTradingPhase(BaseStruct, tag="BuildingDataTradingPhase"):
|
||||
orderSpeed: Union[float, int]
|
||||
orderLimit: int
|
||||
orderRarity: int
|
||||
|
||||
|
||||
class BuildingDataWorkshopPhase(BaseStruct, tag='BuildingDataWorkshopPhase'):
|
||||
class BuildingDataWorkshopPhase(BaseStruct, tag="BuildingDataWorkshopPhase"):
|
||||
manpowerFactor: Union[float, int]
|
||||
|
||||
|
||||
class BuildingDataTrainingPhase(BaseStruct, tag='BuildingDataTrainingPhase'):
|
||||
class BuildingDataTrainingPhase(BaseStruct, tag="BuildingDataTrainingPhase"):
|
||||
specSkillLvlLimit: int
|
||||
|
||||
|
||||
@ -222,11 +222,11 @@ class BuildingDataBuildingBuff(BaseStruct):
|
||||
|
||||
|
||||
class BuildingDataCustomDataFurnitureData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
sortId: int
|
||||
name: str
|
||||
iconId: str
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
subType: str
|
||||
location: str
|
||||
category: str
|
||||
@ -257,11 +257,11 @@ class BuildingDataCustomDataThemeQuickSetupItem(BaseStruct):
|
||||
furnitureId: str
|
||||
pos0: int
|
||||
pos1: int
|
||||
dir_: int = field(name='dir')
|
||||
dir_: int = field(name="dir")
|
||||
|
||||
|
||||
class BuildingDataCustomDataThemeData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
sortId: int
|
||||
name: str
|
||||
themeType: str
|
||||
@ -272,7 +272,7 @@ class BuildingDataCustomDataThemeData(BaseStruct):
|
||||
|
||||
|
||||
class BuildingDataCustomDataGroupData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
sortId: int
|
||||
name: str
|
||||
themeId: str
|
||||
@ -282,14 +282,14 @@ class BuildingDataCustomDataGroupData(BaseStruct):
|
||||
|
||||
|
||||
class BuildingDataCustomDataFurnitureTypeData(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
name: str
|
||||
|
||||
|
||||
class BuildingDataCustomDataFurnitureSubTypeData(BaseStruct):
|
||||
subType: str
|
||||
name: str
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
sortId: int
|
||||
|
||||
|
||||
@ -318,7 +318,9 @@ class BuildingDataCustomDataDiyUISortTemplateListData(BaseStruct):
|
||||
expandState: str
|
||||
defaultTemplateIndex: int
|
||||
defaultTemplateOrder: str
|
||||
templates: List[BuildingDataCustomDataDiyUISortTemplateListDataDiyUISortTemplateData]
|
||||
templates: List[
|
||||
BuildingDataCustomDataDiyUISortTemplateListDataDiyUISortTemplateData
|
||||
]
|
||||
|
||||
|
||||
class BuildingDataCustomData(BaseStruct):
|
||||
@ -421,7 +423,7 @@ class BuildingDataCreditFormula(BaseStruct):
|
||||
|
||||
|
||||
class BuildingData(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
controlSlotId: str
|
||||
meetingSlotId: str
|
||||
|
@ -6,9 +6,9 @@ from msgspec import field
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class CampaignDataBreakRewardLadder(BaseStruct):
|
||||
@ -18,16 +18,16 @@ class CampaignDataBreakRewardLadder(BaseStruct):
|
||||
|
||||
|
||||
class WeightItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name="id")
|
||||
type_: str = field(name="type")
|
||||
dropType: str
|
||||
count: int
|
||||
weight: int
|
||||
|
||||
|
||||
class StageDataDisplayRewards_(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
dropType: int
|
||||
|
||||
|
||||
@ -58,15 +58,15 @@ class CampaignDataGainLadder(BaseStruct):
|
||||
|
||||
|
||||
class StageDataDisplayRewards(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
dropType: int
|
||||
|
||||
|
||||
class StageDataDisplayDetailRewards(BaseStruct):
|
||||
occPercent: int
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
dropType: int
|
||||
|
||||
|
||||
@ -93,19 +93,19 @@ class CampaignGroupData(BaseStruct):
|
||||
|
||||
|
||||
class CampaignRegionData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
isUnknwon: int
|
||||
|
||||
|
||||
class CampaignZoneData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
regionId: str
|
||||
templateId: str
|
||||
|
||||
|
||||
class CampaignMissionData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
sortId: int
|
||||
param: List[str]
|
||||
description: str
|
||||
@ -145,7 +145,7 @@ class CampaignTrainingAllOpenTimeData(BaseStruct):
|
||||
|
||||
|
||||
class CampaignTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
campaigns: Dict[str, CampaignData]
|
||||
campaignGroups: Dict[str, CampaignGroupData]
|
||||
|
@ -15,6 +15,6 @@ class ChapterData(BaseStruct):
|
||||
|
||||
|
||||
class ChapterTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
chapters: Dict[str, ChapterData]
|
||||
|
@ -6,9 +6,9 @@ from msgspec import field
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class SpCharMissionData(BaseStruct):
|
||||
@ -21,7 +21,7 @@ class SpCharMissionData(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]]
|
||||
spCharMissions: Dict[str, Dict[str, SpCharMissionData]]
|
||||
|
@ -37,7 +37,7 @@ class CharacterDataTraitDataBundle(BaseStruct):
|
||||
class AttributesData(BaseStruct):
|
||||
maxHp: int
|
||||
atk: int
|
||||
def_: int = field(name='def')
|
||||
def_: int = field(name="def")
|
||||
magicResistance: float
|
||||
cost: int
|
||||
blockCnt: int
|
||||
@ -66,9 +66,9 @@ class CharacterDataAttributesKeyFrame(BaseStruct):
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class CharacterDataPhaseData(BaseStruct):
|
||||
@ -130,7 +130,7 @@ class ExternalBuff(BaseStruct):
|
||||
|
||||
|
||||
class CharacterDataPotentialRank(BaseStruct):
|
||||
type_: int = field(name='type')
|
||||
type_: int = field(name="type")
|
||||
description: str
|
||||
buff: Union[ExternalBuff, None]
|
||||
equivalentCost: Union[ItemBundle, None]
|
||||
@ -192,7 +192,7 @@ class CharPatchDataPatchDetailInfo(BaseStruct):
|
||||
|
||||
|
||||
class CharPatchTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
infos: Dict[str, CharPatchDataPatchInfo]
|
||||
patchChars: Dict[str, CharacterData]
|
||||
|
@ -33,7 +33,7 @@ class CharacterDataTraitDataBundle(BaseStruct):
|
||||
class AttributesData(BaseStruct):
|
||||
maxHp: int
|
||||
atk: int
|
||||
def_: int = field(name='def')
|
||||
def_: int = field(name="def")
|
||||
magicResistance: float
|
||||
cost: int
|
||||
blockCnt: int
|
||||
@ -62,9 +62,9 @@ class CharacterDataAttributesKeyFrame(BaseStruct):
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class CharacterDataPhaseData(BaseStruct):
|
||||
@ -127,7 +127,7 @@ class ExternalBuff(BaseStruct):
|
||||
|
||||
|
||||
class CharacterDataPotentialRank(BaseStruct):
|
||||
type_: int = field(name='type')
|
||||
type_: int = field(name="type")
|
||||
description: str
|
||||
buff: Union[ExternalBuff, None]
|
||||
equivalentCost: Union[ItemBundle, None]
|
||||
@ -176,7 +176,7 @@ class CharacterData(BaseStruct):
|
||||
|
||||
|
||||
class CharacterTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
chars: Dict[str, CharacterData]
|
||||
|
||||
|
@ -34,7 +34,7 @@ class RuneData(BaseStruct):
|
||||
|
||||
|
||||
class RuneTablePackedRuneData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
points: float
|
||||
mutexGroupKey: Union[str, None]
|
||||
description: str
|
||||
@ -42,7 +42,7 @@ class RuneTablePackedRuneData(BaseStruct):
|
||||
|
||||
|
||||
class CharmItemData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
sort: int
|
||||
name: str
|
||||
icon: str
|
||||
@ -61,6 +61,6 @@ class CharmItemData(BaseStruct):
|
||||
|
||||
|
||||
class CharmTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
charmList: List[CharmItemData]
|
||||
|
@ -36,7 +36,7 @@ class VoiceLangInfoData(BaseStruct):
|
||||
class VoiceLangData(BaseStruct):
|
||||
wordkeys: List[str]
|
||||
charId: str
|
||||
dict_: Dict[str, VoiceLangInfoData] = field(name='dict')
|
||||
dict_: Dict[str, VoiceLangInfoData] = field(name="dict")
|
||||
|
||||
|
||||
class VoiceLangTypeData(BaseStruct):
|
||||
@ -55,7 +55,7 @@ class NewVoiceTimeData(BaseStruct):
|
||||
|
||||
|
||||
class CharwordTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
charWords: Dict[str, CharWordData]
|
||||
voiceLangDict: Dict[str, VoiceLangData]
|
||||
|
@ -6,9 +6,9 @@ from msgspec import field
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class MonthlySignInData(BaseStruct):
|
||||
@ -36,7 +36,7 @@ class MonthlyDailyBonusGroup(BaseStruct):
|
||||
|
||||
|
||||
class CheckinTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
groups: Dict[str, MonthlySignInGroupData]
|
||||
monthlySubItem: Dict[str, List[MonthlyDailyBonusGroup]]
|
||||
|
@ -6,9 +6,9 @@ from msgspec import field
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class ClimbTowerSingleTowerDataClimbTowerTaskRewardData(BaseStruct):
|
||||
@ -17,7 +17,7 @@ class ClimbTowerSingleTowerDataClimbTowerTaskRewardData(BaseStruct):
|
||||
|
||||
|
||||
class ClimbTowerSingleTowerData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
sortId: int
|
||||
stageNum: int
|
||||
name: str
|
||||
@ -42,29 +42,29 @@ class ClimbTowerSingleTowerData(BaseStruct):
|
||||
|
||||
|
||||
class WeightItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name="id")
|
||||
type_: str = field(name="type")
|
||||
dropType: str
|
||||
count: int
|
||||
weight: int
|
||||
|
||||
|
||||
class StageDataDisplayRewards(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
dropType: int
|
||||
|
||||
|
||||
class StageDataDisplayDetailRewards(BaseStruct):
|
||||
occPercent: int
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
dropType: int
|
||||
|
||||
|
||||
class ClimbTowerDropDisplayInfo(BaseStruct):
|
||||
itemId: str
|
||||
type_: int = field(name='type')
|
||||
type_: int = field(name="type")
|
||||
maxCount: int
|
||||
minCount: int
|
||||
|
||||
@ -77,7 +77,7 @@ class ClimbTowerLevelDropInfo(BaseStruct):
|
||||
|
||||
|
||||
class ClimbTowerSingleLevelData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
levelId: str
|
||||
towerId: str
|
||||
layerNum: int
|
||||
@ -90,7 +90,7 @@ class ClimbTowerSingleLevelData(BaseStruct):
|
||||
|
||||
|
||||
class ClimbTowerTacticalBuffData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
desc: str
|
||||
profession: str
|
||||
isDefaultActive: bool
|
||||
@ -127,7 +127,7 @@ class RuneData(BaseStruct):
|
||||
|
||||
|
||||
class RuneTablePackedRuneData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
points: float
|
||||
mutexGroupKey: Union[str, None]
|
||||
description: str
|
||||
@ -135,8 +135,8 @@ class RuneTablePackedRuneData(BaseStruct):
|
||||
|
||||
|
||||
class ClimbTowerMainCardData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name="id")
|
||||
type_: str = field(name="type")
|
||||
linkedTowerId: Union[str, None]
|
||||
sortId: int
|
||||
name: str
|
||||
@ -147,7 +147,7 @@ class ClimbTowerMainCardData(BaseStruct):
|
||||
|
||||
|
||||
class ClimbTowerSubCardData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
mainCardId: str
|
||||
sortId: int
|
||||
name: str
|
||||
@ -157,7 +157,7 @@ class ClimbTowerSubCardData(BaseStruct):
|
||||
|
||||
|
||||
class ClimbTowerCurseCardData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
towerIdList: List[str]
|
||||
name: str
|
||||
desc: str
|
||||
@ -165,7 +165,7 @@ class ClimbTowerCurseCardData(BaseStruct):
|
||||
|
||||
|
||||
class ClimbTowerSeasonInfoData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
startTs: int
|
||||
endTs: int
|
||||
@ -199,16 +199,16 @@ class ClimbTowerRewardInfo(BaseStruct):
|
||||
|
||||
|
||||
class MissionDisplayRewards(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
|
||||
|
||||
class MissionData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
sortId: int
|
||||
description: str
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
itemBgType: str
|
||||
preMissionIds: Union[List[str], None]
|
||||
template: str
|
||||
@ -231,9 +231,9 @@ class ClimbTowerMissionData(MissionData):
|
||||
|
||||
|
||||
class MissionGroup(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
title: Union[str, None]
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
preMissionGroup: Union[str, None]
|
||||
period: Union[List[int], None]
|
||||
rewards: List[MissionDisplayRewards]
|
||||
@ -243,7 +243,7 @@ class MissionGroup(BaseStruct):
|
||||
|
||||
|
||||
class ClimbTowerTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
towers: Dict[str, ClimbTowerSingleTowerData]
|
||||
levels: Dict[str, ClimbTowerSingleLevelData]
|
||||
|
@ -21,7 +21,7 @@ class MeetingClueDataReceiveTimeBonus(BaseStruct):
|
||||
|
||||
|
||||
class ClueData(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
clues: List[MeetingClueDataClueData]
|
||||
clueTypes: List[MeetingClueDataClueTypeData]
|
||||
|
@ -6,9 +6,9 @@ from msgspec import field
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class StringKeyFrames(BaseStruct):
|
||||
@ -34,7 +34,7 @@ class CrisisMapRankInfo(BaseStruct):
|
||||
|
||||
|
||||
class CrisisTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
seasonInfo: List[CrisisClientDataSeasonInfo]
|
||||
meta: str
|
||||
|
@ -7,9 +7,9 @@ from msgspec import field
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class StringKeyFrames(BaseStruct):
|
||||
@ -31,13 +31,13 @@ class CrisisV2ConstData(BaseStruct):
|
||||
|
||||
|
||||
class appraiseType(Enum):
|
||||
RANK_D = 'RANK_D'
|
||||
RANK_C = 'RANK_C'
|
||||
RANK_B = 'RANK_B'
|
||||
RANK_A = 'RANK_A'
|
||||
RANK_S = 'RANK_S'
|
||||
RANK_SS = 'RANK_SS'
|
||||
RANK_SSS = 'RANK_SSS'
|
||||
RANK_D = "RANK_D"
|
||||
RANK_C = "RANK_C"
|
||||
RANK_B = "RANK_B"
|
||||
RANK_A = "RANK_A"
|
||||
RANK_S = "RANK_S"
|
||||
RANK_SS = "RANK_SS"
|
||||
RANK_SSS = "RANK_SSS"
|
||||
|
||||
|
||||
class CrisisV2ScoreLevelToAppraiseData(BaseStruct):
|
||||
@ -45,7 +45,7 @@ class CrisisV2ScoreLevelToAppraiseData(BaseStruct):
|
||||
|
||||
|
||||
class CrisisV2Table(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
seasonInfoDataMap: Dict
|
||||
scoreLevelToAppraiseDataMap: Dict[str, CrisisV2ScoreLevelToAppraiseData]
|
||||
|
@ -42,8 +42,8 @@ class HomeBackgroundSingleData(BaseStruct):
|
||||
|
||||
|
||||
class HomeBackgroundThemeData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name="id")
|
||||
type_: str = field(name="type")
|
||||
sortId: int
|
||||
startTime: int
|
||||
tmName: str
|
||||
@ -62,7 +62,7 @@ class ThemeLimitInfo(BaseStruct):
|
||||
|
||||
|
||||
class HomeBackgroundThemeLimitData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
limitInfos: List[ThemeLimitInfo]
|
||||
|
||||
|
||||
@ -75,6 +75,7 @@ class HomeBackgroundData(BaseStruct):
|
||||
defaultBgMusicId: str
|
||||
themeStartTime: int
|
||||
|
||||
|
||||
# class
|
||||
|
||||
# class NameCardV2Data(BaseStruct):
|
||||
@ -85,7 +86,7 @@ class HomeBackgroundData(BaseStruct):
|
||||
|
||||
|
||||
class DisplayMetaTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
playerAvatarData: PlayerAvatarData
|
||||
homeBackgroundData: HomeBackgroundData
|
||||
|
@ -31,14 +31,14 @@ class EnemyHandBookData(BaseStruct):
|
||||
|
||||
|
||||
class EnemyHandbookLevelInfoDataRangePair(BaseStruct):
|
||||
min_: float = field(name='min')
|
||||
max_: float = field(name='max')
|
||||
min_: float = field(name="min")
|
||||
max_: float = field(name="max")
|
||||
|
||||
|
||||
class EnemyHandbookLevelInfoData(BaseStruct):
|
||||
classLevel: str
|
||||
attack: EnemyHandbookLevelInfoDataRangePair
|
||||
def_: EnemyHandbookLevelInfoDataRangePair = field(name='def')
|
||||
def_: EnemyHandbookLevelInfoDataRangePair = field(name="def")
|
||||
magicRes: EnemyHandbookLevelInfoDataRangePair
|
||||
maxHP: EnemyHandbookLevelInfoDataRangePair
|
||||
moveSpeed: EnemyHandbookLevelInfoDataRangePair
|
||||
@ -48,13 +48,13 @@ class EnemyHandbookLevelInfoData(BaseStruct):
|
||||
|
||||
|
||||
class EnemyHandbookRaceData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
raceName: str
|
||||
sortId: int
|
||||
|
||||
|
||||
class EnemyHandbookTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
levelInfoList: List[EnemyHandbookLevelInfoData]
|
||||
enemyData: Dict[str, EnemyHandBookData]
|
||||
|
@ -15,7 +15,7 @@ class FavorDataFrames(BaseStruct):
|
||||
|
||||
|
||||
class FavorTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
maxFavor: int
|
||||
favorFrames: List[FavorDataFrames]
|
||||
|
@ -32,9 +32,9 @@ class GachaDataCarouselData(BaseStruct):
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class GachaDataRecruitRange(BaseStruct):
|
||||
@ -131,7 +131,7 @@ class GachaDataFesGachaPoolRelateItem(BaseStruct):
|
||||
|
||||
|
||||
class GachaTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
gachaTags: List[GachaTag]
|
||||
carousel: List[GachaDataCarouselData]
|
||||
|
@ -6,9 +6,9 @@ from msgspec import field
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class GameDataConstsCharAssistRefreshTimeState(BaseStruct):
|
||||
@ -23,7 +23,7 @@ class TermDescriptionData(BaseStruct):
|
||||
|
||||
|
||||
class GamedataConst(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
addedRewardDisplayZone: str
|
||||
advancedGachaCrystalCost: int
|
||||
|
@ -13,9 +13,9 @@ class HandbookUnlockParam(BaseStruct):
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class HandbookStageTimeData(BaseStruct):
|
||||
@ -43,11 +43,11 @@ class HandbookStoryStageData(BaseStruct):
|
||||
class HandbookDisplayCondition(BaseStruct):
|
||||
charId: str
|
||||
conditionCharId: str
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class HandbookTeamMission(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
sort: int
|
||||
powerId: str
|
||||
powerName: str
|
||||
@ -122,7 +122,7 @@ class HandbookInfoData(BaseStruct):
|
||||
|
||||
|
||||
class HandbookInfoTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
handbookDict: Dict[str, HandbookInfoData]
|
||||
npcDict: Dict[str, NPCData]
|
||||
|
@ -40,6 +40,6 @@ class CharHandbook(BaseStruct):
|
||||
|
||||
|
||||
class HandbookTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
char_102_texas: CharHandbook
|
||||
|
@ -15,6 +15,6 @@ class HandbookTeam(BaseStruct):
|
||||
|
||||
|
||||
class HandbookTeamTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
team: Dict[str, HandbookTeam]
|
||||
|
@ -1,4 +1,4 @@
|
||||
from typing import Dict, List, Union
|
||||
from typing import ClassVar, Dict, List, Union
|
||||
|
||||
from ..common import BaseStruct
|
||||
|
||||
@ -16,9 +16,9 @@ class ItemDataBuildingProductInfo(BaseStruct):
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class FavorCharacterInfo(BaseStruct):
|
||||
@ -47,13 +47,13 @@ class UniCollectionInfo(BaseStruct):
|
||||
|
||||
|
||||
class ApSupplyFeature(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
ap: int
|
||||
hasTs: bool
|
||||
|
||||
|
||||
class ExpItemFeature(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
gainExp: int
|
||||
|
||||
|
||||
@ -70,9 +70,9 @@ class ItemData(BaseStruct):
|
||||
sortId: int
|
||||
classifyType: str
|
||||
itemType: str
|
||||
stageDropList: List[Union[ItemDataStageDropInfo, None]] = []
|
||||
buildingProductList: List[Union[ItemDataBuildingProductInfo, None]] = []
|
||||
voucherRelateList: List[Union[ItemDataVoucherRelateInfo, None]] = []
|
||||
stageDropList: ClassVar[List[Union[ItemDataStageDropInfo, None]]] = []
|
||||
buildingProductList: ClassVar[List[Union[ItemDataBuildingProductInfo, None]]] = []
|
||||
voucherRelateList: ClassVar[List[Union[ItemDataVoucherRelateInfo, None]]] = []
|
||||
overrideBkg: Union[str, None] = None
|
||||
usage: Union[str, None] = None
|
||||
description: Union[str, None] = None
|
||||
@ -83,7 +83,7 @@ class ItemData(BaseStruct):
|
||||
|
||||
class CharVoucherItemFeature(BaseStruct):
|
||||
displayType: int
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
|
||||
|
||||
class ServerItemReminderMailData(BaseStruct):
|
||||
@ -98,7 +98,7 @@ class ServerItemReminderInfo(BaseStruct):
|
||||
|
||||
|
||||
class ItemTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
activityPotentialCharacters: Dict[str, ActivityPotentialCharacterInfo]
|
||||
apSupplies: Dict[str, ApSupplyFeature]
|
||||
|
@ -8,13 +8,13 @@ from msgspec import field
|
||||
class MedalExpireTime(BaseStruct):
|
||||
start: int
|
||||
end: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class MedalGroupData(BaseStruct):
|
||||
@ -61,7 +61,7 @@ class MedalPerData(BaseStruct):
|
||||
|
||||
|
||||
class MedalTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
medalList: List[MedalPerData]
|
||||
medalTypeData: Dict[str, MedalTypeData]
|
||||
|
@ -6,8 +6,8 @@ from msgspec import field
|
||||
|
||||
|
||||
class MissionDisplayRewards(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
|
||||
|
||||
@ -28,26 +28,26 @@ class MissionWeeklyRewardConf(BaseStruct):
|
||||
beginTime: int
|
||||
endTime: int
|
||||
groupId: str
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
periodicalPointCost: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
sortIndex: int
|
||||
rewards: List[MissionDisplayRewards]
|
||||
|
||||
|
||||
class MissionDailyRewardConf(BaseStruct):
|
||||
groupId: str
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
periodicalPointCost: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
sortIndex: int
|
||||
rewards: List[MissionDisplayRewards]
|
||||
|
||||
|
||||
class MissionGroup(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
title: Union[str, None]
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
preMissionGroup: Union[str, None]
|
||||
period: Union[List[int], None]
|
||||
rewards: Union[List[MissionDisplayRewards], None]
|
||||
@ -57,10 +57,10 @@ class MissionGroup(BaseStruct):
|
||||
|
||||
|
||||
class MissionData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
sortId: int
|
||||
description: str
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
itemBgType: str
|
||||
preMissionIds: Union[List[str], None]
|
||||
template: str
|
||||
@ -90,7 +90,7 @@ class CrossAppShareMissions(BaseStruct):
|
||||
|
||||
|
||||
class MissionTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
missions: Dict[str, MissionData]
|
||||
missionGroups: Dict[str, MissionGroup]
|
||||
|
@ -6,21 +6,21 @@ from msgspec import field
|
||||
|
||||
|
||||
class RewardItem(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
sortId: int
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
|
||||
|
||||
class MissionDisplayRewards(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
|
||||
|
||||
@ -42,7 +42,7 @@ class ReturnCheckinData(BaseStruct):
|
||||
|
||||
|
||||
class ReturnLongTermTaskData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
sortId: int
|
||||
template: str
|
||||
param: List[str]
|
||||
@ -53,7 +53,7 @@ class ReturnLongTermTaskData(BaseStruct):
|
||||
|
||||
class ReturnDailyTaskData(BaseStruct):
|
||||
groupId: str
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
groupSortId: int
|
||||
taskSortId: int
|
||||
template: str
|
||||
@ -105,10 +105,10 @@ class ChainLoginData(BaseStruct):
|
||||
|
||||
|
||||
class MissionData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
sortId: int
|
||||
description: str
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
itemBgType: str
|
||||
preMissionIds: None
|
||||
template: str
|
||||
@ -126,9 +126,9 @@ class MissionData(BaseStruct):
|
||||
|
||||
|
||||
class MissionGroup(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
title: None
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
preMissionGroup: None
|
||||
period: None
|
||||
rewards: None
|
||||
@ -145,7 +145,7 @@ class OpenServerData(BaseStruct):
|
||||
|
||||
|
||||
class OpenServerScheduleItem(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
startTs: int
|
||||
endTs: int
|
||||
totalCheckinDescption: str
|
||||
@ -269,7 +269,7 @@ class OpenServerNewbieCheckInPackage(BaseStruct):
|
||||
|
||||
|
||||
class OpenServerTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
schedule: List[OpenServerScheduleItem]
|
||||
dataMap: Dict[str, OpenServerData]
|
||||
|
@ -21,7 +21,7 @@ class PlayerAvatarPerData(BaseStruct):
|
||||
|
||||
|
||||
class PlayerAvatarTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
avatarList: List[PlayerAvatarPerData]
|
||||
avatarTypeData: Dict[str, PlayerAvatarGroupData]
|
||||
|
@ -18,13 +18,13 @@ class ObscuredRect(BaseStruct):
|
||||
|
||||
|
||||
class Stage(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
direction: int
|
||||
grids: List[GridPosition]
|
||||
boundingBoxes: Union[List[ObscuredRect], None] = None
|
||||
|
||||
|
||||
class RangeTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
range_: Dict[str, Stage]
|
||||
|
@ -6,9 +6,9 @@ from msgspec import field
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class ReplicateData(BaseStruct):
|
||||
@ -21,6 +21,6 @@ class ReplicateList(BaseStruct):
|
||||
|
||||
|
||||
class ReplicateTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
replicate: Dict[str, ReplicateList]
|
||||
|
@ -6,14 +6,14 @@ from msgspec import field
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class StageDataDisplayRewards(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
dropType: int
|
||||
|
||||
|
||||
@ -32,8 +32,8 @@ class Act17sideDataChoiceNodeOptionData(BaseStruct):
|
||||
|
||||
class StageDataDisplayDetailRewards(BaseStruct):
|
||||
occPercent: int
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
dropType: int
|
||||
CannotGetPercent: Union[float, None] = None
|
||||
GetPercent: Union[float, None] = None
|
||||
@ -69,7 +69,7 @@ class Act17sideDataMainlineChapterData(BaseStruct):
|
||||
chapterDes: str
|
||||
chapterIcon: str
|
||||
unlockDes: str
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
|
||||
|
||||
class RunesSelector(BaseStruct):
|
||||
@ -95,7 +95,7 @@ class TechTreeBranchRunes(BaseStruct):
|
||||
|
||||
|
||||
class BranchRuneData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
points: float
|
||||
mutexGroupKey: None
|
||||
description: str
|
||||
@ -266,7 +266,7 @@ class RuneData(BaseStruct):
|
||||
|
||||
class RuneTablePackedRuneData(BaseStruct):
|
||||
description: str
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
points: float
|
||||
runes: List[RuneData]
|
||||
mutexGroupKey: Union[str, None] = None
|
||||
@ -322,8 +322,8 @@ class RetroTrailRuleData(BaseStruct):
|
||||
class WeightItemBundle(BaseStruct):
|
||||
count: int
|
||||
dropType: str
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name="id")
|
||||
type_: str = field(name="type")
|
||||
weight: int
|
||||
|
||||
|
||||
@ -407,7 +407,7 @@ class RetroTrailData(BaseStruct):
|
||||
|
||||
class RetroActData(BaseStruct):
|
||||
retroId: str
|
||||
type_: int = field(name='type')
|
||||
type_: int = field(name="type")
|
||||
linkedActId: List[str]
|
||||
startTime: int
|
||||
trailStartTime: int
|
||||
@ -436,7 +436,7 @@ class RetroStageOverrideInfo(BaseStruct):
|
||||
|
||||
|
||||
class RetroTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
customData: ActivityCustomData
|
||||
initRetroCoin: int
|
||||
|
@ -28,12 +28,12 @@ class RoguelikeOuterBuff(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeOutBuffData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
buffs: Dict[str, RoguelikeOuterBuff]
|
||||
|
||||
|
||||
class RoguelikeEndingData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
backgroundId: str
|
||||
name: str
|
||||
description: str
|
||||
@ -43,7 +43,7 @@ class RoguelikeEndingData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeModeData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
canUnlockItem: int
|
||||
scoreFactor: float
|
||||
@ -56,24 +56,24 @@ class RoguelikeModeData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeChoiceSceneData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
title: str
|
||||
description: str
|
||||
background: str
|
||||
|
||||
|
||||
class RoguelikeChoiceData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
title: str
|
||||
description: Union[str, None]
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
nextSceneId: Union[str, None]
|
||||
icon: Union[str, None]
|
||||
param: Dict[str, object]
|
||||
|
||||
|
||||
class RoguelikeZoneData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
description: str
|
||||
endingDescription: str
|
||||
@ -82,7 +82,7 @@ class RoguelikeZoneData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeStageData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
linkedStageId: str
|
||||
levelId: str
|
||||
code: str
|
||||
@ -96,12 +96,12 @@ class RoguelikeStageData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeRelicFeature(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
buffs: List[RoguelikeBuff]
|
||||
|
||||
|
||||
class RoguelikeUpgradeTicketFeature(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
profession: int
|
||||
rarity: int
|
||||
professionList: List[str]
|
||||
@ -109,7 +109,7 @@ class RoguelikeUpgradeTicketFeature(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeRecruitTicketFeature(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
profession: int
|
||||
rarity: int
|
||||
professionList: List[str]
|
||||
@ -125,13 +125,13 @@ class RelicStableUnlockParam(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeItemData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
description: Union[str, None]
|
||||
usage: str
|
||||
obtainApproach: str
|
||||
iconId: str
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
rarity: str
|
||||
value: int
|
||||
sortId: int
|
||||
@ -193,7 +193,7 @@ class RoguelikeConstTable(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
constTable: RoguelikeConstTable
|
||||
itemTable: RoguelikeItemTable
|
||||
|
@ -21,7 +21,7 @@ class RoguelikeTopicConfig(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeTopicBasicData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
startTime: int
|
||||
disappearTimeOnMainScreen: int
|
||||
@ -68,7 +68,7 @@ class RoguelikeTopicEnroll(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeTopicBP(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
level: int
|
||||
tokenNum: int
|
||||
nextTokenNum: int
|
||||
@ -88,9 +88,9 @@ class RoguelikeTopicMilestoneUpdateData(BaseStruct):
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class RoguelikeTopicBPGrandPrize(BaseStruct):
|
||||
@ -111,7 +111,7 @@ class RoguelikeTopicBPGrandPrize(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeTopicMonthMission(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
taskName: str
|
||||
taskClass: str
|
||||
innerClassWeight: int
|
||||
@ -122,7 +122,7 @@ class RoguelikeTopicMonthMission(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeTopicMonthSquad(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
teamName: str
|
||||
teamSubName: Union[str, None]
|
||||
teamFlavorDesc: Union[str, None]
|
||||
@ -298,8 +298,8 @@ class ActArchiveBuffData(BaseStruct):
|
||||
|
||||
|
||||
class ActArchiveTotemItemData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
type_: int = field(name='type')
|
||||
id_: str = field(name="id")
|
||||
type_: int = field(name="type")
|
||||
enrollConditionId: Union[str, None]
|
||||
sortId: int
|
||||
|
||||
@ -309,7 +309,7 @@ class ActArchiveTotemData(BaseStruct):
|
||||
|
||||
|
||||
class ActArchiveChaosItemData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
isHidden: bool
|
||||
enrollId: Union[str, None]
|
||||
sortId: int
|
||||
@ -420,7 +420,7 @@ class RoguelikeGameInitData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeGameStageData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
linkedStageId: str
|
||||
levelId: str
|
||||
code: str
|
||||
@ -439,7 +439,7 @@ class RoguelikeGameStageData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeGameZoneData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
clockPerformance: Union[str, None]
|
||||
displayTime: Union[str, None]
|
||||
@ -462,7 +462,7 @@ class RoguelikeGameTrapData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeGameRecruitTicketData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
profession: int
|
||||
rarity: int
|
||||
professionList: List[str]
|
||||
@ -473,7 +473,7 @@ class RoguelikeGameRecruitTicketData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeGameUpgradeTicketData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
profession: int
|
||||
rarity: int
|
||||
professionList: List[str]
|
||||
@ -481,7 +481,7 @@ class RoguelikeGameUpgradeTicketData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeGameCustomTicketData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
subType: str
|
||||
discardText: str
|
||||
|
||||
@ -498,7 +498,7 @@ class RoguelikeBuff(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeGameRelicData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
buffs: List[RoguelikeBuff]
|
||||
|
||||
|
||||
@ -509,13 +509,13 @@ class RoguelikeGameRelicCheckParam(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeGameRelicParamData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
checkCharBoxTypes: List[str]
|
||||
checkCharBoxParams: List[RoguelikeGameRelicCheckParam]
|
||||
|
||||
|
||||
class RoguelikeGameRecruitGrpData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
iconId: str
|
||||
name: str
|
||||
desc: str
|
||||
@ -523,7 +523,7 @@ class RoguelikeGameRecruitGrpData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeChoiceDisplayData(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
funcIconId: Union[str, None]
|
||||
itemId: Union[str, None]
|
||||
taskId: Union[str, None]
|
||||
@ -533,11 +533,11 @@ class RoguelikeChoiceDisplayData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeGameChoiceData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
title: str
|
||||
description: Union[str, None]
|
||||
lockedCoverDesc: Union[str, None]
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
leftDecoType: str
|
||||
nextSceneId: Union[str, None]
|
||||
icon: Union[str, None]
|
||||
@ -546,7 +546,7 @@ class RoguelikeGameChoiceData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeGameChoiceSceneData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
title: str
|
||||
description: str
|
||||
background: Union[str, None]
|
||||
@ -569,8 +569,8 @@ class RoguelikeGameNodeSubTypeData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeGameVariationData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name="id")
|
||||
type_: str = field(name="type")
|
||||
outerName: str
|
||||
innerName: str
|
||||
functionDesc: str
|
||||
@ -580,7 +580,7 @@ class RoguelikeGameVariationData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeGameCharBuffData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
iconId: str
|
||||
outerName: str
|
||||
innerName: str
|
||||
@ -590,7 +590,7 @@ class RoguelikeGameCharBuffData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeGameSquadBuffData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
iconId: str
|
||||
outerName: str
|
||||
innerName: str
|
||||
@ -672,7 +672,7 @@ class RoguelikeGameEndingDataLevelIcon(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeGameEndingData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
familyId: int
|
||||
name: str
|
||||
desc: str
|
||||
@ -694,13 +694,13 @@ class TipData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeGameItemData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
description: Union[str, None]
|
||||
usage: str
|
||||
obtainApproach: str
|
||||
iconId: str
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
subType: str
|
||||
rarity: str
|
||||
value: int
|
||||
@ -804,7 +804,7 @@ class RoguelikeTopicDetail(BaseStruct):
|
||||
]
|
||||
styleConfig: Dict[str, RoguelikePredefinedStyleData]
|
||||
exploreTools: Union[Dict[str, RoguelikeGameExploreToolData], None] = None
|
||||
styles: Union[Dict[str, RoguelikePredefinedStyleData], None] = {}
|
||||
styles: Union[Dict[str, RoguelikePredefinedStyleData], None] = None
|
||||
|
||||
|
||||
class RoguelikeModuleBaseData(BaseStruct):
|
||||
@ -970,7 +970,7 @@ class RoguelikeVisionData(BaseStruct):
|
||||
|
||||
class RoguelikeVisionModuleDataVisionChoiceConfig(BaseStruct):
|
||||
value: int
|
||||
type_: int = field(name='type')
|
||||
type_: int = field(name="type")
|
||||
|
||||
|
||||
class RoguelikeVisionModuleConsts(BaseStruct):
|
||||
@ -1236,7 +1236,7 @@ class RoguelikeTopicCustomizeData(BaseStruct):
|
||||
|
||||
|
||||
class RoguelikeTopicTable(BaseStruct):
|
||||
__version__ = '23-12-02-09-28-50-918524'
|
||||
__version__ = "23-12-02-09-28-50-918524"
|
||||
|
||||
topics: Dict[str, RoguelikeTopicBasicData]
|
||||
constant: RoguelikeTopicConst
|
||||
|
@ -873,7 +873,7 @@ class SandboxPermItemData(BaseStruct):
|
||||
|
||||
|
||||
class SandboxPermTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
basicInfo: Dict[str, SandboxPermBasicData]
|
||||
detail: SandboxPermDetailData
|
||||
|
@ -240,7 +240,7 @@ class SandboxEventData(BaseStruct):
|
||||
|
||||
class SandboxEventSceneData(BaseStruct):
|
||||
choiceSceneId: str
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
title: str
|
||||
description: str
|
||||
choices: List[str]
|
||||
@ -248,7 +248,7 @@ class SandboxEventSceneData(BaseStruct):
|
||||
|
||||
class SandboxEventChoiceData(BaseStruct):
|
||||
choiceId: str
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
costAction: int
|
||||
finishScene: bool
|
||||
title: str
|
||||
@ -272,12 +272,12 @@ class SandboxMissionData(BaseStruct):
|
||||
|
||||
|
||||
class SandboxUnitData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
|
||||
|
||||
class SandboxDailyDescTemplateData(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
templateDesc: List[str]
|
||||
|
||||
|
||||
@ -296,7 +296,7 @@ class RushEnemyGroupConfig(BaseStruct):
|
||||
|
||||
|
||||
class RushEnemyGroupRushEnemyDBRef(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
level: int
|
||||
|
||||
|
||||
@ -331,7 +331,7 @@ class RuneData(BaseStruct):
|
||||
|
||||
|
||||
class RuneTablePackedRuneData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
points: Union[int, float]
|
||||
mutexGroupKey: Union[str, None]
|
||||
description: str
|
||||
@ -398,7 +398,7 @@ class SandboxItemData(BaseStruct):
|
||||
|
||||
|
||||
class SandboxTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
sandboxActTables: Dict[str, SandboxActTable]
|
||||
itemDatas: Dict[str, SandboxItemData]
|
||||
|
@ -20,7 +20,7 @@ class ShopRecommendGroup(BaseStruct):
|
||||
|
||||
|
||||
class ShopKeeperWord(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
text: str
|
||||
|
||||
|
||||
@ -92,7 +92,7 @@ class ShopCreditUnlockItem(BaseStruct):
|
||||
|
||||
|
||||
class ShopCreditUnlockGroup(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
index: str
|
||||
startDateTime: int
|
||||
charDict: List[ShopCreditUnlockItem]
|
||||
@ -145,7 +145,7 @@ class LMTGSShopOverlaySchedule(BaseStruct):
|
||||
|
||||
|
||||
class ShopClientTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
recommendList: List[ShopRecommendItem]
|
||||
creditUnlockGroup: Dict[str, ShopCreditUnlockGroup]
|
||||
|
@ -6,9 +6,9 @@ from msgspec import field
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class SpData(BaseStruct):
|
||||
@ -46,6 +46,6 @@ class SkillDataBundle(BaseStruct):
|
||||
|
||||
|
||||
class SkillTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
skills: Dict[str, SkillDataBundle]
|
||||
|
@ -82,7 +82,7 @@ class SpecialSkinInfo(BaseStruct):
|
||||
|
||||
|
||||
class SkinTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
charSkins: Dict[str, CharSkinData]
|
||||
buildinEvolveMap: Dict[str, Dict[str, str]]
|
||||
|
@ -11,15 +11,15 @@ class StageDataConditionDesc(BaseStruct):
|
||||
|
||||
|
||||
class StageDataDisplayRewards(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
dropType: int
|
||||
|
||||
|
||||
class StageDataDisplayDetailRewards(BaseStruct):
|
||||
occPercent: int
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
dropType: int
|
||||
|
||||
|
||||
@ -44,9 +44,9 @@ class ProgressInfo(BaseStruct):
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class ExtraInfo(BaseStruct):
|
||||
@ -139,7 +139,7 @@ class TileAppendInfo(BaseStruct):
|
||||
|
||||
|
||||
class WeeklyForceOpenTable(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
startTime: int
|
||||
endTime: int
|
||||
forceOpenList: List[str]
|
||||
@ -241,7 +241,7 @@ class ApProtectZoneInfo(BaseStruct):
|
||||
|
||||
|
||||
class StageTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
stages: Dict[str, StageData]
|
||||
runeStageGroups: Dict[str, RuneStageGroupData]
|
||||
|
@ -11,9 +11,9 @@ class MiniActTrialDataRuleData(BaseStruct):
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class MiniActTrialDataMiniActTrialRewardData(BaseStruct):
|
||||
@ -38,23 +38,23 @@ class MiniActTrialData(BaseStruct):
|
||||
|
||||
|
||||
class ActArchiveResDataPicArchiveResItemData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
desc: str
|
||||
assetPath: str
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
subType: Union[str, None]
|
||||
picDescription: str
|
||||
kvId: Union[str, None]
|
||||
|
||||
|
||||
class ActArchiveResDataAudioArchiveResItemData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
desc: str
|
||||
name: str
|
||||
|
||||
|
||||
class ActArchiveResDataAvgArchiveResItemData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
desc: str
|
||||
breifPath: Union[str, None]
|
||||
contentPath: str
|
||||
@ -64,7 +64,7 @@ class ActArchiveResDataAvgArchiveResItemData(BaseStruct):
|
||||
|
||||
|
||||
class ActArchiveResDataStoryArchiveResItemData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
desc: str
|
||||
date: Union[str, None]
|
||||
pic: str
|
||||
@ -86,7 +86,7 @@ class ActArchiveResDataActivityNewsLine(BaseStruct):
|
||||
|
||||
|
||||
class ActArchiveResDataNewsArchiveResItemData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
desc: str
|
||||
newsType: str
|
||||
newsFormat: ActArchiveResDataNewsFormatData
|
||||
@ -229,7 +229,7 @@ class ActArchiveComponentTable(BaseStruct):
|
||||
|
||||
|
||||
class StoryReviewMetaTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
miniActTrialData: MiniActTrialData
|
||||
actArchiveResData: ActArchiveResData
|
||||
|
@ -6,9 +6,9 @@ from msgspec import field
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class StoryDataConditionStageCondition(BaseStruct):
|
||||
@ -40,7 +40,7 @@ class StoryReviewInfoClientData(BaseStruct):
|
||||
|
||||
|
||||
class StoryReviewGroupClientData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
entryType: str
|
||||
actType: str
|
||||
@ -60,6 +60,6 @@ class StoryReviewGroupClientData(BaseStruct):
|
||||
|
||||
|
||||
class StoryReviewTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
storyreviewtable: Dict[str, StoryReviewGroupClientData]
|
||||
|
@ -6,7 +6,7 @@ from msgspec import field
|
||||
|
||||
|
||||
class StoryDataTrigger(BaseStruct):
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
key: Union[str, None]
|
||||
useRegex: bool
|
||||
|
||||
@ -27,13 +27,13 @@ class StoryDataCondition(BaseStruct):
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class StoryData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
needCommit: bool
|
||||
repeatable: bool
|
||||
disabled: bool
|
||||
@ -46,6 +46,6 @@ class StoryData(BaseStruct):
|
||||
|
||||
|
||||
class StoryTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
stories: Dict[str, StoryData]
|
||||
|
@ -27,7 +27,7 @@ class RuneData(BaseStruct):
|
||||
|
||||
|
||||
class PackedRuneData(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
points: float
|
||||
mutexGroupKey: Union[str, None]
|
||||
description: str
|
||||
@ -35,6 +35,6 @@ class PackedRuneData(BaseStruct):
|
||||
|
||||
|
||||
class TechBuffTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
runes: List[PackedRuneData]
|
||||
|
@ -17,7 +17,7 @@ class WorldViewTip(BaseStruct):
|
||||
|
||||
|
||||
class TipTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
tips: List[TipData]
|
||||
worldViewTips: List[WorldViewTip]
|
||||
|
@ -32,7 +32,7 @@ class CharacterDataTraitDataBundle(BaseStruct):
|
||||
class AttributesData(BaseStruct):
|
||||
maxHp: int
|
||||
atk: int
|
||||
def_: int = field(name='def')
|
||||
def_: int = field(name="def")
|
||||
magicResistance: float
|
||||
cost: int
|
||||
blockCnt: int
|
||||
@ -61,9 +61,9 @@ class CharacterDataAttributesKeyFrame(BaseStruct):
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class CharacterDataPhaseData(BaseStruct):
|
||||
@ -124,7 +124,7 @@ class ExternalBuff(BaseStruct):
|
||||
|
||||
|
||||
class CharacterDataPotentialRank(BaseStruct):
|
||||
type_: int = field(name='type')
|
||||
type_: int = field(name="type")
|
||||
description: str
|
||||
buff: Union[ExternalBuff, None]
|
||||
equivalentCost: Union[ItemBundle, None]
|
||||
@ -171,6 +171,6 @@ class TokenCharacterData(BaseStruct):
|
||||
|
||||
|
||||
class TokenTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
tokens: Dict[str, TokenCharacterData]
|
||||
|
@ -6,9 +6,9 @@ from msgspec import field
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class UnlockCondition(BaseStruct):
|
||||
@ -39,7 +39,7 @@ class UniEquipData(BaseStruct):
|
||||
unlockFavorPercent: int
|
||||
missionList: List[str]
|
||||
itemCost: Union[List[ItemBundle], None]
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
traitDescBundle: List[TraitDescBundle]
|
||||
|
||||
|
||||
@ -59,7 +59,7 @@ class SubProfessionData(BaseStruct):
|
||||
|
||||
|
||||
class UniequipData(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
equipDict: Dict[str, UniEquipData]
|
||||
missionList: Dict[str, UniEquipMissionData]
|
||||
|
@ -6,9 +6,9 @@ from msgspec import field
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class UniEquipData(BaseStruct):
|
||||
@ -29,7 +29,7 @@ class UniEquipData(BaseStruct):
|
||||
unlockFavorPoint: int
|
||||
missionList: List[str]
|
||||
itemCost: Union[Dict[str, List[ItemBundle]], None]
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
uniEquipGetTime: int
|
||||
charEquipOrder: int
|
||||
|
||||
@ -61,7 +61,7 @@ class UniEquipTimeInfo(BaseStruct):
|
||||
|
||||
|
||||
class UniEquipTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
equipDict: Dict[str, UniEquipData]
|
||||
missionList: Dict[str, UniEquipMissionData]
|
||||
|
@ -8,7 +8,7 @@ from msgspec import field
|
||||
class ZoneData(BaseStruct):
|
||||
zoneID: str
|
||||
zoneIndex: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
zoneNameFirst: Union[str, None]
|
||||
zoneNameSecond: Union[str, None]
|
||||
zoneNameTitleCurrent: Union[str, None]
|
||||
@ -21,7 +21,7 @@ class ZoneData(BaseStruct):
|
||||
|
||||
class WeeklyZoneData(BaseStruct):
|
||||
daysOfWeek: List[int]
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class ZoneValidInfo(BaseStruct):
|
||||
@ -47,9 +47,9 @@ class MainlineZoneData(BaseStruct):
|
||||
|
||||
|
||||
class ItemBundle(BaseStruct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class RecordRewardInfo(BaseStruct):
|
||||
@ -101,7 +101,7 @@ class ZoneMetaData(BaseStruct):
|
||||
|
||||
|
||||
class ZoneTable(BaseStruct):
|
||||
__version__ = '24-02-02-10-18-07-831ad8'
|
||||
__version__ = "24-02-02-10-18-07-831ad8"
|
||||
|
||||
zones: Dict[str, ZoneData]
|
||||
weeklyAdditionInfo: Dict[str, WeeklyZoneData]
|
||||
|
@ -6,8 +6,8 @@ from msgspec import Struct, field
|
||||
# ArknightsAttendanceCalendar Start
|
||||
################
|
||||
class ArknightsAttendanceAwardResource(Struct):
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name="id")
|
||||
type_: str = field(name="type")
|
||||
name: str
|
||||
rarity: int
|
||||
|
||||
@ -15,13 +15,13 @@ class ArknightsAttendanceAwardResource(Struct):
|
||||
class ArknightsAttendanceRecord(Struct):
|
||||
ts: str
|
||||
resourceId: str
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
count: int
|
||||
|
||||
|
||||
class ArknightsAttendanceCalendar(Struct):
|
||||
resourceId: str
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
count: int
|
||||
available: bool
|
||||
done: bool
|
||||
@ -40,7 +40,7 @@ class ArknightsAttendanceCalendarModel(Struct):
|
||||
class ArknightsAttendanceAward(Struct):
|
||||
resource: ArknightsAttendanceAwardResource
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class ArknightsAttendanceModel(Struct):
|
||||
@ -69,7 +69,7 @@ class UserMeModerator(Struct):
|
||||
|
||||
class UserGameStatusAp(Struct):
|
||||
current: int
|
||||
max_: int = field(name='max')
|
||||
max_: int = field(name="max")
|
||||
lastApAddTime: int
|
||||
completeRecoveryTime: int
|
||||
|
||||
@ -80,8 +80,8 @@ class UserGameStatusSecretary(Struct):
|
||||
|
||||
|
||||
class UserGameStatusAvatar(Struct):
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
|
||||
|
||||
class UserGameStatus(Struct):
|
||||
@ -113,7 +113,7 @@ class UserMeInfoRts(Struct):
|
||||
|
||||
|
||||
class UserMeInfo(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
nickname: str
|
||||
profile: str
|
||||
avatarCode: int
|
||||
@ -152,7 +152,7 @@ class ArknightsUserMeModel(Struct, omit_defaults=True):
|
||||
|
||||
|
||||
class PlayerManufactureFormulaInfo(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
itemId: str
|
||||
count: int
|
||||
weight: int
|
||||
@ -161,7 +161,7 @@ class PlayerManufactureFormulaInfo(Struct):
|
||||
|
||||
|
||||
class PlayerEquipmentInfo(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
typeIcon: str
|
||||
shiningColor: str
|
||||
@ -170,7 +170,7 @@ class PlayerEquipmentInfo(Struct):
|
||||
|
||||
|
||||
class PlayerCampaignZoneInfo(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
|
||||
|
||||
@ -179,19 +179,19 @@ class PlayerMedalInfo(Struct):
|
||||
|
||||
|
||||
class PlayerCampaignInfo(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
campaignZoneId: str
|
||||
|
||||
|
||||
class PlayerRogueInfo(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
sort: int
|
||||
|
||||
|
||||
class PlayerTowerInfo(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
subName: str
|
||||
hasHard: Union[bool, None] = None
|
||||
@ -199,28 +199,28 @@ class PlayerTowerInfo(Struct):
|
||||
|
||||
|
||||
class PlayerZoneInfo(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
|
||||
|
||||
class PlayerActivityInfo(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
startTime: int
|
||||
endTime: int
|
||||
rewardEndTime: int
|
||||
isReplicate: bool
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class PlayerStageInfo(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
code: str
|
||||
name: str
|
||||
|
||||
|
||||
class PlayerSkinInfo(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
brandId: str
|
||||
sortId: int
|
||||
displayTagId: str
|
||||
@ -235,7 +235,7 @@ class PlayerSkinInfo(Struct):
|
||||
|
||||
|
||||
class PlayerCharInfo(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
name: str
|
||||
nationId: str
|
||||
groupId: str
|
||||
@ -262,7 +262,7 @@ class PlayerActivity(Struct):
|
||||
actId: str
|
||||
actReplicaId: str
|
||||
zones: List[ActivityZone]
|
||||
type_: Union[str, None] = field(name='type', default=None)
|
||||
type_: Union[str, None] = field(name="type", default=None)
|
||||
|
||||
|
||||
class RewoardItem(Struct):
|
||||
@ -451,14 +451,14 @@ class BuildingDormitories(Struct):
|
||||
|
||||
|
||||
class BuildingStockDelivery(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
count: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
|
||||
|
||||
class BuildingStock(Struct):
|
||||
instId: int
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
delivery: List[BuildingStockDelivery]
|
||||
gain: BuildingStockDelivery
|
||||
isViolated: bool
|
||||
@ -522,17 +522,17 @@ class PlayerBuilding(Struct):
|
||||
|
||||
|
||||
class PlayerInfoSkin(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
ts: int
|
||||
|
||||
|
||||
class PlayerInfoCharSkill(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
specializeLevel: int
|
||||
|
||||
|
||||
class PlayerInfoCharEquip(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
level: int
|
||||
|
||||
|
||||
@ -552,7 +552,7 @@ class PlayerInfoChar(Struct):
|
||||
|
||||
|
||||
class PlayerAssistCharEquip(Struct):
|
||||
id_: str = field(name='id')
|
||||
id_: str = field(name="id")
|
||||
level: int
|
||||
|
||||
|
||||
@ -569,7 +569,7 @@ class PlayerAssistChar(Struct):
|
||||
|
||||
|
||||
class PlayerMedal(Struct):
|
||||
type_: str = field(name='type')
|
||||
type_: str = field(name="type")
|
||||
template: str
|
||||
templateMedalList: List[str]
|
||||
customMedalLayout: List[Union[str, None]]
|
||||
@ -589,8 +589,8 @@ class PlayerStatusSecretary(Struct):
|
||||
|
||||
|
||||
class PlayerStatusAvatar(Struct):
|
||||
type_: str = field(name='type')
|
||||
id_: str = field(name='id')
|
||||
type_: str = field(name="type")
|
||||
id_: str = field(name="id")
|
||||
|
||||
|
||||
class PlayerStatus(Struct):
|
||||
|
@ -2,26 +2,26 @@ import sys
|
||||
|
||||
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))
|
||||
|
||||
CU_BG_PATH = MAIN_PATH / 'bg'
|
||||
CONFIG_PATH = MAIN_PATH / 'config.json'
|
||||
PLAYER_PATH = MAIN_PATH / 'players'
|
||||
RESOURCE_PATH = MAIN_PATH / 'resource'
|
||||
CU_BG_PATH = MAIN_PATH / "bg"
|
||||
CONFIG_PATH = MAIN_PATH / "config.json"
|
||||
PLAYER_PATH = MAIN_PATH / "players"
|
||||
RESOURCE_PATH = MAIN_PATH / "resource"
|
||||
|
||||
|
||||
GAMEDATA_PATH = RESOURCE_PATH / 'gamedata'
|
||||
GAMEDATA_PATH = RESOURCE_PATH / "gamedata"
|
||||
|
||||
CHAR_AVATAR_PATH = RESOURCE_PATH / 'char_avatar'
|
||||
CHARARTS_PATH = RESOURCE_PATH / 'chararts'
|
||||
MEDAL_DIY_FRAME_BKG_PATH = RESOURCE_PATH / 'medal_diy_frame_bkg'
|
||||
MEDAL_ICONS_PATH = RESOURCE_PATH / 'medal_icons'
|
||||
PLAYER_AVATAR_LIST = RESOURCE_PATH / 'player_avatar_list'
|
||||
SKILL_ICONS_PATH = RESOURCE_PATH / 'skill_icons'
|
||||
SKINPACK_PATH = RESOURCE_PATH / 'skinpack'
|
||||
SUB_PROFESSION_ICON_PATH = RESOURCE_PATH / 'sub_profession_icon'
|
||||
TEAM_ICON_PATH = RESOURCE_PATH / 'team_icon'
|
||||
CHAR_AVATAR_PATH = RESOURCE_PATH / "char_avatar"
|
||||
CHARARTS_PATH = RESOURCE_PATH / "chararts"
|
||||
MEDAL_DIY_FRAME_BKG_PATH = RESOURCE_PATH / "medal_diy_frame_bkg"
|
||||
MEDAL_ICONS_PATH = RESOURCE_PATH / "medal_icons"
|
||||
PLAYER_AVATAR_LIST = RESOURCE_PATH / "player_avatar_list"
|
||||
SKILL_ICONS_PATH = RESOURCE_PATH / "skill_icons"
|
||||
SKINPACK_PATH = RESOURCE_PATH / "skinpack"
|
||||
SUB_PROFESSION_ICON_PATH = RESOURCE_PATH / "sub_profession_icon"
|
||||
TEAM_ICON_PATH = RESOURCE_PATH / "team_icon"
|
||||
|
||||
|
||||
def init_dir():
|
||||
|
@ -7,5 +7,5 @@ async def download_all_resource():
|
||||
ret = await asyncio.gather(download_all_file_from_cos())
|
||||
ret = [str(x) for x in ret if x]
|
||||
if ret:
|
||||
return '\n'.join(ret)
|
||||
return 'arknights全部资源下载完成!'
|
||||
return "\n".join(ret)
|
||||
return "arknights全部资源下载完成!"
|
||||
|
@ -16,17 +16,17 @@ from .RESOURCE_PATH import (
|
||||
|
||||
async def download_all_file_from_cos():
|
||||
await download_all_file(
|
||||
'ArknightsUID',
|
||||
"ArknightsUID",
|
||||
{
|
||||
'resource/gamedata': GAMEDATA_PATH,
|
||||
'resource/char_avatar': CHAR_AVATAR_PATH,
|
||||
'resource/chararts': CHARARTS_PATH,
|
||||
'resource/medal_diy_frame_bkg': MEDAL_DIY_FRAME_BKG_PATH,
|
||||
'resource/medal_icons': MEDAL_ICONS_PATH,
|
||||
'resource/player_avatar_list': PLAYER_AVATAR_LIST,
|
||||
'resource/skill_icons': SKILL_ICONS_PATH,
|
||||
'resource/skinpack': SKINPACK_PATH,
|
||||
'resource/sub_profession_icon': SUB_PROFESSION_ICON_PATH,
|
||||
'resource/team_icon': TEAM_ICON_PATH,
|
||||
"resource/gamedata": GAMEDATA_PATH,
|
||||
"resource/char_avatar": CHAR_AVATAR_PATH,
|
||||
"resource/chararts": CHARARTS_PATH,
|
||||
"resource/medal_diy_frame_bkg": MEDAL_DIY_FRAME_BKG_PATH,
|
||||
"resource/medal_icons": MEDAL_ICONS_PATH,
|
||||
"resource/player_avatar_list": PLAYER_AVATAR_LIST,
|
||||
"resource/skill_icons": SKILL_ICONS_PATH,
|
||||
"resource/skinpack": SKINPACK_PATH,
|
||||
"resource/sub_profession_icon": SUB_PROFESSION_ICON_PATH,
|
||||
"resource/team_icon": TEAM_ICON_PATH,
|
||||
},
|
||||
)
|
||||
|
@ -1,3 +1,3 @@
|
||||
ArknightsUID_version = '0.1.0'
|
||||
Arknights_Client_version = '2.2.01'
|
||||
Arknights_Res_version = '24-02-02-10-18-07-831ad8'
|
||||
ArknightsUID_version = "0.1.0"
|
||||
Arknights_Client_version = "2.2.21"
|
||||
Arknights_Res_version = "24-03-06-07-46-40-d13e0f"
|
||||
|
@ -56,10 +56,32 @@ pythonVersion = "3.8"
|
||||
pythonPlatform = "All"
|
||||
|
||||
[tool.ruff]
|
||||
select = ["E", "W", "F", "UP", "C", "T", "PYI", "PT", "Q"]
|
||||
ignore = ["C901", "Q000", "Q003"]
|
||||
line-length = 108
|
||||
line-length = 88
|
||||
target-version = "py38"
|
||||
|
||||
[tool.ruff.format]
|
||||
quote-style = "single"
|
||||
[tool.ruff.lint]
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user