添加sr练度统计

This commit is contained in:
a376148946 2023-10-31 14:40:58 +08:00
parent ef4886e87a
commit a7fec5c85c
5 changed files with 292 additions and 5 deletions

View File

@ -46,6 +46,9 @@ STAR_RAIL_AVATAR_INFO_URL_OS = (
f'{OS_INFO_URL}/game_record/hkrpg/api/avatar/info' # OS角色详细信息接口 f'{OS_INFO_URL}/game_record/hkrpg/api/avatar/info' # OS角色详细信息接口
) )
STAR_RAIL_AVATAR_LIST_URL = f'{OLD_URL}/event/rpgcalc/avatar/list'
STAR_RAIL_AVATAR_DETAIL_URL = f'{OLD_URL}/event/rpgcalc/avatar/detail'
CHALLENGE_INFO_URL = f'{NEW_URL}/game_record/app/hkrpg/api/challenge' CHALLENGE_INFO_URL = f'{NEW_URL}/game_record/app/hkrpg/api/challenge'
CHALLENGE_INFO_URL_OS = f'{OS_INFO_URL}/game_record/hkrpg/api/challenge' CHALLENGE_INFO_URL_OS = f'{OS_INFO_URL}/game_record/hkrpg/api/challenge'

View File

@ -7,7 +7,7 @@ from gsuid_core.logger import logger
from ..utils.convert import get_uid from ..utils.convert import get_uid
from ..utils.sr_prefix import PREFIX from ..utils.sr_prefix import PREFIX
from .draw_roleinfo_card import get_role_img from .draw_roleinfo_card import get_role_img, get_detail_img
sv_get_info = SV('sr查询信息') sv_get_info = SV('sr查询信息')
@ -26,3 +26,18 @@ async def send_role_info(bot: Bot, ev: Event):
await bot.logger.info('开始执行[sr查询信息]') await bot.logger.info('开始执行[sr查询信息]')
await bot.send(await get_role_img(uid)) await bot.send(await get_role_img(uid))
return None return None
@sv_get_info.on_command(f'{PREFIX}练度统计')
async def send_role_info(bot: Bot, ev: Event):
name = ''.join(re.findall('[\u4e00-\u9fa5]', ev.text))
if name:
return None
uid = await get_uid(bot, ev)
if uid is None:
return '你还没有绑定UID噢,请使用[sr绑定uid123]完成绑定!'
logger.info(f'[sr查询信息]UID: {uid}')
await bot.logger.info('开始执行[sr查询信息]')
await bot.send(await get_detail_img(uid))
return None

View File

