import argparse import logging import pathlib import sys from typing import List from .. import __version__ from ..backend import compose from ..config import Paths, AtlasDefaults, Logging from ..utils.filesystem import rmdir from ..utils.disables import disable_tqdm LOGGER = logging.getLogger(Logging.NAME) # pylint: disable=too-few-public-methods class Arguments(argparse.Namespace): """ Default Arguments when calling the CLI """ output: str id: str cacheclear: bool filter: List[str] timeout: int quiet: bool def parse_arguments(): """ Create a parser and parse the arguments of sys.argv based on the Arguments Namespace Returns arguments and extra arguments separately """ parser = argparse.ArgumentParser( prog="atlasimagecomposer", description="CLI tool to automatically generate expression sheets for servants", epilog="If there are any issues during execution, it helps to clear the cache from time to time") parser.add_argument("--version", action="version", version=f"atlasimagecomposer {__version__}") parser.add_argument("--output", action="store", type=str, default=None, dest="output", help="Set the output location. This can be an absolute or relative path") parser.add_argument("--id", action="store", type=str, default=None, dest="id", help="Set the servantId/charaId - Skips user prompt when provided") parser.add_argument("--filter", action="extend", nargs="+", dest="filter", help='Specify one or more spritesheet ids that will be fetched') parser.add_argument("--timeout", action="store", type=int, default=None, dest="timeout", help="Set the timeout for all requests towards AtlasAcademy, default is 10s") parser.add_argument("--clear-cache", action="store_true", default=False, dest="cacheclear", help="Clear cached assets before downloading files") parser.add_argument("--quiet", "-q", action="store_true", default=False, dest="quiet", help="Disable logging output") args = Arguments() args, extra_args = parser.parse_known_args(sys.argv[1:], namespace=args) return args, extra_args def welcome(): print("-------------------------------------------------") print(" Welcome to the FGO Sprite loader and composer ") print(" developed by Firq ") print("-------------------------------------------------") def run_cli(): args, _ = parse_arguments() if args.output: Paths.OUTPUT = pathlib.Path(args.output) if args.timeout and args.timeout >= 0: AtlasDefaults.TIMEOUT = args.timeout if args.quiet: disable_tqdm() LOGGER.disabled = True else: welcome() input_id = args.id if not input_id: input_id = input("Enter servantId/charaId: ") try: t = int(input_id) if t <= 0: raise ValueError except ValueError: LOGGER.error("Servant ID has to be a valid integer above 0") sys.exit(1) input_id = int(input_id) if args.cacheclear: cachepath = Paths.IMAGES / str(input_id) if input_id > 10000: cachepath = Paths.IMAGES / "manual" / str(input_id) if cachepath.exists(): rmdir(cachepath) LOGGER.info("Successfully cleared cached assets") else: LOGGER.info("No cache to clear was found, continuing") compose(input_id, args.filter)