diff --git a/src/arcaea_offline/database/db.py b/src/arcaea_offline/database/db.py index 157aff4..f4ad1f8 100644 --- a/src/arcaea_offline/database/db.py +++ b/src/arcaea_offline/database/db.py @@ -1,13 +1,11 @@ import logging import math -from typing import Iterable, List, Optional, Type, Union +from typing import Iterable, Optional, Type, Union from sqlalchemy import Engine, func, inspect, select from sqlalchemy.orm import DeclarativeBase, InstrumentedAttribute, sessionmaker from arcaea_offline.external.arcsong.arcsong_json import ArcSongJsonBuilder -from arcaea_offline.external.exports import exporters -from arcaea_offline.external.exports.types import ArcaeaOfflineDEFV2_Score, ScoreExport from arcaea_offline.singleton import Singleton from .models.v4.config import ConfigBase, Property @@ -407,20 +405,6 @@ class Database(metaclass=Singleton): # endregion # region export - - def export_scores(self) -> List[ScoreExport]: - 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/exporters/defv2/__init__.py similarity index 100% rename from src/arcaea_offline/external/exports/__init__.py rename to src/arcaea_offline/external/exporters/defv2/__init__.py diff --git a/src/arcaea_offline/external/exports/types.py b/src/arcaea_offline/external/exporters/defv2/definitions.py similarity index 53% rename from src/arcaea_offline/external/exports/types.py rename to src/arcaea_offline/external/exporters/defv2/definitions.py index 6260c03..6d909c9 100644 --- a/src/arcaea_offline/external/exports/types.py +++ b/src/arcaea_offline/external/exporters/defv2/definitions.py @@ -1,22 +1,7 @@ from typing import List, Literal, Optional, TypedDict -class ScoreExport(TypedDict): - id: int - song_id: str - rating_class: int - score: int - pure: Optional[int] - far: Optional[int] - lost: Optional[int] - date: Optional[int] - max_recall: Optional[int] - modifier: Optional[int] - clear_type: Optional[int] - comment: Optional[str] - - -class ArcaeaOfflineDEFV2_ScoreItem(TypedDict, total=False): +class ArcaeaOfflineDEFv2PlayResultItem(TypedDict, total=False): id: Optional[int] songId: str ratingClass: int @@ -32,14 +17,14 @@ class ArcaeaOfflineDEFV2_ScoreItem(TypedDict, total=False): comment: Optional[str] -ArcaeaOfflineDEFV2_Score = TypedDict( - "ArcaeaOfflineDEFV2_Score", +ArcaeaOfflineDEFv2PlayResultRoot = TypedDict( + "ArcaeaOfflineDEFv2PlayResultRoot", { "$schema": Literal[ "https://arcaeaoffline.sevive.xyz/schemas/def/v2/score.schema.json" ], "type": Literal["score"], "version": Literal[2], - "scores": List[ArcaeaOfflineDEFV2_ScoreItem], + "scores": List[ArcaeaOfflineDEFv2PlayResultItem], }, ) diff --git a/src/arcaea_offline/external/exporters/defv2/play_result.py b/src/arcaea_offline/external/exporters/defv2/play_result.py new file mode 100644 index 0000000..c752b2b --- /dev/null +++ b/src/arcaea_offline/external/exporters/defv2/play_result.py @@ -0,0 +1,40 @@ +from typing import List + +from arcaea_offline.database.models.v5 import PlayResult + +from .definitions import ( + ArcaeaOfflineDEFv2PlayResultItem, + ArcaeaOfflineDEFv2PlayResultRoot, +) + + +class ArcaeaOfflineDEFv2PlayResultExporter: + def export(self, items: List[PlayResult]) -> ArcaeaOfflineDEFv2PlayResultRoot: + export_items = [] + for item in items: + export_item: ArcaeaOfflineDEFv2PlayResultItem = {} + + export_item["id"] = item.id + export_item["songId"] = item.song_id + export_item["ratingClass"] = item.rating_class.value + export_item["score"] = item.score + export_item["pure"] = item.pure + export_item["far"] = item.far + export_item["lost"] = item.lost + export_item["date"] = item.date + export_item["maxRecall"] = item.max_recall + export_item["modifier"] = ( + item.modifier.value if item.modifier is not None else None + ) + export_item["clearType"] = ( + item.clear_type.value if item.clear_type is not None else None + ) + export_item["source"] = "https://arcaeaoffline.sevive.xyz/python" + export_item["comment"] = item.comment + + return { + "$schema": "https://arcaeaoffline.sevive.xyz/schemas/def/v2/score.schema.json", + "type": "score", + "version": 2, + "scores": export_items, + } diff --git a/src/arcaea_offline/external/exports/exporters.py b/src/arcaea_offline/external/exports/exporters.py deleted file mode 100644 index dbee972..0000000 --- a/src/arcaea_offline/external/exports/exporters.py +++ /dev/null @@ -1,38 +0,0 @@ -from arcaea_offline.database.models.v4 import Score - -from .types import ArcaeaOfflineDEFV2_ScoreItem, ScoreExport - - -def score(score: Score) -> ScoreExport: - return { - "id": score.id, - "song_id": score.song_id, - "rating_class": score.rating_class, - "score": score.score, - "pure": score.pure, - "far": score.far, - "lost": score.lost, - "date": score.date, - "max_recall": score.max_recall, - "modifier": score.modifier, - "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, - }