mirror of
https://github.com/283375/arcaea-offline.git
synced 2025-04-11 10:30:18 +00:00
refactor: play result exporters
This commit is contained in:
parent
eab2a3e520
commit
6fb24d4907
@ -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()
|
||||
|
@ -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],
|
||||
},
|
||||
)
|
40
src/arcaea_offline/external/exporters/defv2/play_result.py
vendored
Normal file
40
src/arcaea_offline/external/exporters/defv2/play_result.py
vendored
Normal 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,
|
||||
}
|
38
src/arcaea_offline/external/exports/exporters.py
vendored
38
src/arcaea_offline/external/exports/exporters.py
vendored
@ -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,
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user