mirror of
https://github.com/baiqwerdvd/StarRailUID.git
synced 2025-05-05 11:13:45 +08:00
添加sr练度统计
This commit is contained in:
parent
ef4886e87a
commit
a7fec5c85c
@ -46,6 +46,9 @@ STAR_RAIL_AVATAR_INFO_URL_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_OS = f'{OS_INFO_URL}/game_record/hkrpg/api/challenge'
|
||||
|
||||
|
@ -7,7 +7,7 @@ from gsuid_core.logger import logger
|
||||
|
||||
from ..utils.convert import get_uid
|
||||
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查询信息')
|
||||
|
||||
@ -26,3 +26,18 @@ async def send_role_info(bot: Bot, ev: Event):
|
||||
await bot.logger.info('开始执行[sr查询信息]')
|
||||
await bot.send(await get_role_img(uid))
|
||||
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
|
@ -8,8 +8,10 @@ from gsuid_core.utils.error_reply import get_error
|
||||
from ..utils.mys_api import mys_api
|
||||
from .utils import get_icon, wrap_list
|
||||
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 gsuid_core.logger import logger
|
||||
|
||||
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_5 = Image.open(TEXT_PATH / 'rarity5_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)
|
||||
white_color = (255, 255, 255)
|
||||
color_color = (40, 18, 7)
|
||||
@ -50,6 +52,8 @@ elements = {
|
||||
async def get_role_img(uid: str) -> Union[bytes, str]:
|
||||
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:
|
||||
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(bg3, (0, height + 810))
|
||||
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
|
||||
|
BIN
StarRailUID/starrailuid_roleinfo/texture2D/bg.png
Normal file
BIN
StarRailUID/starrailuid_roleinfo/texture2D/bg.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 MiB |
@ -70,7 +70,9 @@ class MysApi(_MysApi):
|
||||
async def get_user_fp(self, uid: str) -> Optional[str]:
|
||||
data = await GsUser.get_user_attr_by_uid(uid, 'fp', 'sr')
|
||||
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)
|
||||
return data
|
||||
|
||||
@ -283,7 +285,49 @@ class MysApi(_MysApi):
|
||||
data = msgspec.convert(data['data'], type=AvatarInfo)
|
||||
# data = cast(AvatarInfo, data['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]:
|
||||
is_os = self.check_os(uid)
|
||||
if is_os:
|
||||
|
Loading…
x
Reference in New Issue
Block a user