diff --git a/ArknightsUID/arknightsuid_roleinfo/__init__.py b/ArknightsUID/arknightsuid_roleinfo/__init__.py new file mode 100644 index 0000000..0af454f --- /dev/null +++ b/ArknightsUID/arknightsuid_roleinfo/__init__.py @@ -0,0 +1,30 @@ +import re + +from gsuid_core.bot import Bot +from gsuid_core.models import Event +from gsuid_core.sv import SV +from gsuid_core.utils.database.api import get_uid + +from ..utils.ark_prefix import PREFIX +from ..utils.database.models import ArknightsBind + +# from ..utils.convert import get_uid +from .draw_roleinfo_card import get_role_img + +sv_get_info = SV('ark查询信息') + + +@sv_get_info.on_command((f'{PREFIX}uid')) +async def send_role_info(bot: Bot, ev: Event): + # name = ''.join(re.findall('[\u4e00-\u9fa5]', ev.text)) + # if name: + # return + + uid = await get_uid(bot, ev, bind_model=ArknightsBind) + if uid is None: + return '你还没有绑定UID噢,请使用[ark绑定uid123]完成绑定!' + + await bot.logger.info('开始执行[ark查询信息]') + await get_role_img(uid) + await bot.send('WIP') + # await bot.send(await get_role_img(uid)) diff --git a/ArknightsUID/arknightsuid_roleinfo/draw_roleinfo_card.py b/ArknightsUID/arknightsuid_roleinfo/draw_roleinfo_card.py new file mode 100644 index 0000000..33a8065 --- /dev/null +++ b/ArknightsUID/arknightsuid_roleinfo/draw_roleinfo_card.py @@ -0,0 +1,25 @@ +import asyncio +import json + +from gsuid_core.data_store import get_res_path +from gsuid_core.utils.error_reply import get_error +from gsuid_core.utils.image.convert import convert_img +from PIL import Image + +from ..utils.ark_api import ark_skd_api + + +async def get_role_img(sr_uid: str): + player_info = await ark_skd_api.get_game_player_info(sr_uid) + if isinstance(player_info, int): + return get_error(player_info) + + current_ts = player_info.currentTs + status = player_info.status + uid = status.uid + + player_save_path = get_res_path(['ArknightsUID', 'player']) + + with open(player_save_path / f'{uid}.json', 'w', encoding='UTF-8') as f: + json.dump(player_info, f, ensure_ascii=False, indent=4) + diff --git a/ArknightsUID/arknightsuid_user/__init__.py b/ArknightsUID/arknightsuid_user/__init__.py index 15d9aa9..ca3a69c 100644 --- a/ArknightsUID/arknightsuid_user/__init__.py +++ b/ArknightsUID/arknightsuid_user/__init__.py @@ -1,4 +1,3 @@ - from gsuid_core.bot import Bot from gsuid_core.models import Event from gsuid_core.sv import SV diff --git a/ArknightsUID/utils/api/skd/api.py b/ArknightsUID/utils/api/skd/api.py index 10f832a..549ef12 100644 --- a/ArknightsUID/utils/api/skd/api.py +++ b/ArknightsUID/utils/api/skd/api.py @@ -1,3 +1,4 @@ ARK_USER_ME = 'https://zonai.skland.com/api/v1/user/me' +ARK_PLAYER_INFO = 'https://zonai.skland.com/api/v1/game/player/info' ARK_GEN_CRED_BY_CODE = 'https://zonai.skland.com/api/v1/user/auth/generate_cred_by_code' diff --git a/ArknightsUID/utils/api/skd/request.py b/ArknightsUID/utils/api/skd/request.py index 3484d67..54d53d9 100644 --- a/ArknightsUID/utils/api/skd/request.py +++ b/ArknightsUID/utils/api/skd/request.py @@ -6,8 +6,8 @@ from aiohttp import ClientSession, ContentTypeError, TCPConnector from gsuid_core.logger import logger from ...database.models import ArknightsUser -from ...models.skland.models import ArknightsUserMeModel -from .api import ARK_USER_ME +from ...models.skland.models import ArknightsPlayerInfoModel, ArknightsUserMeModel +from .api import ARK_PLAYER_INFO, ARK_USER_ME class BaseArkApi: @@ -21,6 +21,23 @@ class BaseArkApi: AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', } + async def get_game_player_info(self, uid: str) -> int | ArknightsPlayerInfoModel: + cred = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred') + if cred is None: + return -61 + header = deepcopy(self._HEADER) + header['Cred'] = cred + raw_data = await self._ark_request( + url=ARK_PLAYER_INFO, + params={'uid': uid}, + header=header, + ) + unpack_data = self.unpack(raw_data) + if isinstance(unpack_data, int): + return unpack_data + else: + return msgspec.convert(unpack_data, type=ArknightsPlayerInfoModel) + async def check_cred_valid(self, Cred: str) -> bool | ArknightsUserMeModel: header = deepcopy(self._HEADER) header['Cred'] = Cred diff --git a/ArknightsUID/utils/models/skland/models.py b/ArknightsUID/utils/models/skland/models.py index c61aae6..d27f738 100644 --- a/ArknightsUID/utils/models/skland/models.py +++ b/ArknightsUID/utils/models/skland/models.py @@ -403,6 +403,20 @@ class BuildingDormitories(Struct): comfort: int +class BuildingStockDelivery(Struct): + id_: str = field(name='id') + count: int + type_: str = field(name='type') + + +class BuildingStock(Struct): + instId: int + type_: str = field(name='type') + delivery: list[BuildingStockDelivery] + gain: BuildingStockDelivery + isViolated: bool + + class BuildingTradings(Struct): slotId: str level: int @@ -410,7 +424,7 @@ class BuildingTradings(Struct): completeWorkTime: int lastUpdateTime: int strategy: str - stock: list[int] + stock: list[BuildingStock] stockLimit: int @@ -500,8 +514,8 @@ class PlayerAssistChar(Struct): class PlayerMedal(Struct): type_: str = field(name='type') template: str - templateMedallist: list[str] - customMedalLayout: list[str] + templateMedalList: list[str] + customMedalLayout: list[str | None] total: int @@ -546,6 +560,14 @@ class DisplayShowConfig(Struct): standingsSwitch: bool +class PlayerActivityBannerList(Struct): + activityId: str + imgUrl: str + url: str + startTs: int + endTs: int + + class ArknightsPlayerInfoModel(Struct, omit_defaults=True, gc=False): currentTs: int showConfig: DisplayShowConfig @@ -575,6 +597,7 @@ class ArknightsPlayerInfoModel(Struct, omit_defaults=True, gc=False): manufactureFormulaInfoMap: dict[str, PlayerManufactureFormulaInfo] charAssets: list[PlayerCharAsset] skinAssets: list[PlayerSkinAsset] + activityBannerList: dict[str, list[PlayerActivityBannerList]] ################