import json import logging import traceback from arcaea_offline.database import Database from arcaea_offline.external.arcaea.st3 import St3ScoreParser from arcaea_offline.external.arcsong import ArcsongDbParser from PySide6.QtCore import QDir, Slot from PySide6.QtWidgets import QFileDialog, QMessageBox, QWidget from ui.designer.tabs.tabDb.tabDb_Manage_ui import Ui_TabDb_Manage logger = logging.getLogger(__name__) class TabDb_Manage(Ui_TabDb_Manage, QWidget): def __init__(self, parent=None): super().__init__(parent) self.setupUi(self) @Slot() def on_syncArcSongDbButton_clicked(self): dbFile, filter = QFileDialog.getOpenFileName( self, None, "", "DB File (*.db);;*" ) if not dbFile: return try: db = Database() parser = ArcsongDbParser(dbFile) with db.sessionmaker() as session: parser.write_database(session) session.commit() QMessageBox.information(self, None, "OK") except Exception as e: logging.exception("Sync arcsong.db error") QMessageBox.critical( self, "Sync Error", "\n".join(traceback.format_exception(e)) ) @Slot() def on_importSt3Button_clicked(self): dbFile, filter = QFileDialog.getOpenFileName(self, "Select st3 file") if not dbFile: return try: db = Database() parser = St3ScoreParser(dbFile) logger.info( f"Got {len(parser.parse())} items from {dbFile}, writing into database..." ) with db.sessionmaker() as session: parser.write_database(session) session.commit() QMessageBox.information(self, None, "OK") except Exception as e: logging.exception("import st3 error") QMessageBox.critical( self, "Import Error", "\n".join(traceback.format_exception(e)) ) @Slot() def on_exportScoresButton_clicked(self): scores = Database().export_scores() version = Database().version() content = json.dumps(scores, ensure_ascii=False) exportLocation, _filter = QFileDialog.getSaveFileName( self, "Save your scores to...", QDir.current().filePath(f"arcaea-offline-scores-v{version}.json"), "JSON (*.json);;*", ) with open(exportLocation, "w", encoding="utf-8") as f: f.write(content)