refactor: play result exporters

This commit is contained in:
283375 2024-09-28 18:48:30 +08:00
parent eab2a3e520
commit 6fb24d4907
Signed by: 283375
SSH Key Fingerprint: SHA256:UcX0qg6ZOSDOeieKPGokA5h7soykG61nz2uxuQgVLSk
5 changed files with 45 additions and 74 deletions

View File

@ -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()

View File

@ -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],
},
)

View File

@ -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,
}

View File

@ -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,
}