@ -8,8 +8,10 @@ from gsuid_core.utils.error_reply import get_error
from ..utils.mys_api import mys_api from ..utils.mys_api import mys_api
from .utils import get_icon, wrap_list from .utils import get_icon, wrap_list
from ..utils.image.convert import convert_img from ..utils.image.convert import convert_img
from ..utils.fonts.starrail_fonts import sr_font_24, sr_font_30, sr_font_36 from ..utils.fonts.starrail_fonts import sr_font_24, sr_font_26, sr_font_28, sr_font_30, sr_font_36, sr_font_40
from ..utils.fonts.first_world import fw_font_28
from ..sruid_utils.api.mys.models import Stats, RoleBasicInfo, AvatarListItem from ..sruid_utils.api.mys.models import Stats, RoleBasicInfo, AvatarListItem
from gsuid_core.logger import logger
TEXT_PATH = Path(__file__).parent / 'texture2D' TEXT_PATH = Path(__file__).parent / 'texture2D'
@ -22,7 +24,7 @@ user_avatar = (
char_bg_4 = Image.open(TEXT_PATH / 'rarity4_bg.png').convert('RGBA') char_bg_4 = Image.open(TEXT_PATH / 'rarity4_bg.png').convert('RGBA')
char_bg_5 = Image.open(TEXT_PATH / 'rarity5_bg.png').convert('RGBA') char_bg_5 = Image.open(TEXT_PATH / 'rarity5_bg.png').convert('RGBA')
circle = Image.open(TEXT_PATH / 'char_weapon_bg.png').convert('RGBA') circle = Image.open(TEXT_PATH / 'char_weapon_bg.png').convert('RGBA')
bg_img = Image.open(TEXT_PATH / 'bg.png')
bg_color = (248, 248, 248) bg_color = (248, 248, 248)
white_color = (255, 255, 255) white_color = (255, 255, 255)
color_color = (40, 18, 7) color_color = (40, 18, 7)
@ -50,6 +52,8 @@ elements = {
async def get_role_img(uid: str) -> Union[bytes, str]: async def get_role_img(uid: str) -> Union[bytes, str]:
return await draw_role_card(uid) return await draw_role_card(uid)
async def get_detail_img(uid: str) -> Union[bytes, str]:
return await get_detail_card(uid)
def _lv(level: int) -> str: def _lv(level: int) -> str:
return f'Lv.0{level}' if level < 10 else f'Lv.{level}' return f'Lv.0{level}' if level < 10 else f'Lv.{level}'
@ -236,3 +240,224 @@ async def draw_role_card(sr_uid: str) -> Union[bytes, str]:
img.paste(img2, (0, 810)) img.paste(img2, (0, 810))
img.paste(bg3, (0, height + 810)) img.paste(bg3, (0, height + 810))
return await convert_img(img) return await convert_img(img)
async def _draw_detail_card(
avatar_detail, avatar, index, char_info
) -> Image.Image:
if str(avatar.rarity) == '5':
bg_color = (255, 240, 211)
else:
bg_color = (239, 222, 255)
avatar_img = Image.new('RGBA', (1020, 50), bg_color)
avatar_draw = ImageDraw.Draw(avatar_img)
char_icon = (await get_icon(avatar.icon)).resize((40, 40))
element_icon = elements[avatar.element]
avatar_img.paste(char_icon, (5, 5), mask=char_icon)
avatar_draw.text(
(60, 25),
f'{avatar.name}',
first_color,
sr_font_24,
'lm',
)
avatar_img.paste(element_icon, (195, 10), mask=element_icon)
avatar_draw.text(
(270, 25),
f'{avatar.level}',
first_color,
sr_font_24,
'mm',
)
avatar_draw.text(
(325, 25),
f'{avatar.rank}',
first_color,
sr_font_24,
'mm',
)
avatar_draw.text(
(380, 25),
f"{avatar_detail['skills'][0]['cur_level']}",
first_color,
sr_font_24,
'mm',
)
avatar_draw.text(
(430, 25),
f"{avatar_detail['skills'][1]['cur_level']}",
first_color,
sr_font_24,
'mm',
)
avatar_draw.text(
(485, 25),
f"{avatar_detail['skills'][2]['cur_level']}",
first_color,
sr_font_24,
'mm',
)
avatar_draw.text(
(540, 25),
f"{avatar_detail['skills'][3]['cur_level']}",
first_color,
sr_font_24,
'mm',
)
if avatar.equip:
equip_icon = (await get_icon(avatar.equip.icon)).resize((40, 40))
avatar_img.paste(equip_icon, (580, 5), mask=equip_icon)
avatar_draw.text(
(640, 25),
f"{avatar.equip.rank}",
first_color,
sr_font_24,
'lm',
)
avatar_draw.text(
(680, 25),
f"Lv{avatar.equip.level}",
first_color,
sr_font_24,
'lm',
)
avatar_draw.text(
(750, 25),
f"{avatar.equip.name}",
first_color,
sr_font_24,
'lm',
)
char_info.paste(avatar_img, (15, 211 + 51 * index), mask=avatar_img)
return char_info
async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
# 获取角色列表
# avatar_list = await mys_api.get_avatar_list(sr_uid)
avatar_list = await mys_api.get_avatar_info(sr_uid, '1001')
avatar_num = len(avatar_list.avatar_list)
img_height = 300 + avatar_num * 51
char_info = bg_img.copy()
char_info = char_info.resize((1050, img_height))
char_img_draw = ImageDraw.Draw(char_info)
char_img_draw.text(
(50, 70),
'sr角色练度统计',
white_color,
sr_font_40,
'lm',
)
char_img_draw.text(
(50, 120),
f'UID:{sr_uid}{avatar_num}名角色',
white_color,
sr_font_28,
'lm',
)
title_img = Image.new('RGBA', (1020, 60), (0, 0, 0, 150))
char_info.paste(title_img, (15, 150), mask=title_img)
char_img_draw.text(
(115, 180),
'角色',
white_color,
sr_font_26,
'mm',
)
char_img_draw.text(
(220, 180),
'属性',
white_color,
sr_font_26,
'mm',
)
char_img_draw.text(
(285, 180),
'LV',
white_color,
sr_font_26,
'mm',
)
char_img_draw.text(
(340, 180),
'星魂',
white_color,
sr_font_26,
'mm',
)
char_img_draw.text(
(395, 180),
'N',
white_color,
sr_font_26,
'mm',
)
char_img_draw.text(
(445, 180),
'B',
white_color,
sr_font_26,
'mm',
)
char_img_draw.text(
(500, 180),
'U',
white_color,
sr_font_26,
'mm',
)
char_img_draw.text(
(555, 180),
'T',
white_color,
sr_font_26,
'mm',
)
char_img_draw.text(
(745, 180),
'光锥',
white_color,
sr_font_26,
'mm',
)
for index, avatar in enumerate(avatar_list.avatar_list):
avatar_detail = await mys_api.get_avatar_detail(sr_uid, avatar.id)
if isinstance(avatar_detail, int):
return get_error(avatar_detail)
# 200
char_info = await _draw_detail_card(avatar_detail, avatar, index, char_info)
# 写底层文字
char_img_draw.text(
(525, img_height - 40),
'--Created by qwerdvd-Designed By Wuyi-Thank for mihomo.me--',
(255, 255, 255),
fw_font_28,
'mm',
)
res = await convert_img(char_info)
logger.info('[查询练度统计]绘图已完成,等待发送!')
return res

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

@ -70,7 +70,9 @@ class MysApi(_MysApi):
async def get_user_fp(self, uid: str) -> Optional[str]: async def get_user_fp(self, uid: str) -> Optional[str]:
data = await GsUser.get_user_attr_by_uid(uid, 'fp', 'sr') data = await GsUser.get_user_attr_by_uid(uid, 'fp', 'sr')
if data is None: if data is None:
data = await self.generate_fp_by_uid(uid) seed_id, seed_time = self.get_seed()
model_name = self.generate_model_name()
data = await self.generate_fp_by_uid(uid, seed_id, seed_time, model_name)
await GsUser.update_data_by_uid_without_bot_id(uid, 'sr', fp=data) await GsUser.update_data_by_uid_without_bot_id(uid, 'sr', fp=data)
return data return data
@ -284,6 +286,48 @@ class MysApi(_MysApi):
# data = cast(AvatarInfo, data['data']) # data = cast(AvatarInfo, data['data'])
return data return data
async def get_avatar_list(
self, uid: str
):
data = await self.simple_mys_req(
'STAR_RAIL_AVATAR_LIST_URL',
uid,
params={
'game': 'hkrpg',
'uid': uid,
'region': RECOGNIZE_SERVER.get(str(uid)[0], 'prod_gf_cn'),
'lang': 'zh-cn',
'tab_from': 'TabOwned',
'page': '1',
'size': '100',
},
header=self._HEADER,
)
if isinstance(data, Dict):
data = data['data']
return data
async def get_avatar_detail(
self, uid: str, avatarid: str
):
data = await self.simple_mys_req(
'STAR_RAIL_AVATAR_DETAIL_URL',
uid,
params={
'game': 'hkrpg',
'lang': 'zh-cn',
'item_id': avatarid,
'tab_from': 'TabOwned',
'change_target_level': '0',
'uid': uid,
'region': RECOGNIZE_SERVER.get(str(uid)[0], 'prod_gf_cn'),
},
header=self._HEADER,
)
if isinstance(data, Dict):
data = data['data']
return data
async def get_sign_list(self, uid) -> Union[SignList, int]: async def get_sign_list(self, uid) -> Union[SignList, int]:
is_os = self.check_os(uid) is_os = self.check_os(uid)
if is_os: if is_os: