# vim: set fileencoding=utf-8 from typing import Any, Dict, Iterator, List, Tuple from flask_caching import Cache from bemani.backend.museca import MusecaFactory, MusecaBase from bemani.common import GameConstants, VersionConstants, DBConstants, Profile, ValidatedDict from bemani.data import Attempt, Data, Config, Score, Song, UserID from bemani.frontend.base import FrontendBase class MusecaFrontend(FrontendBase): game: GameConstants = GameConstants.MUSECA valid_charts: List[int] = [ MusecaBase.CHART_TYPE_GREEN, MusecaBase.CHART_TYPE_ORANGE, MusecaBase.CHART_TYPE_RED, ] def __init__(self, data: Data, config: Config, cache: Cache) -> None: super().__init__(data, config, cache) def all_games(self) -> Iterator[Tuple[GameConstants, int, str]]: yield from MusecaFactory.all_games() yield ( GameConstants.MUSECA, VersionConstants.MUSECA_1_PLUS + DBConstants.OMNIMIX_VERSION_BUMP, 'MÚSECA PLUS', ) # Hard code entry for MÚSECA PLUS since entries will go in blank category otherwise def format_score(self, userid: UserID, score: Score) -> Dict[str, Any]: formatted_score = super().format_score(userid, score) formatted_score['combo'] = score.data.get_int('combo', -1) formatted_score['grade'] = { MusecaBase.GRADE_DEATH: 'Death (没)', MusecaBase.GRADE_POOR: 'Poor (拙)', MusecaBase.GRADE_MEDIOCRE: 'Mediocre (凡)', MusecaBase.GRADE_GOOD: 'Good (佳)', MusecaBase.GRADE_GREAT: 'Great (良)', MusecaBase.GRADE_EXCELLENT: 'Excellent (優)', MusecaBase.GRADE_SUPERB: 'Superb (秀)', MusecaBase.GRADE_MASTERPIECE: 'Masterpiece (傑)', MusecaBase.GRADE_PERFECT: 'Perfect (傑)', }.get(score.data.get_int('grade'), 'No Play') formatted_score['clear_type'] = { MusecaBase.CLEAR_TYPE_FAILED: 'FAILED', MusecaBase.CLEAR_TYPE_CLEARED: 'CLEARED', MusecaBase.CLEAR_TYPE_FULL_COMBO: 'FULL COMBO', }.get(score.data.get_int('clear_type'), 'FAILED') formatted_score['medal'] = score.data.get_int('clear_type') formatted_score['stats'] = score.data.get_dict('stats') return formatted_score def format_attempt(self, userid: UserID, attempt: Attempt) -> Dict[str, Any]: formatted_attempt = super().format_attempt(userid, attempt) formatted_attempt['combo'] = attempt.data.get_int('combo', -1) formatted_attempt['grade'] = { MusecaBase.GRADE_DEATH: 'Death (没)', MusecaBase.GRADE_POOR: 'Poor (拙)', MusecaBase.GRADE_MEDIOCRE: 'Mediocre (凡)', MusecaBase.GRADE_GOOD: 'Good (佳)', MusecaBase.GRADE_GREAT: 'Great (良)', MusecaBase.GRADE_EXCELLENT: 'Excellent (優)', MusecaBase.GRADE_SUPERB: 'Superb (秀)', MusecaBase.GRADE_MASTERPIECE: 'Masterpiece (傑)', MusecaBase.GRADE_PERFECT: 'Perfect (傑)', }.get(attempt.data.get_int('grade'), 'No Play') formatted_attempt['clear_type'] = { MusecaBase.CLEAR_TYPE_FAILED: 'FAILED', MusecaBase.CLEAR_TYPE_CLEARED: 'CLEARED', MusecaBase.CLEAR_TYPE_FULL_COMBO: 'FULL COMBO', }.get(attempt.data.get_int('clear_type'), 'FAILED') formatted_attempt['medal'] = attempt.data.get_int('clear_type') formatted_attempt['stats'] = attempt.data.get_dict('stats') return formatted_attempt def format_profile(self, profile: Profile, playstats: ValidatedDict) -> Dict[str, Any]: formatted_profile = super().format_profile(profile, playstats) formatted_profile['plays'] = playstats.get_int('total_plays') return formatted_profile def format_song(self, song: Song) -> Dict[str, Any]: difficulties = [0, 0, 0] difficulties[song.chart] = song.data.get_int('difficulty', 21) formatted_song = super().format_song(song) formatted_song['difficulties'] = difficulties formatted_song['category'] = song.version return formatted_song def merge_song(self, existing: Dict[str, Any], new: Song) -> Dict[str, Any]: new_song = super().merge_song(existing, new) if existing['difficulties'][new.chart] == 0: new_song['difficulties'][new.chart] = new.data.get_int('difficulty', 21) # Set the category to the earliest seen version of this song if existing['category'] > new.version: new_song['category'] = new.version return new_song