2022-08-04 13:56:23 +00:00
|
|
|
from __future__ import annotations
|
2022-07-05 06:41:16 +00:00
|
|
|
|
2022-08-05 01:56:35 +00:00
|
|
|
import os
|
|
|
|
import json
|
2022-08-04 13:56:23 +00:00
|
|
|
import logging
|
2022-08-05 01:56:35 +00:00
|
|
|
|
2022-08-04 13:56:23 +00:00
|
|
|
from .http import HTTPClient
|
2022-11-19 05:36:05 +00:00
|
|
|
from .model.base import EnkaNetworkResponse
|
2022-07-16 19:35:08 +00:00
|
|
|
from .assets import Assets
|
2022-07-18 08:54:24 +00:00
|
|
|
from .enum import Language
|
2022-08-02 17:37:24 +00:00
|
|
|
from .cache import Cache
|
2022-07-12 19:55:54 +00:00
|
|
|
|
2022-08-04 13:56:23 +00:00
|
|
|
from typing import Union, Optional, Type, TYPE_CHECKING
|
|
|
|
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
from typing_extensions import Self
|
|
|
|
from types import TracebackType
|
|
|
|
|
|
|
|
__all__ = ("EnkaNetworkAPI",)
|
2022-07-29 04:31:21 +00:00
|
|
|
|
2022-06-22 06:14:31 +00:00
|
|
|
class EnkaNetworkAPI:
|
2022-08-04 13:56:23 +00:00
|
|
|
|
2022-07-05 08:46:47 +00:00
|
|
|
LOGGER = logging.getLogger(__name__)
|
|
|
|
|
2022-08-10 07:18:26 +00:00
|
|
|
def __init__(self, lang: str = "en", *, debug: bool = False, key: str = "", cache: bool = True, agent: str = "", timeout: int = 10) -> None: # noqa: E501
|
2022-07-05 08:46:47 +00:00
|
|
|
# Logging
|
|
|
|
logging.basicConfig()
|
2022-07-29 04:31:21 +00:00
|
|
|
logging.getLogger("enkanetwork").setLevel(logging.DEBUG if debug else logging.ERROR) # noqa: E501
|
2022-06-22 06:14:31 +00:00
|
|
|
|
2022-07-05 06:41:16 +00:00
|
|
|
# Set language and load config
|
2022-07-16 19:35:08 +00:00
|
|
|
self.assets = Assets(lang)
|
2022-07-12 19:55:54 +00:00
|
|
|
|
2022-08-02 17:37:24 +00:00
|
|
|
# Cache
|
|
|
|
self._enable_cache = cache
|
|
|
|
self.cache = Cache(1024, 60 * 3)
|
|
|
|
|
2022-08-04 13:56:23 +00:00
|
|
|
# http client
|
2022-08-10 07:18:26 +00:00
|
|
|
self.__http = HTTPClient(key=key, agent=agent, timeout=timeout)
|
2022-08-04 13:56:23 +00:00
|
|
|
self._closed = False
|
2022-08-03 07:50:43 +00:00
|
|
|
|
2022-08-04 13:56:23 +00:00
|
|
|
async def __aenter__(self) -> Self:
|
|
|
|
return self
|
|
|
|
|
|
|
|
async def __aexit__(
|
|
|
|
self,
|
|
|
|
exc_type: Optional[Type[BaseException]],
|
|
|
|
exc_value: Optional[BaseException],
|
|
|
|
traceback: Optional[TracebackType],
|
|
|
|
) -> None:
|
|
|
|
self._close = True
|
|
|
|
if self._close:
|
|
|
|
await self.__http.close()
|
|
|
|
|
|
|
|
def is_closed(self) -> bool:
|
|
|
|
return self._closed
|
2022-06-22 06:14:31 +00:00
|
|
|
|
2022-08-22 09:39:55 +00:00
|
|
|
@property
|
|
|
|
def http(self) -> HTTPClient:
|
|
|
|
return self.__http
|
|
|
|
|
|
|
|
@http.setter
|
|
|
|
def http(self, http: HTTPClient) -> None:
|
|
|
|
self.__http = http
|
|
|
|
|
2022-07-18 08:54:24 +00:00
|
|
|
@property
|
|
|
|
def lang(self) -> Language:
|
|
|
|
return self.assets.LANGS
|
|
|
|
|
|
|
|
@lang.setter
|
|
|
|
def lang(self, lang: Language) -> None:
|
|
|
|
self.assets._set_language(lang)
|
|
|
|
|
2022-08-02 17:37:24 +00:00
|
|
|
def set_cache(self, cache: Cache) -> None:
|
|
|
|
self.cache = cache
|
|
|
|
|
2022-07-18 08:54:24 +00:00
|
|
|
async def set_language(self, lang: Language) -> None:
|
|
|
|
self.lang = lang
|
|
|
|
|
2022-07-05 06:41:16 +00:00
|
|
|
async def fetch_user(self, uid: Union[str, int]) -> EnkaNetworkResponse:
|
2022-07-05 08:46:47 +00:00
|
|
|
self.LOGGER.debug(f"Validating with UID {uid}...")
|
2022-08-04 13:56:23 +00:00
|
|
|
|
2022-08-02 17:37:24 +00:00
|
|
|
if self._enable_cache:
|
2022-08-13 06:35:56 +00:00
|
|
|
self.LOGGER.warning("Getting data from cache...")
|
2022-08-05 01:41:21 +00:00
|
|
|
data = await self.cache.get(uid)
|
2022-08-02 17:37:24 +00:00
|
|
|
|
|
|
|
if data is not None:
|
|
|
|
# Return data
|
|
|
|
self.LOGGER.debug("Parsing data...")
|
|
|
|
return EnkaNetworkResponse.parse_obj(data)
|
2022-08-02 17:40:30 +00:00
|
|
|
|
2022-08-05 01:41:21 +00:00
|
|
|
user = await self.__http.fetch_user(uid)
|
|
|
|
|
|
|
|
data = user["content"]
|
2022-08-15 20:17:34 +00:00
|
|
|
data = json.loads(data)
|
2022-08-05 01:41:21 +00:00
|
|
|
|
|
|
|
self.LOGGER.debug(f"Fetching user with UID {uid}...")
|
|
|
|
|
|
|
|
if self._enable_cache:
|
|
|
|
self.LOGGER.debug("Caching data...")
|
|
|
|
await self.cache.set(uid, data)
|
|
|
|
|
2022-07-12 19:55:54 +00:00
|
|
|
# Return data
|
|
|
|
self.LOGGER.debug("Parsing data...")
|
|
|
|
return EnkaNetworkResponse.parse_obj(data)
|
2022-06-22 06:14:31 +00:00
|
|
|
|
2022-07-17 06:08:16 +00:00
|
|
|
async def update_assets(self) -> None:
|
2022-08-04 13:56:23 +00:00
|
|
|
print("Updating assets...")
|
2022-07-12 19:55:54 +00:00
|
|
|
self.LOGGER.debug("Downloading new content...")
|
2022-08-04 13:56:23 +00:00
|
|
|
|
|
|
|
path = Assets._get_path_assets()
|
2022-08-05 01:56:35 +00:00
|
|
|
for folder in path:
|
|
|
|
for filename in os.listdir(path[folder]):
|
|
|
|
self.LOGGER.debug(f"Downloading {folder} file {filename}...")
|
|
|
|
|
2022-08-05 02:21:21 +00:00
|
|
|
data = await self.__http.fetch_asset(folder, filename)
|
2022-08-05 01:56:35 +00:00
|
|
|
|
|
|
|
self.LOGGER.debug(f"Writing {folder} file {filename}...")
|
2022-08-04 13:56:23 +00:00
|
|
|
|
2022-08-05 01:56:35 +00:00
|
|
|
# dumps to json file
|
|
|
|
with open(os.path.join(path[folder], filename), "w", encoding="utf-8") as f:
|
2022-08-15 20:17:34 +00:00
|
|
|
json.dump(json.loads(data["content"]), f, ensure_ascii=False, indent=4)
|
2022-06-22 06:14:31 +00:00
|
|
|
|
2022-07-17 06:08:16 +00:00
|
|
|
# Reload config
|
2022-07-29 04:31:21 +00:00
|
|
|
self.assets.reload_assets()
|