mirror of
https://github.com/283375/arcaea-offline.git
synced 2025-04-19 06:00:18 +00:00
74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
import logging
|
|
import sqlite3
|
|
from typing import List
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.orm import Session
|
|
|
|
from ...models.scores import Score
|
|
from .common import ArcaeaParser, fix_timestamp
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class St3ScoreParser(ArcaeaParser):
|
|
def parse(self) -> List[Score]:
|
|
items = []
|
|
with sqlite3.connect(self.filepath) as st3_conn:
|
|
cursor = st3_conn.cursor()
|
|
db_scores = cursor.execute(
|
|
"SELECT songId, songDifficulty, score, perfectCount, nearCount, missCount, "
|
|
"date, modifier FROM scores"
|
|
).fetchall()
|
|
for (
|
|
song_id,
|
|
rating_class,
|
|
score,
|
|
pure,
|
|
far,
|
|
lost,
|
|
date,
|
|
modifier,
|
|
) in db_scores:
|
|
clear_type = cursor.execute(
|
|
"SELECT clearType FROM cleartypes WHERE songId = ? AND songDifficulty = ?",
|
|
(song_id, rating_class),
|
|
).fetchone()[0]
|
|
|
|
items.append(
|
|
Score(
|
|
song_id=song_id,
|
|
rating_class=rating_class,
|
|
score=score,
|
|
pure=pure,
|
|
far=far,
|
|
lost=lost,
|
|
date=fix_timestamp(date),
|
|
modifier=modifier,
|
|
clear_type=clear_type,
|
|
comment="Parsed from st3",
|
|
)
|
|
)
|
|
|
|
return items
|
|
|
|
def write_database(self, session: Session, *, skip_duplicate=True):
|
|
parsed_scores = self.parse()
|
|
for parsed_score in parsed_scores:
|
|
query_score = session.scalar(
|
|
select(Score).where(
|
|
(Score.song_id == parsed_score.song_id)
|
|
& (Score.rating_class == parsed_score.rating_class)
|
|
& (Score.score == parsed_score.score)
|
|
)
|
|
)
|
|
|
|
if query_score and skip_duplicate:
|
|
logger.info(
|
|
"%r skipped because potential duplicate item %r found.",
|
|
parsed_score,
|
|
query_score,
|
|
)
|
|
continue
|
|
session.add(parsed_score)
|