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角色详细信息接口
|
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'
|
||||||
|
|
||||||
|
@ -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
|
@ -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
|
||||||
|
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]:
|
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
|
||||||
|
|
||||||
@ -283,7 +285,49 @@ class MysApi(_MysApi):
|
|||||||
data = msgspec.convert(data['data'], type=AvatarInfo)
|
data = msgspec.convert(data['data'], type=AvatarInfo)
|
||||||
# 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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user