diff --git a/data b/data index 50e2b26..df34257 160000 --- a/data +++ b/data @@ -1 +1 @@ -Subproject commit 50e2b26da886b97536db8c511394145e06b2c597 +Subproject commit df34257e5adc98acfa514eb6a91aae7dc4be4733 diff --git a/main.py b/main.py index ee57529..793f819 100644 --- a/main.py +++ b/main.py @@ -26,6 +26,8 @@ from src.routes.tcg import tcg from src.routes.weaponmaterialtypes import weapon_material_types from src.routes.weapons import weapons +from src.routes.api import api + app = FastAPI(title='Genshin Impact DB') @@ -47,7 +49,7 @@ async def validation_error(_, e: ValidationError): routers = [achievements, adventure_ranks, animals, artifacts, characters, crafts, domains, elements, enemies, foods, geographies, materials, namecards, outfits, talent_material_types, weapon_material_types, weapons, gliders, - tcg] + tcg, api] for router in routers: app.include_router(router) diff --git a/src/constants.py b/src/constants.py index bfb9dea..0b91f83 100644 --- a/src/constants.py +++ b/src/constants.py @@ -1,6 +1,10 @@ -version = '1.0' -DEFAULT_QUERY = ['English'] +SERVER_VERSION = '1.0' +GAME_VERSION = '4.2.0' + +DEFAULT_QUERY = ['English', 'Russian'] DEFAULT_RESULT = 'Russian' -LANGUAGES = ['English', 'Russian', 'Japanese'] +LANGUAGES = ['English', 'French', 'German', 'Indonesian', 'Italian', + 'Japanese', 'Korean', 'Portuguese', 'Russian', 'Spanish', + 'Thai', 'Turkish', 'Vietnamese'] DATA_FOLDER = 'data' diff --git a/src/routes/api.py b/src/routes/api.py new file mode 100644 index 0000000..a8ffd45 --- /dev/null +++ b/src/routes/api.py @@ -0,0 +1,54 @@ +from fastapi import APIRouter +from subprocess import check_output + +from src.constants import GAME_VERSION, SERVER_VERSION +from src.errors import Response + + +api = APIRouter(prefix='/api', tags=['Service']) + + +@api.get('/version') +async def get_versions(): + commit_hash = git_revision_hash() + git_server = { + 'commit': git_revision_short_hash(), + 'commit_hash': commit_hash, + 'branch': git_branch(), + 'release': git_text(commit_hash) + } + + data_hash = git_revision_hash('./data') + git_data = { + 'commit': git_revision_short_hash('./data'), + 'commit_hash': data_hash, + 'branch': git_branch('./data'), + 'release': git_text(data_hash, './data') + } + reponse = {'server_version': SERVER_VERSION, + 'game_version': GAME_VERSION, + 'git_server': git_server, + 'git_data': git_data} + return Response(response=reponse) + + +def git_revision_short_hash(cwd=None) -> str: + return check_out(['git', 'rev-parse', '--short', 'HEAD'], cwd) + + +def git_revision_hash(cwd=None) -> str: + return check_out(['git', 'rev-parse', 'HEAD'], cwd) + + +def git_branch(cwd=None) -> str: + return check_out(['git', 'branch', '--show-current'], cwd) + + +def git_text(commit, cwd=None) -> str: + return check_out(['git', 'log', '--format=%B', '-n', '1', commit], cwd) + + +def check_out(args, cwd=None): + if not cwd: + cwd = './' + return check_output(args, cwd=cwd).decode('ascii').strip() diff --git a/src/routes/characters.py b/src/routes/characters.py index dc0129d..9e92749 100644 --- a/src/routes/characters.py +++ b/src/routes/characters.py @@ -1,3 +1,5 @@ +from os import walk +from typing import List from fastapi import APIRouter from src.errors import Response @@ -17,6 +19,36 @@ async def get_characters(query_field: str = 'names', query_languages: str = 'eng return Response(error=False, response=response) +@characters.get('/all', response_model_exclude_none=True) +async def get_all_characters( + result_language: str = 'ru', + images: bool = False, stats: bool = False, url: bool = False +) -> Response[List[Character]]: + result_lang = parse_result_lang(result_language) + chars = [] + version_file = load_file('version', 'characters') + images_file = load_file('image', 'characters') + stats_file = load_file('stats', 'characters') + url_file = load_file('url', 'characters') + + for _, _, files in walk(f'./data/{result_lang}/characters'): + for filename in files: + character_name = filename[:-5] + char = load_category(result_lang, 'characters', character_name) + + if images: + char.update({'images': images_file[character_name]}) + if stats: + char.update({'stats': stats_file[character_name]}) + if url: + if character_name in url_file: + char.update({'url': url_file[character_name]}) + + char.update({'version': version_file[character_name]}) + chars.append(char) + return Response(response=chars) + + @characters.get('/{name}') async def get_character( name: str, query_languages: str = 'eng', result_language: str = 'ru', diff --git a/src/types/characters.py b/src/types/characters.py index 39042f2..5082a55 100644 --- a/src/types/characters.py +++ b/src/types/characters.py @@ -25,18 +25,18 @@ class Costs(BaseModel): class Images(BaseModel): - card: str - portrait: str - icon: str - sideicon: str - cover1: str - cover2: str - hoyolab_avatar: str = Field(..., alias='hoyolab-avatar') - nameicon: str - nameiconcard: str - namegachasplash: str - namegachaslice: str - namesideicon: str + card: Optional[str] = None + portrait: Optional[str] = None + icon: Optional[str] = None + sideicon: Optional[str] = None + cover1: Optional[str] = None + cover2: Optional[str] = None + hoyolab_avatar: Optional[str] = Field(None, alias='hoyolab-avatar') + nameicon: Optional[str] = None + nameiconcard: Optional[str] = None + namegachasplash: Optional[str] = None + namegachaslice: Optional[str] = None + namesideicon: Optional[str] = None class Base(BaseModel): diff --git a/src/types/elements.py b/src/types/elements.py index ec29f66..3bd3d11 100644 --- a/src/types/elements.py +++ b/src/types/elements.py @@ -7,4 +7,4 @@ class Element(BaseModel): color: str region: str archon: str - theme: str \ No newline at end of file + theme: str