format and bug fix

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

View File

@ -12,55 +12,55 @@ from ..utils.ark_prefix import PREFIX
from .draw_ap_card import get_ap_img
from .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)

View File

@ -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

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

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

View File

@ -7,25 +7,27 @@ from gsuid_core.utils.plugins_config.models import (
)
CONIFG_DEFAULT: Dict[str, GSC] = {
'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,
),
}

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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()

View File

@ -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("[资源文件下载] 完毕")

View File

@ -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"))

View File

@ -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))

View File

@ -10,9 +10,9 @@ from ..utils.ark_api import ark_skd_api
from ..utils.fonts.source_han_serif import sans_font_28
from ..utils.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()

View File

@ -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每日全部签到]群聊推送完成")

View File

@ -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()

View File

@ -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)

View File

@ -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)

View File

@ -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 "添加成功!"

View File

@ -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))

View File

@ -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"))

View File

@ -1,8 +1,8 @@
ARK_USER_ME = 'https://zonai.skland.com/api/v1/user/me'
ARK_USER_ME = "https://zonai.skland.com/api/v1/user/me"
ARK_REFRESH_TOKEN = 'https://zonai.skland.com/api/v1/auth/refresh'
ARK_REFRESH_TOKEN = "https://zonai.skland.com/api/v1/auth/refresh"
ARK_PLAYER_INFO = 'https://zonai.skland.com/api/v1/game/player/info'
ARK_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"

View File

@ -20,23 +20,23 @@ from ...models.skland.models import (
)
from .api import ARK_PLAYER_INFO, ARK_REFRESH_TOKEN, ARK_SKD_SIGN, ARK_USER_ME
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={gt}&challenge={ch}',
method='GET',
url=f"{_pass_api}&gt={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:

View File

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

View File

@ -1,4 +1,4 @@
from typing import Dict, List, Literal, Optional, Type, TypeVar, Union
from typing import Dict, Literal, Optional, Sequence, Type, TypeVar, Union
from gsuid_core.utils.database.base_models import (
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

View File

@ -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;",
]

View File

@ -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)

View File

@ -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}!"

View File

@ -10,10 +10,10 @@ def read_json(file_path: Path, **kwargs) -> Dict:
Read a JSON file and return its contents as a dictionary.
"""
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}")

View File

@ -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:

View File

@ -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:

View File

@ -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(

View File

@ -6,10 +6,10 @@ from gsuid_core.bot import Bot
async def send_diff_msg(bot: Bot, code: Any, data: Union[Dict, None] = None):
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:

View File

@ -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]:

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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

View File

@ -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]

View File

@ -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]

View File

@ -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]]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]]

View File

@ -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]

View File

@ -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]

View File

@ -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

View File

@ -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]

View File

@ -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

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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

View File

@ -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]

View File

@ -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

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]]

View File

@ -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]

View File

@ -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

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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):

View File

@ -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():

View File

@ -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全部资源下载完成!"

View File

@ -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,
},
)

View File

@ -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"

View File

@ -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