From 54749c8df2dd664896e3718d5587ad7f5db89391 Mon Sep 17 00:00:00 2001 From: 283375 Date: Tue, 27 Feb 2024 17:23:43 +0800 Subject: [PATCH] feat(db): DEF v2 scores export supporting --- src/arcaea_offline/database.py | 11 ++++++- .../external/exports/__init__.py | 2 +- .../external/exports/exporters.py | 20 +++++++++++- src/arcaea_offline/external/exports/types.py | 31 ++++++++++++++++++- 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/src/arcaea_offline/database.py b/src/arcaea_offline/database.py index 7942915..f689ba8 100644 --- a/src/arcaea_offline/database.py +++ b/src/arcaea_offline/database.py @@ -6,7 +6,7 @@ from sqlalchemy import Engine, func, inspect, select from sqlalchemy.orm import DeclarativeBase, InstrumentedAttribute, sessionmaker from .external.arcsong.arcsong_json import ArcSongJsonBuilder -from .external.exports import ScoreExport, exporters +from .external.exports import ArcaeaOfflineDEFV2_Score, ScoreExport, exporters from .models.config import ConfigBase, Property from .models.scores import ( CalculatedPotential, @@ -410,6 +410,15 @@ class Database(metaclass=Singleton): scores = self.get_scores() return [exporters.score(score) for score in scores] + def export_scores_def_v2(self) -> ArcaeaOfflineDEFV2_Score: + scores = self.get_scores() + return { + "$schema": "https://arcaeaoffline.sevive.xyz/schemas/def/v2/score.schema.json", + "type": "score", + "version": 2, + "scores": [exporters.score_def_v2(score) for score in scores], + } + def generate_arcsong(self): with self.sessionmaker() as session: arcsong = ArcSongJsonBuilder(session).generate_arcsong_json() diff --git a/src/arcaea_offline/external/exports/__init__.py b/src/arcaea_offline/external/exports/__init__.py index 5f34d9f..a32742e 100644 --- a/src/arcaea_offline/external/exports/__init__.py +++ b/src/arcaea_offline/external/exports/__init__.py @@ -1,2 +1,2 @@ from . import exporters -from .types import ScoreExport +from .types import ArcaeaOfflineDEFV2_Score, ScoreExport diff --git a/src/arcaea_offline/external/exports/exporters.py b/src/arcaea_offline/external/exports/exporters.py index 35ec9c5..8786843 100644 --- a/src/arcaea_offline/external/exports/exporters.py +++ b/src/arcaea_offline/external/exports/exporters.py @@ -1,5 +1,5 @@ from ...models import Score -from .types import ScoreExport +from .types import ArcaeaOfflineDEFV2_ScoreItem, ScoreExport def score(score: Score) -> ScoreExport: @@ -17,3 +17,21 @@ def score(score: Score) -> ScoreExport: "clear_type": score.clear_type, "comment": score.comment, } + + +def score_def_v2(score: Score) -> ArcaeaOfflineDEFV2_ScoreItem: + return { + "id": score.id, + "songId": score.song_id, + "ratingClass": score.rating_class, + "score": score.score, + "pure": score.pure, + "far": score.far, + "lost": score.lost, + "date": score.date, + "maxRecall": score.max_recall, + "modifier": score.modifier, + "clearType": score.clear_type, + "source": None, + "comment": score.comment, + } diff --git a/src/arcaea_offline/external/exports/types.py b/src/arcaea_offline/external/exports/types.py index a5c3646..6260c03 100644 --- a/src/arcaea_offline/external/exports/types.py +++ b/src/arcaea_offline/external/exports/types.py @@ -1,4 +1,4 @@ -from typing import Optional, TypedDict +from typing import List, Literal, Optional, TypedDict class ScoreExport(TypedDict): @@ -14,3 +14,32 @@ class ScoreExport(TypedDict): modifier: Optional[int] clear_type: Optional[int] comment: Optional[str] + + +class ArcaeaOfflineDEFV2_ScoreItem(TypedDict, total=False): + id: Optional[int] + songId: str + ratingClass: int + score: int + pure: Optional[int] + far: Optional[int] + lost: Optional[int] + date: Optional[int] + maxRecall: Optional[int] + modifier: Optional[int] + clearType: Optional[int] + source: Optional[str] + comment: Optional[str] + + +ArcaeaOfflineDEFV2_Score = TypedDict( + "ArcaeaOfflineDEFV2_Score", + { + "$schema": Literal[ + "https://arcaeaoffline.sevive.xyz/schemas/def/v2/score.schema.json" + ], + "type": Literal["score"], + "version": Literal[2], + "scores": List[ArcaeaOfflineDEFV2_ScoreItem], + }, +)