add AvatarDetail Model

This commit is contained in:
qwerdvd 2023-10-31 16:54:18 +08:00
parent 10bbdcac3b
commit c5a074a054
No known key found for this signature in database
GPG Key ID: A3AF89C783404769
5 changed files with 134 additions and 91 deletions

View File

@ -2,6 +2,52 @@ from typing import Any, Dict, List, Union
from msgspec import Struct from msgspec import Struct
class AvatarDetailEquipment(Struct):
item_id: str
item_name: str
item_url: str
avatar_base_type: str
rarity: str
max_level: int
cur_level: int
target_level: int
class AvatarDetailSkill(Struct):
point_id: str
pre_point: str
point_type: int
anchor: str
item_url: str
max_level: int
cur_level: int
target_level: int
progress: str
min_level_limit: int
class AvatarDetailAvatar(Struct):
item_id: str
item_name: str
icon_url: str
damage_type: str
rarity: str
avatar_base_type: str
max_level: int
cur_level: int
target_level: int
vertical_icon_url: str
class AvatarDetail(Struct):
avatar: AvatarDetailAvatar
skills: List[AvatarDetailSkill]
skills_other: List[AvatarDetailSkill]
equipment: AvatarDetailEquipment
is_login: bool
################ ################
# 抽卡记录相关 # # 抽卡记录相关 #
################ ################

View File

@ -1,13 +1,13 @@
import re import re
from gsuid_core.sv import SV
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.models import Event
from gsuid_core.logger import logger from gsuid_core.logger import logger
from gsuid_core.models import Event
from gsuid_core.sv import SV
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, get_detail_img from .draw_roleinfo_card import get_detail_img, get_role_img
sv_get_info = SV('sr查询信息') sv_get_info = SV('sr查询信息')
@ -40,4 +40,4 @@ async def send_detail_info(bot: Bot, ev: Event):
logger.info(f'[sr查询信息]UID: {uid}') logger.info(f'[sr查询信息]UID: {uid}')
await bot.logger.info('开始执行[sr查询信息]') await bot.logger.info('开始执行[sr查询信息]')
await bot.send(await get_detail_img(uid)) await bot.send(await get_detail_img(uid))
return None return None

View File

