from typing import List, Tuple, TypedDict import requests from ..config import AtlasDefaults, ExpressionDefaults, Paths class SpritesheetData(TypedDict): facesize: int position: Tuple[int, int] class ReturnData(TypedDict): id: str faceX: int faceY: int extendData: dict[str, int] def fetch_expression_sheets(servantid: int, imageid: str): atlasurl_base = f"https://static.atlasacademy.io/{AtlasDefaults.REGION}/CharaFigure/{imageid}" savefolder = Paths.IMAGES / str(servantid) / imageid if not savefolder.is_dir(): savefolder.mkdir(exist_ok=True, parents=True) idx, status = 0, 200 while status == 200: filelocation = savefolder / f"{idx}.png" postfix = "" if idx == 1: postfix = "f" elif idx > 1: postfix = f"f{idx}" if filelocation.exists(): print(f"Found cached asset for {imageid}{postfix}.png") idx += 1 continue filename = f"{imageid}{postfix}.png" atlasurl = f"{atlasurl_base}/{filename}" with open(filelocation, 'wb') as handle: response = requests.get(atlasurl, stream=True, timeout=AtlasDefaults.TIMEOUT) status = response.status_code if status != 200: continue for block in response.iter_content(1024): if not block: break handle.write(block) print(f"Finished downloading {filename}") idx += 1 p = savefolder / f"{idx}.png" p.unlink(missing_ok=True) def fetch_info(servantid: int): atlasurl = f"https://api.atlasacademy.io/basic/{AtlasDefaults.REGION}/servant/{servantid}?lang=en" response = requests.get(atlasurl, timeout=AtlasDefaults.TIMEOUT) if not response.ok: print(response) data = response.json() print(f"Fetching data and sprites for {data['name']} (ID: {servantid})") def fetch_data(servantid: int) -> dict[str, SpritesheetData]: fetch_info(servantid) atlasurl = f"https://api.atlasacademy.io/raw/{AtlasDefaults.REGION}/servant/{servantid}?lore=false&expand=true&lang=en" response = requests.get(atlasurl, timeout=AtlasDefaults.TIMEOUT) if not response.ok: print(response) data: List[ReturnData] = response.json()["mstSvtScript"] spritesheet_data: dict[str, SpritesheetData] = { str(spritesheet["id"]): { "facesize": spritesheet["extendData"].get("faceSize", ExpressionDefaults.FACESIZE), "position": (spritesheet["faceX"], spritesheet["faceY"]) } for spritesheet in data } print(f"Found a total of {len(spritesheet_data)} spritesheets") return spritesheet_data