mirror of
https://github.com/KimigaiiWuyi/GenshinUID.git
synced 2025-05-06 11:43:45 +08:00
⬆️ pre-commit-ci
自动升级 (#617)
* ⬆️ `pre-commit-ci`自动升级 updates: - [github.com/psf/black: 23.12.1 → 24.1.1](https://github.com/psf/black/compare/23.12.1...24.1.1) - [github.com/pycqa/flake8: 6.1.0 → 7.0.0](https://github.com/pycqa/flake8/compare/6.1.0...7.0.0) * 🚨 `pre-commit-ci`修复格式错误 --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
e76a236d5c
commit
5140ab2dc3
@ -13,12 +13,12 @@ repos:
|
||||
- id: isort
|
||||
|
||||
- repo: https://github.com/psf/black
|
||||
rev: 23.12.1
|
||||
rev: 24.1.1
|
||||
hooks:
|
||||
- id: black
|
||||
|
||||
- repo: https://github.com/pycqa/flake8
|
||||
rev: 6.1.0
|
||||
rev: 7.0.0
|
||||
hooks:
|
||||
- id: flake8
|
||||
|
||||
|
@ -72,7 +72,9 @@ async def ann_list_card() -> bytes:
|
||||
bg, new_item, (x, list_head.height + (index * new_item.height))
|
||||
)
|
||||
|
||||
tip = '*可以使用 原神公告#0000(右上角ID) 来查看详细内容, 例子: 原神公告#2434'
|
||||
tip = (
|
||||
'*可以使用 原神公告#0000(右上角ID) 来查看详细内容, 例子: 原神公告#2434'
|
||||
)
|
||||
draw_text_by_line(
|
||||
bg, (0, bg.height - 35), tip, gs_font_18, '#767779', 1000, True
|
||||
)
|
||||
|
@ -61,9 +61,11 @@ async def send_check_cookie(bot: Bot, ev: Event):
|
||||
else:
|
||||
return_str = '\n'.join(
|
||||
[
|
||||
(
|
||||
f'uid{user.uid}/mys{user.mys_id}的Cookies是正常的!'
|
||||
if user not in invalid_user
|
||||
else f'uid{user.uid}的Cookies是异常的!已删除该条Cookies!'
|
||||
)
|
||||
for user in user_list
|
||||
]
|
||||
)
|
||||
@ -99,15 +101,20 @@ async def send_check_stoken(bot: Bot, ev: Event):
|
||||
if len(user_list) > 4:
|
||||
im = f'正常Stoken数量: {len(user_list) - len(invalid_user)}'
|
||||
invalid = '\n'.join(
|
||||
[f'uid{user.uid}的Stoken是异常的!已清除Stoken!\n' for user in invalid_user]
|
||||
[
|
||||
f'uid{user.uid}的Stoken是异常的!已清除Stoken!\n'
|
||||
for user in invalid_user
|
||||
]
|
||||
)
|
||||
return_str = f'{im}\n{invalid if invalid else "无失效Stoken!"}'
|
||||
else:
|
||||
return_str = '\n'.join(
|
||||
[
|
||||
(
|
||||
f'uid{user.uid}/mys{user.mys_id}的Stoken是正常的!'
|
||||
if user not in invalid_user
|
||||
else f'uid{user.uid}的Stoken是异常的!已清除Stoken!'
|
||||
)
|
||||
for user in user_list
|
||||
]
|
||||
)
|
||||
|
@ -20,12 +20,18 @@ CONIFG_DEFAULT: Dict[str, GSC] = {
|
||||
'原神公告推送ID列表',
|
||||
[],
|
||||
),
|
||||
'SignTime': GsListStrConfig('每晚签到时间设置', '每晚米游社签到时间设置(时,分)', ['0', '38']),
|
||||
'SignTime': GsListStrConfig(
|
||||
'每晚签到时间设置', '每晚米游社签到时间设置(时,分)', ['0', '38']
|
||||
),
|
||||
'BBSTaskTime': GsListStrConfig(
|
||||
'每晚米游社任务时间设置', '每晚米游社任务时间设置(时,分)', ['1', '41']
|
||||
'每晚米游社任务时间设置',
|
||||
'每晚米游社任务时间设置(时,分)',
|
||||
['1', '41'],
|
||||
),
|
||||
'GetDrawTaskTime': GsListStrConfig(
|
||||
'每晚留影叙佳期任务时间设置', '每晚留影叙佳期任务时间设置(时,分)', ['3', '25']
|
||||
'每晚留影叙佳期任务时间设置',
|
||||
'每晚留影叙佳期任务时间设置(时,分)',
|
||||
['3', '25'],
|
||||
),
|
||||
'MhyBBSCoinReport': GsBoolConfig(
|
||||
'米游币推送',
|
||||
|
@ -91,7 +91,9 @@ async def set_config_func(
|
||||
# 执行设置
|
||||
if query is not None:
|
||||
gsconfig.set_config(name, query)
|
||||
im = '成功设置{}为{}。'.format(config_name, '开' if query else '关')
|
||||
im = '成功设置{}为{}。'.format(
|
||||
config_name, '开' if query else '关'
|
||||
)
|
||||
else:
|
||||
im = '未传入参数query!'
|
||||
else:
|
||||
|
@ -9,7 +9,9 @@ from .draw_daily_cost import draw_daily_cost_img
|
||||
sv_daily_cost = SV('查询每日材料')
|
||||
|
||||
|
||||
@sv_daily_cost.on_command(('每日材料', '今日材料', '每日素材', '今日素材'), block=True)
|
||||
@sv_daily_cost.on_command(
|
||||
('每日材料', '今日材料', '每日素材', '今日素材'), block=True
|
||||
)
|
||||
async def send_collection_info(bot: Bot, ev: Event):
|
||||
logger.info('开始执行[每日材料]')
|
||||
im = await draw_daily_cost_img()
|
||||
|
@ -231,7 +231,9 @@ async def contrast_char_info(bot: Bot, ev: Event):
|
||||
return await bot.send('参考格式: 对比面板 公子 公子换可莉圣遗物')
|
||||
contrast_list = ev.text.strip().split(' ')
|
||||
if len(contrast_list) <= 1:
|
||||
return await bot.send('输入格式错误...参考格式: 对比面板 公子 公子换可莉圣遗物')
|
||||
return await bot.send(
|
||||
'输入格式错误...参考格式: 对比面板 公子 公子换可莉圣遗物'
|
||||
)
|
||||
elif len(contrast_list) >= 4:
|
||||
return await bot.send('不支持对比四个及以上的面板...')
|
||||
|
||||
@ -244,7 +246,9 @@ async def contrast_char_info(bot: Bot, ev: Event):
|
||||
elif isinstance(im, Tuple):
|
||||
data = im[0]
|
||||
if isinstance(data, bytes):
|
||||
return await bot.send('输入了错误的格式...参考格式: 对比面板 公子 公子换可莉圣遗物')
|
||||
return await bot.send(
|
||||
'输入了错误的格式...参考格式: 对比面板 公子 公子换可莉圣遗物'
|
||||
)
|
||||
elif isinstance(data, str):
|
||||
return await bot.send(data)
|
||||
else:
|
||||
@ -262,10 +266,14 @@ async def contrast_char_info(bot: Bot, ev: Event):
|
||||
@sv_get_enka.on_command('保存面板')
|
||||
async def save_char_info(bot: Bot, ev: Event):
|
||||
if not ev.text.strip():
|
||||
return await bot.send('后面需要跟自定义的保存名字\n例如:保存面板公子为核爆公子')
|
||||
return await bot.send(
|
||||
'后面需要跟自定义的保存名字\n例如:保存面板公子为核爆公子'
|
||||
)
|
||||
save_list = ev.text.strip().split('为')
|
||||
if len(save_list) <= 1:
|
||||
return await bot.send('输入格式错误...参考格式: 保存面板公子为核爆公子')
|
||||
return await bot.send(
|
||||
'输入格式错误...参考格式: 保存面板公子为核爆公子'
|
||||
)
|
||||
|
||||
uid = await get_uid(bot, ev)
|
||||
if uid is None:
|
||||
|
@ -47,22 +47,32 @@ async def get_weight_temp(prop: dict, attr: str) -> List[float]:
|
||||
weight = []
|
||||
if '攻击' in attr:
|
||||
weight.append(
|
||||
(prop['atk_green'] / prop['baseAtk']) * 100 / WEIGHT_MAP['百分比攻击力']
|
||||
(prop['atk_green'] / prop['baseAtk'])
|
||||
* 100
|
||||
/ WEIGHT_MAP['百分比攻击力']
|
||||
)
|
||||
elif '生命' in attr:
|
||||
weight.append(
|
||||
(prop['hp_green'] / prop['baseHp']) * 100 / WEIGHT_MAP['百分比血量']
|
||||
(prop['hp_green'] / prop['baseHp'])
|
||||
* 100
|
||||
/ WEIGHT_MAP['百分比血量']
|
||||
)
|
||||
elif '防御' in attr:
|
||||
weight.append(
|
||||
(prop['def_green'] / prop['baseDef']) * 100 / WEIGHT_MAP['百分比防御力']
|
||||
(prop['def_green'] / prop['baseDef'])
|
||||
* 100
|
||||
/ WEIGHT_MAP['百分比防御力']
|
||||
)
|
||||
elif '精通' in attr:
|
||||
weight.append(prop['elementalMastery'] / WEIGHT_MAP['元素精通'])
|
||||
elif '充能' in attr:
|
||||
weight.append(prop['energyRecharge'] * 100 / WEIGHT_MAP['元素充能效率'])
|
||||
weight.append(
|
||||
prop['energyRecharge'] * 100 / WEIGHT_MAP['元素充能效率']
|
||||
)
|
||||
elif '物伤' in attr:
|
||||
weight.append(prop['physicalDmgBonus'] * 100 / WEIGHT_MAP['物理伤害加成'])
|
||||
weight.append(
|
||||
prop['physicalDmgBonus'] * 100 / WEIGHT_MAP['物理伤害加成']
|
||||
)
|
||||
elif '伤' in attr:
|
||||
weight.append(prop['dmgBonus'] * 100 / WEIGHT_MAP['元素伤害加成'])
|
||||
elif '治疗' in attr:
|
||||
|
@ -123,7 +123,9 @@ async def draw_lib(ev: Event, uid: str, num: int) -> Union[bytes, str]:
|
||||
)
|
||||
|
||||
extra_notice = (
|
||||
f'可用 圣遗物仓库{num+1} 命令查看第{num+1}页' if num < all_page else '暂无更多页数'
|
||||
f'可用 圣遗物仓库{num+1} 命令查看第{num+1}页'
|
||||
if num < all_page
|
||||
else '暂无更多页数'
|
||||
)
|
||||
|
||||
bg_draw.text(
|
||||
|
@ -415,7 +415,9 @@ async def get_char_img(
|
||||
.resize((1421, 800))
|
||||
)
|
||||
else:
|
||||
char_img = Image.open(GACHA_IMG_PATH / f'{char_name}.png') # 角色图像
|
||||
char_img = Image.open(
|
||||
GACHA_IMG_PATH / f'{char_name}.png'
|
||||
) # 角色图像
|
||||
# 确定图片的长宽
|
||||
w, h = char_img.size
|
||||
if (w, h) != (based_w, based_h):
|
||||
|
@ -118,7 +118,9 @@ async def draw_rank_img(ev: Event, uid: str) -> Union[bytes, str]:
|
||||
char_draw.text((791, 129), _cr, 'white', gs_font_26, 'lm')
|
||||
char_draw.text((791, 169), _cd, 'white', gs_font_26, 'lm')
|
||||
|
||||
char_draw.text((263, 260), '测试项目: 未知', grey, gs_font_22, 'lm')
|
||||
char_draw.text(
|
||||
(263, 260), '测试项目: 未知', grey, gs_font_22, 'lm'
|
||||
)
|
||||
char_draw.text(
|
||||
(716, 257), str(int(float(result))), 'white', gs_font_44, 'lm'
|
||||
)
|
||||
@ -140,7 +142,9 @@ async def draw_rank_img(ev: Event, uid: str) -> Union[bytes, str]:
|
||||
|
||||
char_draw = ImageDraw.Draw(char_img)
|
||||
|
||||
char_draw.text((65, 39), f'数据最后更新于 {time}', grey, gs_font_15, 'lm')
|
||||
char_draw.text(
|
||||
(65, 39), f'数据最后更新于 {time}', grey, gs_font_15, 'lm'
|
||||
)
|
||||
char_draw.text(
|
||||
(760, 37), f'{char_name}', 'white', gs_font_32, 'rm'
|
||||
)
|
||||
@ -164,7 +168,9 @@ async def draw_rank_img(ev: Event, uid: str) -> Union[bytes, str]:
|
||||
char_draw.text((169, 129), _cr, 'white', gs_font_26, 'lm')
|
||||
char_draw.text((169, 169), _cd, 'white', gs_font_26, 'lm')
|
||||
|
||||
char_draw.text((669, 260), '测试项目: 未知', grey, gs_font_22, 'rm')
|
||||
char_draw.text(
|
||||
(669, 260), '测试项目: 未知', grey, gs_font_22, 'rm'
|
||||
)
|
||||
char_draw.text(
|
||||
(237, 249), str(int(float(result))), 'white', gs_font_44, 'rm'
|
||||
)
|
||||
|
@ -13,14 +13,14 @@ class ActionMAP(TypedDict):
|
||||
|
||||
|
||||
with open(EFFECT_PATH / 'weapon_effect.json', "r", encoding='UTF-8') as f:
|
||||
weapon_effect_map: Dict[
|
||||
str, Dict[str, Dict[str, Dict[str, str]]]
|
||||
] = json.load(f)
|
||||
weapon_effect_map: Dict[str, Dict[str, Dict[str, Dict[str, str]]]] = (
|
||||
json.load(f)
|
||||
)
|
||||
|
||||
with open(EFFECT_PATH / 'char_effect.json', "r", encoding='UTF-8') as f:
|
||||
char_effect_map: Dict[
|
||||
str, Dict[str, Dict[str, Dict[str, str]]]
|
||||
] = json.load(f)
|
||||
char_effect_map: Dict[str, Dict[str, Dict[str, Dict[str, str]]]] = (
|
||||
json.load(f)
|
||||
)
|
||||
|
||||
with open(EFFECT_PATH / 'artifact_effect.json', "r", encoding='UTF-8') as f:
|
||||
artifact_effect_map: Dict[str, Dict[str, Dict[str, str]]] = json.load(f)
|
||||
|
@ -67,7 +67,11 @@ async def get_artifacts_value(
|
||||
) -> float:
|
||||
if charName not in ATTR_MAP:
|
||||
ATTR_MAP[charName] = ['攻击力', '暴击率', '暴击伤害']
|
||||
if subName in ATTR_MAP[charName] and subName in ['血量', '防御力', '攻击力']:
|
||||
if subName in ATTR_MAP[charName] and subName in [
|
||||
'血量',
|
||||
'防御力',
|
||||
'攻击力',
|
||||
]:
|
||||
if subName == '血量':
|
||||
base = (subValue / baseHp) * 100
|
||||
elif subName == '防御力':
|
||||
|
@ -196,7 +196,9 @@ async def get_char_args(
|
||||
if isinstance(char_data, str):
|
||||
return char_data
|
||||
else:
|
||||
for i, s in enumerate(['生之花', '死之羽', '时之沙', '空之杯', '理之冠']):
|
||||
for i, s in enumerate(
|
||||
['生之花', '死之羽', '时之沙', '空之杯', '理之冠']
|
||||
):
|
||||
if '赤沙' in part:
|
||||
continue
|
||||
if part[-1] == s[-1]:
|
||||
@ -216,7 +218,9 @@ async def get_single_percent(char_data: Dict, uid: str, num: int, best: List):
|
||||
char = Character(char_data)
|
||||
await char.init_prop()
|
||||
percent = float(char.percent.replace('%', ''))
|
||||
logger.info(f'[查找最佳圣遗物] UID:{uid}第{num}次迭代...毕业度为{percent}!')
|
||||
logger.info(
|
||||
f'[查找最佳圣遗物] UID:{uid}第{num}次迭代...毕业度为{percent}!'
|
||||
)
|
||||
best.append({'percent': percent, 'char_data': char.card_prop})
|
||||
|
||||
|
||||
|
@ -711,9 +711,9 @@ class Character:
|
||||
_ex = 10 + weaponAffix * 2
|
||||
ex_effect.append(f'Q:dmgBonus+{_ex}')
|
||||
elif self.char_name == '优菈':
|
||||
skill_effect = EXTRA_CHAR_LIST[self.char_name]['Q每层能量伤害'][
|
||||
'value'
|
||||
]
|
||||
skill_effect = EXTRA_CHAR_LIST[self.char_name][
|
||||
'Q每层能量伤害'
|
||||
]['value']
|
||||
attack_type = 'Q'
|
||||
skill_level = prop[f'{attack_type}_skill_level'] - 1
|
||||
value = float(skill_effect[skill_level])
|
||||
|
@ -483,10 +483,12 @@ class Fight:
|
||||
avg_dmg = (
|
||||
normal_dmg
|
||||
if critrate < 0
|
||||
else crit_dmg
|
||||
else (
|
||||
crit_dmg
|
||||
if critrate > 1
|
||||
else crit_dmg * critrate + (1 - critrate) * normal_dmg
|
||||
)
|
||||
)
|
||||
|
||||
self.total_normal_dmg += normal_dmg
|
||||
self.total_avg_dmg += avg_dmg
|
||||
|
@ -65,7 +65,9 @@ async def draw_enka_card(
|
||||
else:
|
||||
line1 = '刷新成功!'
|
||||
|
||||
line2 = f'UID {uid}请使用 查询{char_data_list[0]["avatarName"]} 命令进行查询!'
|
||||
line2 = (
|
||||
f'UID {uid}请使用 查询{char_data_list[0]["avatarName"]} 命令进行查询!'
|
||||
)
|
||||
char_num = len(char_data_list)
|
||||
if char_num <= 8:
|
||||
based_w, based_h = 1000, 240 + ((char_num + 3) // 4) * 220
|
||||
|
@ -62,7 +62,13 @@ class DrawEventList:
|
||||
# 跳过一部分活动
|
||||
flag = False
|
||||
name_full = event_list[event]['nameFull']['CHS']
|
||||
for ban_word in ['首充', '深境螺旋', '传说任务', '纪行', '更新修复']:
|
||||
for ban_word in [
|
||||
'首充',
|
||||
'深境螺旋',
|
||||
'传说任务',
|
||||
'纪行',
|
||||
'更新修复',
|
||||
]:
|
||||
if ban_word in name_full:
|
||||
flag = True
|
||||
break
|
||||
|
@ -62,7 +62,9 @@ async def send_refresh_gacha_info(bot: Bot, ev: Event):
|
||||
if ev.command.startswith('强制'):
|
||||
await bot.logger.info('[WARNING]本次为强制刷新')
|
||||
is_force = True
|
||||
await bot.send(f'UID{uid}开始执行[刷新抽卡记录],需要一定时间...请勿重复触发!')
|
||||
await bot.send(
|
||||
f'UID{uid}开始执行[刷新抽卡记录],需要一定时间...请勿重复触发!'
|
||||
)
|
||||
im = await save_gachalogs(uid, None, is_force)
|
||||
await bot.send_option(im, [Button('🃏抽卡记录', '抽卡记录')])
|
||||
|
||||
|
@ -34,7 +34,12 @@ async def import_gachalogs(history_url: str, type: str, uid: str) -> str:
|
||||
if data_uid != uid:
|
||||
return f'该抽卡记录UID{data_uid}与你绑定UID{uid}不符合!'
|
||||
raw_data = history_data['list']
|
||||
result = {'新手祈愿': [], '常驻祈愿': [], '角色祈愿': [], '武器祈愿': []}
|
||||
result = {
|
||||
'新手祈愿': [],
|
||||
'常驻祈愿': [],
|
||||
'角色祈愿': [],
|
||||
'武器祈愿': [],
|
||||
}
|
||||
for item in raw_data:
|
||||
item['uid'] = uid
|
||||
item['item_id'] = ''
|
||||
|
@ -91,7 +91,12 @@ async def save_gachalogs(
|
||||
if raw_data is None:
|
||||
raw_data = await get_new_gachalog(uid, gachalogs_history, is_force)
|
||||
else:
|
||||
new_data = {'新手祈愿': [], '常驻祈愿': [], '角色祈愿': [], '武器祈愿': []}
|
||||
new_data = {
|
||||
'新手祈愿': [],
|
||||
'常驻祈愿': [],
|
||||
'角色祈愿': [],
|
||||
'武器祈愿': [],
|
||||
}
|
||||
if gachalogs_history:
|
||||
for i in ['新手祈愿', '常驻祈愿', '角色祈愿', '武器祈愿']:
|
||||
for item in raw_data[i]:
|
||||
@ -107,7 +112,12 @@ async def save_gachalogs(
|
||||
if raw_data == {} or not raw_data:
|
||||
return SK_HINT
|
||||
|
||||
temp_data = {'新手祈愿': [], '常驻祈愿': [], '角色祈愿': [], '武器祈愿': []}
|
||||
temp_data = {
|
||||
'新手祈愿': [],
|
||||
'常驻祈愿': [],
|
||||
'角色祈愿': [],
|
||||
'武器祈愿': [],
|
||||
}
|
||||
for i in ['新手祈愿', '常驻祈愿', '角色祈愿', '武器祈愿']:
|
||||
for item in raw_data[i]:
|
||||
if item not in temp_data[i]:
|
||||
|
@ -44,7 +44,9 @@ async def send_find_map_msg(bot: Bot, ev: Event):
|
||||
|
||||
resource_temp_path = MAP_DATA / f'{map_name}_{ev.text}.jpg'
|
||||
if resource_temp_path.exists():
|
||||
await bot.logger.info(f'本地已有{map_name}_{ev.text}的资源点,直接发送...')
|
||||
await bot.logger.info(
|
||||
f'本地已有{map_name}_{ev.text}的资源点,直接发送...'
|
||||
)
|
||||
resource_temp = await convert_img(resource_temp_path)
|
||||
await bot.send(resource_temp)
|
||||
else:
|
||||
|
@ -35,7 +35,9 @@ async def all_daily_mihoyo_bbs_coin():
|
||||
logger.exception(f'[米游币任务]执行失败: {user.uid}')
|
||||
im_failed += 1
|
||||
im_failed_str += f'\n[米游币任务]执行失败: {user.uid}'
|
||||
faild_im = f'\n以下为签到失败报告: {im_failed_str}' if im_failed_str != '' else ''
|
||||
faild_im = (
|
||||
f'\n以下为签到失败报告: {im_failed_str}' if im_failed_str != '' else ''
|
||||
)
|
||||
im = f'今日获取mhycoin成功数量: {im_success},失败数量: {im_failed}{faild_im}'
|
||||
return im, im_private
|
||||
|
||||
|
@ -128,7 +128,9 @@ class MihoyoBBSCoin:
|
||||
self.headers,
|
||||
)
|
||||
if 'err' in data['message'] or data['retcode'] == -100:
|
||||
logger.error('获取任务列表失败, 你的cookie可能已过期, 请重新设置cookie。')
|
||||
logger.error(
|
||||
'获取任务列表失败, 你的cookie可能已过期, 请重新设置cookie。'
|
||||
)
|
||||
return '你的Cookies已失效。'
|
||||
else:
|
||||
self.Today_getcoins = data['data']['can_get_points']
|
||||
@ -143,10 +145,14 @@ class MihoyoBBSCoin:
|
||||
else:
|
||||
# 如果第0个大于或等于62则直接判定任务没做
|
||||
if data['data']['states'][0]['mission_id'] >= 62:
|
||||
logger.info(f'新的一天, 今天可以获得{self.Today_getcoins}个米游币')
|
||||
logger.info(
|
||||
f'新的一天, 今天可以获得{self.Today_getcoins}个米游币'
|
||||
)
|
||||
pass
|
||||
else:
|
||||
logger.info(f'似乎还有任务没完成, 今天还能获得{self.Today_getcoins}')
|
||||
logger.info(
|
||||
f'似乎还有任务没完成, 今天还能获得{self.Today_getcoins}'
|
||||
)
|
||||
for i in data['data']['states']:
|
||||
# 58是讨论区签到
|
||||
if i['mission_id'] == 58:
|
||||
|
@ -106,7 +106,9 @@ async def daily_get_draw():
|
||||
if len(tasks) >= 1:
|
||||
await asyncio.gather(*tasks)
|
||||
delay = 50 + random.randint(3, 45)
|
||||
logger.info(f'[自动留影叙佳期] 已完成{len(tasks)}个用户, 等待{delay}秒进行下一次获取')
|
||||
logger.info(
|
||||
f'[自动留影叙佳期] 已完成{len(tasks)}个用户, 等待{delay}秒进行下一次获取'
|
||||
)
|
||||
tasks.clear()
|
||||
await asyncio.sleep(delay)
|
||||
|
||||
|
@ -67,7 +67,9 @@ async def get_resin_text(uid: str) -> Union[str, bytes]:
|
||||
remained_timed: str = seconds2hours(
|
||||
expedition['remained_time']
|
||||
)
|
||||
expedition_info.append(f'{avatar_name} 剩余时间{remained_timed}')
|
||||
expedition_info.append(
|
||||
f'{avatar_name} 剩余时间{remained_timed}'
|
||||
)
|
||||
|
||||
if dailydata['transformer']['recovery_time']['reached']:
|
||||
transformer_status = '可用'
|
||||
|
@ -16,5 +16,7 @@ async def send_download_resource_msg(bot: Bot, ev: Event):
|
||||
|
||||
|
||||
async def startup():
|
||||
logger.info('[资源文件下载] 正在检查与下载缺失的资源文件,可能需要较长时间,请稍等')
|
||||
logger.info(
|
||||
'[资源文件下载] 正在检查与下载缺失的资源文件,可能需要较长时间,请稍等'
|
||||
)
|
||||
logger.info(f'[资源文件下载] {await download_all_resource()}')
|
||||
|
@ -14,7 +14,9 @@ sv_get_regtime = SV('查询注册时间')
|
||||
sv_get_info = SV('查询原神信息')
|
||||
|
||||
|
||||
@sv_get_regtime.on_command(('原神注册时间', '注册时间', '查询注册时间'), block=True)
|
||||
@sv_get_regtime.on_command(
|
||||
('原神注册时间', '注册时间', '查询注册时间'), block=True
|
||||
)
|
||||
async def regtime(bot: Bot, ev: Event):
|
||||
await bot.logger.info('开始执行[查询注册时间]')
|
||||
uid = await get_uid(bot, ev)
|
||||
|
@ -23,4 +23,6 @@ async def calc_reg_time(uid: str) -> Union[str, bytes]:
|
||||
return f'UID{uid} 的注册时间为\n{regtime_date}'
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
return '数据获取错误, 可尝试使用【刷新ck】或者发送【扫码登陆】以绑定CK。'
|
||||
return (
|
||||
'数据获取错误, 可尝试使用【刷新ck】或者发送【扫码登陆】以绑定CK。'
|
||||
)
|
||||
|
@ -66,7 +66,9 @@ async def send_daily_sign():
|
||||
single['msg'], 'direct', qid, single['bot_id'], '', ''
|
||||
)
|
||||
except Exception as e:
|
||||
logger.warning(f'[每日全部签到] QQ {qid} 私聊推送失败!错误信息:{e}')
|
||||
logger.warning(
|
||||
f'[每日全部签到] QQ {qid} 私聊推送失败!错误信息:{e}'
|
||||
)
|
||||
await asyncio.sleep(0.5)
|
||||
logger.info('[每日全部签到]私聊推送完成')
|
||||
|
||||
@ -75,7 +77,9 @@ async def send_daily_sign():
|
||||
# 根据succee数判断是否为简洁推送
|
||||
if group_msg_list[gid]['success'] >= 0:
|
||||
report = (
|
||||
'以下为签到失败报告:{}'.format(group_msg_list[gid]['push_message'])
|
||||
'以下为签到失败报告:{}'.format(
|
||||
group_msg_list[gid]['push_message']
|
||||
)
|
||||
if group_msg_list[gid]['push_message'] != ''
|
||||
else ''
|
||||
)
|
||||
|
@ -54,22 +54,30 @@ async def sign_in(uid: str) -> str:
|
||||
Header['x-rpc-challenge'] = ch
|
||||
Header['x-rpc-validate'] = vl
|
||||
Header['x-rpc-seccode'] = f'{vl}|jordan'
|
||||
logger.info(f'[签到] {uid} 已获取验证码, 等待时间{delay}秒')
|
||||
logger.info(
|
||||
f'[签到] {uid} 已获取验证码, 等待时间{delay}秒'
|
||||
)
|
||||
await asyncio.sleep(delay)
|
||||
else:
|
||||
delay = 605 + random.randint(1, 120)
|
||||
logger.info(f'[签到] {uid} 未获取验证码,等待{delay}秒后重试...')
|
||||
logger.info(
|
||||
f'[签到] {uid} 未获取验证码,等待{delay}秒后重试...'
|
||||
)
|
||||
await asyncio.sleep(delay)
|
||||
continue
|
||||
else:
|
||||
logger.info('配置文件暂未开启[跳过无感验证],跳过本次签到任务...')
|
||||
logger.info(
|
||||
'配置文件暂未开启[跳过无感验证],跳过本次签到任务...'
|
||||
)
|
||||
return '签到失败...出现验证码!'
|
||||
# 成功签到!
|
||||
else:
|
||||
if index == 0:
|
||||
logger.info(f'[签到] {uid} 该用户无校验码!')
|
||||
else:
|
||||
logger.info(f'[签到] [无感验证] {uid} 该用户重试 {index} 次验证成功!')
|
||||
logger.info(
|
||||
f'[签到] [无感验证] {uid} 该用户重试 {index} 次验证成功!'
|
||||
)
|
||||
break
|
||||
elif (int(str(uid)[0]) > 5) and (sign_data['data']['code'] == 'ok'):
|
||||
# 国际服签到无risk_code字段
|
||||
@ -106,7 +114,9 @@ async def sign_in(uid: str) -> str:
|
||||
sign_missed -= 1
|
||||
sign_missed = sign_info.get('sign_cnt_missed') or sign_missed
|
||||
im = f'{mes_im}!\n{get_im}\n本月漏签次数:{sign_missed}'
|
||||
logger.info(f'[签到] {uid} 签到完成, 结果: {mes_im}, 漏签次数: {sign_missed}')
|
||||
logger.info(
|
||||
f'[签到] {uid} 签到完成, 结果: {mes_im}, 漏签次数: {sign_missed}'
|
||||
)
|
||||
return im
|
||||
|
||||
|
||||
@ -176,7 +186,9 @@ async def daily_sign():
|
||||
delay = 1
|
||||
else:
|
||||
delay = 50 + random.randint(3, 45)
|
||||
logger.info(f'[签到] 已签到{len(tasks)}个用户, 等待{delay}秒进行下一次签到')
|
||||
logger.info(
|
||||
f'[签到] 已签到{len(tasks)}个用户, 等待{delay}秒进行下一次签到'
|
||||
)
|
||||
tasks.clear()
|
||||
already = 0
|
||||
await asyncio.sleep(delay)
|
||||
|
@ -182,7 +182,9 @@ async def draw_pay_img(
|
||||
# 商品充值 UID
|
||||
drawer.text(
|
||||
(
|
||||
int(185 + (195 - gs_font_15.getlength(f'充值到 UID{uid}')) / 2),
|
||||
int(
|
||||
185 + (195 - gs_font_15.getlength(f'充值到 UID{uid}')) / 2
|
||||
),
|
||||
int(
|
||||
120
|
||||
- warning
|
||||
|
@ -24,15 +24,35 @@ disnote = '''免责声明:
|
||||
GOODS = {
|
||||
0: {
|
||||
'title': '创世结晶×60',
|
||||
'aliases': ['创世结晶x60', '结晶×60', '结晶x60', '创世结晶60', '结晶60'],
|
||||
'aliases': [
|
||||
'创世结晶x60',
|
||||
'结晶×60',
|
||||
'结晶x60',
|
||||
'创世结晶60',
|
||||
'结晶60',
|
||||
],
|
||||
},
|
||||
1: {
|
||||
'title': '创世结晶×300',
|
||||
'aliases': ['创世结晶x300', '结晶×300', '结晶x300', '创世结晶300', '结晶300', '30'],
|
||||
'aliases': [
|
||||
'创世结晶x300',
|
||||
'结晶×300',
|
||||
'结晶x300',
|
||||
'创世结晶300',
|
||||
'结晶300',
|
||||
'30',
|
||||
],
|
||||
},
|
||||
2: {
|
||||
'title': '创世结晶×980',
|
||||
'aliases': ['创世结晶x980', '结晶×980', '结晶x980', '创世结晶980', '结晶980', '98'],
|
||||
'aliases': [
|
||||
'创世结晶x980',
|
||||
'结晶×980',
|
||||
'结晶x980',
|
||||
'创世结晶980',
|
||||
'结晶980',
|
||||
'98',
|
||||
],
|
||||
},
|
||||
3: {
|
||||
'title': '创世结晶×1980',
|
||||
@ -125,7 +145,9 @@ async def topup_(
|
||||
if goods_id < len(fetchgoods_data):
|
||||
goods_data = fetchgoods_data[goods_id]
|
||||
else:
|
||||
return await bot.send('商品不存在,最大为' + str(len(fetchgoods_data) - 1))
|
||||
return await bot.send(
|
||||
'商品不存在,最大为' + str(len(fetchgoods_data) - 1)
|
||||
)
|
||||
order = await mys_api.topup(uid, goods_data, method)
|
||||
if isinstance(order, int):
|
||||
logger.warning(f'[充值] {group_id} {user_id} 出错!')
|
||||
|
@ -16,7 +16,9 @@ async def send_updatelog_msg(bot: Bot, ev: Event):
|
||||
await bot.send(im)
|
||||
|
||||
|
||||
@sv_gs_config.on_fullmatch(('gs更新', 'gs强制更新', 'gs强行强制更新', 'gs全部更新'))
|
||||
@sv_gs_config.on_fullmatch(
|
||||
('gs更新', 'gs强制更新', 'gs强行强制更新', 'gs全部更新')
|
||||
)
|
||||
async def send_update_msg(bot: Bot, ev: Event):
|
||||
await bot.logger.info('[gs更新] 正在执行 ...')
|
||||
level = 2
|
||||
|
@ -130,7 +130,9 @@ async def weapon_wiki(name: str) -> str:
|
||||
now = now[:-1]
|
||||
rw_ef.append(now)
|
||||
raw_effect = raw_effect.format(*rw_ef)
|
||||
effect = '\n' + '【' + data['effectName'] + '】' + ': ' + raw_effect
|
||||
effect = (
|
||||
'\n' + '【' + data['effectName'] + '】' + ': ' + raw_effect
|
||||
)
|
||||
else:
|
||||
effect = ''
|
||||
im = weapon_im.format(name, _type, star, info, atk, sub, effect)
|
||||
|
@ -28,7 +28,9 @@ async def scheduled_get_xk_data():
|
||||
await save_all_abyss_rank()
|
||||
|
||||
|
||||
@sv_get_abyss_database.on_fullmatch(('深渊概览', '深渊统计', '深渊使用率'), block=True)
|
||||
@sv_get_abyss_database.on_fullmatch(
|
||||
('深渊概览', '深渊统计', '深渊使用率'), block=True
|
||||
)
|
||||
async def send_abyss_pic(bot: Bot, ev: Event):
|
||||
await draw_xk_abyss_img()
|
||||
img = await convert_img(TOTAL_IMG)
|
||||
|
@ -66,7 +66,9 @@ async def draw_char_abyss_info(char_name: str) -> Union[bytes, str]:
|
||||
|
||||
# 基础文字部分
|
||||
img_draw = ImageDraw.Draw(_img)
|
||||
img_draw.text((450, 450), f'{char_name}的深渊统计', 'White', gs_font_40, 'mm')
|
||||
img_draw.text(
|
||||
(450, 450), f'{char_name}的深渊统计', 'White', gs_font_40, 'mm'
|
||||
)
|
||||
|
||||
# 绘图
|
||||
r = 20
|
||||
@ -98,7 +100,9 @@ async def draw_char_abyss_info(char_name: str) -> Union[bytes, str]:
|
||||
char_data_list.append(str(all_char_info['abyss']['avg_level']))
|
||||
char_data_list.append(str(all_char_info['abyss']['avg_constellation']))
|
||||
|
||||
for index, i in enumerate(['使用率', '满星率', '出场率', '平均等级', '平均命座']):
|
||||
for index, i in enumerate(
|
||||
['使用率', '满星率', '出场率', '平均等级', '平均命座']
|
||||
):
|
||||
_it = index * 161
|
||||
img_draw.text((127 + _it, 618), i, (67, 46, 26), gs_font_30, 'mm')
|
||||
img_draw.text(
|
||||
|
@ -20,7 +20,13 @@ from ..utils.map.GS_MAP_PATH import ( # noqa: E402
|
||||
char_list: List[str] = []
|
||||
char_action = {}
|
||||
INDEX_MAP = ['', 'A', 'E', 'Q']
|
||||
attack_type_list = {'普通攻击': 'A', '重击': 'B', '下落攻击': 'C', '战技': 'E', '爆发': 'Q'}
|
||||
attack_type_list = {
|
||||
'普通攻击': 'A',
|
||||
'重击': 'B',
|
||||
'下落攻击': 'C',
|
||||
'战技': 'E',
|
||||
'爆发': 'Q',
|
||||
}
|
||||
label_type_list = {
|
||||
'普通攻击': 'A',
|
||||
'重击': 'B',
|
||||
@ -38,7 +44,11 @@ extra = {
|
||||
'胡桃': {'A重击伤害': '蒸发', 'Q低血量时技能伤害': '蒸发'},
|
||||
'安柏': {'A满蓄力瞄准射击': ['融化', '蒸发']},
|
||||
'香菱': {'E喷火伤害': '蒸发', 'Q旋火轮伤害': '蒸发'},
|
||||
'达达利亚': {'A满蓄力瞄准射击': '蒸发', 'Q技能伤害·近战': '蒸发', 'Q技能伤害·远程': '蒸发'},
|
||||
'达达利亚': {
|
||||
'A满蓄力瞄准射击': '蒸发',
|
||||
'Q技能伤害·近战': '蒸发',
|
||||
'Q技能伤害·远程': '蒸发',
|
||||
},
|
||||
'重云': {'Q技能伤害': '融化'},
|
||||
'雷电将军': {
|
||||
'E协同攻击伤害': '超激化',
|
||||
@ -79,11 +89,22 @@ extra = {
|
||||
'Q最后一击伤害': '超激化',
|
||||
},
|
||||
'北斗': {'Q闪雷伤害': '超激化'},
|
||||
'赛诺': {'E冥祭伤害': '超激化', 'Q一段伤害': '超激化', 'Q重击伤害': '超激化'},
|
||||
'纳西妲': {'E长按伤害': '蔓激化', 'E灭净三业伤害': ['蔓激化', '蔓激化·前台']},
|
||||
'赛诺': {
|
||||
'E冥祭伤害': '超激化',
|
||||
'Q一段伤害': '超激化',
|
||||
'Q重击伤害': '超激化',
|
||||
},
|
||||
'纳西妲': {
|
||||
'E长按伤害': '蔓激化',
|
||||
'E灭净三业伤害': ['蔓激化', '蔓激化·前台'],
|
||||
},
|
||||
'旅行者(草)': {'Q草灯莲攻击伤害': '蔓激化'},
|
||||
'夜兰': {'E伤害': '蒸发'},
|
||||
'艾尔海森': {'Q单次伤害': '蔓激化', 'E突进攻击伤害': '蔓激化', 'E1枚光幕攻击伤害': '蔓激化'},
|
||||
'艾尔海森': {
|
||||
'Q单次伤害': '蔓激化',
|
||||
'E突进攻击伤害': '蔓激化',
|
||||
'E1枚光幕攻击伤害': '蔓激化',
|
||||
},
|
||||
'迪希雅': {
|
||||
'E净焰昂藏伤害': '蒸发',
|
||||
'E剑域炽焰伤害': '蒸发',
|
||||
@ -95,7 +116,9 @@ extra = {
|
||||
'E玫瑰晶弹基础伤害': ['3层', '6层'],
|
||||
},
|
||||
}
|
||||
template = {'A重击伤害': {'name': 'A重击伤害', 'type': '', 'plus': 1, 'value': []}}
|
||||
template = {
|
||||
'A重击伤害': {'name': 'A重击伤害', 'type': '', 'plus': 1, 'value': []}
|
||||
}
|
||||
|
||||
|
||||
def fill_label(label_name: str, index: int) -> str:
|
||||
@ -221,13 +244,22 @@ def find_tag(labels: List, index: int, char: str, parameters: dict) -> dict:
|
||||
# 特殊化处理
|
||||
if '心海' in char:
|
||||
label_name = label_name.replace('提升', '提高')
|
||||
label_name = label_name.replace('低空/高空坠地冲击伤害', '高空下落伤害')
|
||||
label_name = label_name.replace(
|
||||
'低空/高空坠地冲击伤害', '高空下落伤害'
|
||||
)
|
||||
label_name = label_name.replace('技能', '')
|
||||
|
||||
# 提升指提升百分比 例如 E:dmgBouns+50%
|
||||
# 提高指提高固定值 例如 Q:addDmg+40%defense
|
||||
|
||||
label_keyword_hurt_list = ['一段', '壹阶', '贰阶', '叁阶', '肆阶', '四阶高压粉碎']
|
||||
label_keyword_hurt_list = [
|
||||
'一段',
|
||||
'壹阶',
|
||||
'贰阶',
|
||||
'叁阶',
|
||||
'肆阶',
|
||||
'四阶高压粉碎',
|
||||
]
|
||||
|
||||
if '炽焰箭' in label_name:
|
||||
continue
|
||||
|
@ -125,7 +125,9 @@ async def panle2Json() -> None:
|
||||
:说明:
|
||||
访问DATA_PATH并转换数据为dmgMap.json。
|
||||
'''
|
||||
wb = openpyxl.load_workbook(str(DATA_PATH / '参考面板.xlsx'), data_only=True)
|
||||
wb = openpyxl.load_workbook(
|
||||
str(DATA_PATH / '参考面板.xlsx'), data_only=True
|
||||
)
|
||||
sheet: Worksheet = wb.active # type: ignore
|
||||
|
||||
result = {}
|
||||
|
@ -7,15 +7,13 @@ from gsuid_core.utils.database.models import GsBind
|
||||
|
||||
|
||||
@overload
|
||||
async def get_uid(bot: Bot, ev: Event) -> Optional[str]:
|
||||
...
|
||||
async def get_uid(bot: Bot, ev: Event) -> Optional[str]: ...
|
||||
|
||||
|
||||
@overload
|
||||
async def get_uid(
|
||||
bot: Bot, ev: Event, get_user_id: bool = True
|
||||
) -> Tuple[Optional[str], str]:
|
||||
...
|
||||
) -> Tuple[Optional[str], str]: ...
|
||||
|
||||
|
||||
async def get_uid(
|
||||
|
@ -8,23 +8,19 @@ from PIL import Image
|
||||
|
||||
|
||||
@overload
|
||||
async def convert_img(img: Image.Image, is_base64: bool = False) -> bytes:
|
||||
...
|
||||
async def convert_img(img: Image.Image, is_base64: bool = False) -> bytes: ...
|
||||
|
||||
|
||||
@overload
|
||||
async def convert_img(img: Image.Image, is_base64: bool = True) -> str:
|
||||
...
|
||||
async def convert_img(img: Image.Image, is_base64: bool = True) -> str: ...
|
||||
|
||||
|
||||
@overload
|
||||
async def convert_img(img: bytes, is_base64: bool = False) -> str:
|
||||
...
|
||||
async def convert_img(img: bytes, is_base64: bool = False) -> str: ...
|
||||
|
||||
|
||||
@overload
|
||||
async def convert_img(img: Path, is_base64: bool = False) -> str:
|
||||
...
|
||||
async def convert_img(img: Path, is_base64: bool = False) -> str: ...
|
||||
|
||||
|
||||
async def convert_img(
|
||||
|
Loading…
x
Reference in New Issue
Block a user