@ -1,17 +1,30 @@
import asyncio import asyncio
from pathlib import Path from pathlib import Path
from typing import Dict, List, Union, Optional from typing import Dict, List, Optional, Union
from PIL import Image, ImageDraw from gsuid_core.logger import logger
from gsuid_core.utils.error_reply import get_error from gsuid_core.utils.error_reply import get_error
from PIL import Image, ImageDraw
from ..sruid_utils.api.mys.models import (
AvatarDetail,
AvatarListItem,
AvatarListItemDetail,
RoleBasicInfo,
Stats,
)
from ..utils.fonts.first_world import fw_font_28
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.image.convert import convert_img
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.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' TEXT_PATH = Path(__file__).parent / 'texture2D'
@ -242,7 +255,7 @@ async def draw_role_card(sr_uid: str) -> Union[bytes, str]:
return await convert_img(img) return await convert_img(img)
async def _draw_detail_card( async def _draw_detail_card(
avatar_detail, avatar, index, char_info avatar_detail: AvatarDetail, avatar: AvatarListItemDetail, index: int, char_info: Image.Image
) -> Image.Image: ) -> Image.Image:
if str(avatar.rarity) == '5': if str(avatar.rarity) == '5':
bg_color = (255, 240, 211) bg_color = (255, 240, 211)
@ -261,7 +274,7 @@ async def _draw_detail_card(
'lm', 'lm',
) )
avatar_img.paste(element_icon, (195, 10), mask=element_icon) avatar_img.paste(element_icon, (195, 10), mask=element_icon)
avatar_draw.text( avatar_draw.text(
(270, 25), (270, 25),
f'{avatar.level}', f'{avatar.level}',
@ -269,7 +282,7 @@ async def _draw_detail_card(
sr_font_24, sr_font_24,
'mm', 'mm',
) )
avatar_draw.text( avatar_draw.text(
(325, 25), (325, 25),
f'{avatar.rank}', f'{avatar.rank}',
@ -277,76 +290,75 @@ async def _draw_detail_card(
sr_font_24, sr_font_24,
'mm', 'mm',
) )
avatar_draw.text( avatar_draw.text(
(380, 25), (380, 25),
f"{avatar_detail['skills'][0]['cur_level']}", f'{avatar_detail.skills[0].cur_level}',
first_color, first_color,
sr_font_24, sr_font_24,
'mm', 'mm',
) )
avatar_draw.text( avatar_draw.text(
(430, 25), (430, 25),
f"{avatar_detail['skills'][1]['cur_level']}", f'{avatar_detail.skills[1].cur_level}',
first_color, first_color,
sr_font_24, sr_font_24,
'mm', 'mm',
) )
avatar_draw.text( avatar_draw.text(
(485, 25), (485, 25),
f"{avatar_detail['skills'][2]['cur_level']}", f'{avatar_detail.skills[2].cur_level}',
first_color, first_color,
sr_font_24, sr_font_24,
'mm', 'mm',
) )
avatar_draw.text( avatar_draw.text(
(540, 25), (540, 25),
f"{avatar_detail['skills'][3]['cur_level']}", f'{avatar_detail.skills[3].cur_level}',
first_color, first_color,
sr_font_24, sr_font_24,
'mm', 'mm',
) )
if avatar.equip: if avatar.equip:
equip_icon = (await get_icon(avatar.equip.icon)).resize((40, 40)) equip_icon = (await get_icon(avatar.equip.icon)).resize((40, 40))
avatar_img.paste(equip_icon, (580, 5), mask=equip_icon) avatar_img.paste(equip_icon, (580, 5), mask=equip_icon)
avatar_draw.text( avatar_draw.text(
(640, 25), (640, 25),
f"{avatar.equip.rank}", f'{avatar.equip.rank}',
first_color, first_color,
sr_font_24, sr_font_24,
'lm', 'lm',
) )
avatar_draw.text( avatar_draw.text(
(680, 25), (680, 25),
f"Lv{avatar.equip.level}", f'Lv{avatar.equip.level}',
first_color, first_color,
sr_font_24, sr_font_24,
'lm', 'lm',
) )
avatar_draw.text( avatar_draw.text(
(750, 25), (750, 25),
f"{avatar.equip.name}", f'{avatar.equip.name}',
first_color, first_color,
sr_font_24, sr_font_24,
'lm', 'lm',
) )
char_info.paste(avatar_img, (15, 211 + 51 * index), mask=avatar_img) char_info.paste(avatar_img, (15, 211 + 51 * index), mask=avatar_img)
return char_info return char_info
async def get_detail_card(sr_uid: str) -> Union[bytes, str]: 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_list = await mys_api.get_avatar_info(sr_uid, '1001')
if isinstance(avatar_list, int): if isinstance(avatar_list, int):
return get_error(avatar_list) return get_error(avatar_list)
avatar_num = len(avatar_list.avatar_list) avatar_num = len(avatar_list.avatar_list)
@ -354,7 +366,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
char_info = bg_img.copy() char_info = bg_img.copy()
char_info = char_info.resize((1050, img_height)) char_info = char_info.resize((1050, img_height))
char_img_draw = ImageDraw.Draw(char_info) char_img_draw = ImageDraw.Draw(char_info)
char_img_draw.text( char_img_draw.text(
(50, 70), (50, 70),
'sr角色练度统计', 'sr角色练度统计',
@ -362,7 +374,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
sr_font_40, sr_font_40,
'lm', 'lm',
) )
char_img_draw.text( char_img_draw.text(
(50, 120), (50, 120),
f'UID:{sr_uid}{avatar_num}名角色', f'UID:{sr_uid}{avatar_num}名角色',
@ -370,7 +382,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
sr_font_28, sr_font_28,
'lm', 'lm',
) )
title_img = Image.new('RGBA', (1020, 60), (0, 0, 0, 150)) title_img = Image.new('RGBA', (1020, 60), (0, 0, 0, 150))
char_info.paste(title_img, (15, 150), mask=title_img) char_info.paste(title_img, (15, 150), mask=title_img)
char_img_draw.text( char_img_draw.text(
@ -380,7 +392,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
sr_font_26, sr_font_26,
'mm', 'mm',
) )
char_img_draw.text( char_img_draw.text(
(220, 180), (220, 180),
'属性', '属性',
@ -388,7 +400,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
sr_font_26, sr_font_26,
'mm', 'mm',
) )
char_img_draw.text( char_img_draw.text(
(285, 180), (285, 180),
'LV', 'LV',
@ -396,7 +408,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
sr_font_26, sr_font_26,
'mm', 'mm',
) )
char_img_draw.text( char_img_draw.text(
(340, 180), (340, 180),
'星魂', '星魂',
@ -404,7 +416,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
sr_font_26, sr_font_26,
'mm', 'mm',
) )
char_img_draw.text( char_img_draw.text(
(395, 180), (395, 180),
'N', 'N',
@ -412,7 +424,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
sr_font_26, sr_font_26,
'mm', 'mm',
) )
char_img_draw.text( char_img_draw.text(
(445, 180), (445, 180),
'B', 'B',
@ -420,7 +432,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
sr_font_26, sr_font_26,
'mm', 'mm',
) )
char_img_draw.text( char_img_draw.text(
(500, 180), (500, 180),
'U', 'U',
@ -428,7 +440,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
sr_font_26, sr_font_26,
'mm', 'mm',
) )
char_img_draw.text( char_img_draw.text(
(555, 180), (555, 180),
'T', 'T',
@ -436,7 +448,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
sr_font_26, sr_font_26,
'mm', 'mm',
) )
char_img_draw.text( char_img_draw.text(
(745, 180), (745, 180),
'光锥', '光锥',
@ -445,12 +457,17 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
'mm', 'mm',
) )
for index, avatar in enumerate(avatar_list.avatar_list): for index, avatar in enumerate(avatar_list.avatar_list):
avatar_detail = await mys_api.get_avatar_detail(sr_uid, avatar.id) avatar_detail = await mys_api.get_avatar_detail(sr_uid, str(avatar.id))
if isinstance(avatar_detail, int): if isinstance(avatar_detail, int):
return get_error(avatar_detail) return get_error(avatar_detail)
# 200 # 200
char_info = await _draw_detail_card(avatar_detail, avatar, index, char_info) char_info = await _draw_detail_card(
avatar_detail,
avatar,
index,
char_info,
)
# 写底层文字 # 写底层文字
char_img_draw.text( char_img_draw.text(
(525, img_height - 40), (525, img_height - 40),
@ -459,7 +476,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
fw_font_28, fw_font_28,
'mm', 'mm',
) )
res = await convert_img(char_info) res = await convert_img(char_info)
logger.info('[查询练度统计]绘图已完成,等待发送!') logger.info('[查询练度统计]绘图已完成,等待发送!')
return res return res

View File

@ -1,10 +1,10 @@
from io import BytesIO from io import BytesIO
from pathlib import Path from pathlib import Path
from typing import List, TypeVar, Generator from typing import Generator, List, TypeVar
from PIL import Image
from aiohttp import ClientSession from aiohttp import ClientSession
from gsuid_core.data_store import get_res_path from gsuid_core.data_store import get_res_path
from PIL import Image
T = TypeVar('T') T = TypeVar('T')

View File

@ -1,38 +1,39 @@
import copy import copy
import time
import random import random
from string import digits, ascii_letters import time
from typing import Any, Dict, Union, Literal, Optional from string import ascii_letters, digits
from typing import Any, Dict, Literal, Optional, Union
import msgspec import msgspec
from gsuid_core.utils.api.mys_api import _MysApi
from gsuid_core.utils.database.models import GsUser
# from gsuid_core.utils.api.mys.models import MysSign, SignList # from gsuid_core.utils.api.mys.models import MysSign, SignList
from gsuid_core.utils.api.mys.tools import ( from gsuid_core.utils.api.mys.tools import (
mys_version,
_random_int_ds, _random_int_ds,
generate_os_ds, generate_os_ds,
get_web_ds_token, get_web_ds_token,
mys_version,
) )
from gsuid_core.utils.api.mys_api import _MysApi
from gsuid_core.utils.database.models import GsUser
from .api import srdbsqla
from ..sruid_utils.api.mys.api import _API from ..sruid_utils.api.mys.api import _API
from ..sruid_utils.api.mys.models import ( from ..sruid_utils.api.mys.models import (
MysSign, AbyssData,
AvatarDetail,
AvatarInfo,
DailyNoteData,
GachaLog, GachaLog,
MonthlyAward,
MysSign,
RogueData,
RogueLocustData,
RoleBasicInfo,
RoleIndex,
SignInfo, SignInfo,
SignList, SignList,
AbyssData,
RogueData,
RoleIndex,
AvatarInfo,
MonthlyAward,
DailyNoteData,
RoleBasicInfo,
WidgetStamina, WidgetStamina,
RogueLocustData,
) )
from .api import srdbsqla
RECOGNIZE_SERVER = { RECOGNIZE_SERVER = {
'1': 'prod_gf_cn', '1': 'prod_gf_cn',
@ -285,28 +286,7 @@ 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( async def get_avatar_detail(
self, uid: str, avatarid: str self, uid: str, avatarid: str
): ):
@ -325,9 +305,9 @@ class MysApi(_MysApi):
header=self._HEADER, header=self._HEADER,
) )
if isinstance(data, Dict): if isinstance(data, Dict):
data = data['data'] data = msgspec.convert(data['data'], type=AvatarDetail)
return 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: