83 lines
3.1 KiB
Python
83 lines
3.1 KiB
Python
|
import aiohttp
|
||
|
import locale
|
||
|
from worthless import constants
|
||
|
|
||
|
|
||
|
class Launcher:
|
||
|
def __init__(self):
|
||
|
self._api = constants.LAUNCHER_API_URL
|
||
|
self._lang = self._get_system_language()
|
||
|
|
||
|
# Workaround because miHoYo uses retcode for their API
|
||
|
@staticmethod
|
||
|
async def _get(url, **kwargs) -> dict:
|
||
|
async with aiohttp.ClientSession() as session:
|
||
|
rsp = await session.get(url, **kwargs)
|
||
|
rsp_json = await rsp.json()
|
||
|
# Why retcode seriously? They can just make the page not returning 200 status code.
|
||
|
if rsp_json["retcode"] != 0:
|
||
|
raise aiohttp.ClientResponseError(code=rsp_json["retcode"],
|
||
|
message=rsp_json["message"],
|
||
|
history=rsp.history,
|
||
|
request_info=rsp.request_info)
|
||
|
return rsp_json
|
||
|
|
||
|
async def _get_launcher_info(self, adv=True) -> dict:
|
||
|
params = {"key": "gcStgarh",
|
||
|
"filter_adv": str(adv).lower(),
|
||
|
"launcher_id": "10",
|
||
|
"language": self._lang}
|
||
|
rsp = await self._get(self._api + "/content", params=params)
|
||
|
if rsp["data"]["adv"] is None:
|
||
|
params["language"] = "en-us"
|
||
|
rsp = await self._get(self._api + "/content", params=params)
|
||
|
return rsp
|
||
|
|
||
|
@staticmethod
|
||
|
def _get_system_language() -> str:
|
||
|
"""
|
||
|
Get system language compatible with server parameters.
|
||
|
"""
|
||
|
try:
|
||
|
lang = locale.getdefaultlocale()[0]
|
||
|
lowercase_lang = lang.lower().replace("_", "-")
|
||
|
return lowercase_lang
|
||
|
except ValueError:
|
||
|
return "en-us"
|
||
|
|
||
|
async def override_language(self, language: str) -> None:
|
||
|
"""
|
||
|
Override system detected language with another language.
|
||
|
:param language: The language to override with.
|
||
|
:return: None
|
||
|
"""
|
||
|
self._lang = language.lower().replace("_", "-")
|
||
|
|
||
|
async def get_version_info(self) -> dict:
|
||
|
rsp = await self._get(self._api + "/resource", params={"key": "gcStgarh",
|
||
|
"launcher_id": "10"})
|
||
|
return rsp
|
||
|
|
||
|
async def get_launcher_info(self) -> dict:
|
||
|
"""
|
||
|
This function will get short launcher info from the server (only contains background image and FAQ)
|
||
|
:return: dict: Launcher info from the server.
|
||
|
"""
|
||
|
return await self._get_launcher_info(adv=True)
|
||
|
|
||
|
async def get_launcher_full_info(self) -> dict:
|
||
|
"""
|
||
|
This function will get full launcher info from the server.
|
||
|
Since the server content is very long for a short explanation, you should see it manually.
|
||
|
:return: dict: Launcher info from the server.
|
||
|
"""
|
||
|
return await self._get_launcher_info(adv=False)
|
||
|
|
||
|
async def get_launcher_background_url(self) -> str:
|
||
|
"""
|
||
|
This function will get launcher background image from the server.
|
||
|
:return: str: Background image URL.
|
||
|
"""
|
||
|
rsp = await self.get_launcher_info()
|
||
|
return rsp["data"]["adv"]["background"]
|