from typing import Any, Dict, List from bemani.backend.base import Base from bemani.common import ValidatedDict, GameConstants from bemani.data import Data, ArcadeID def get_game_settings(data: Data, arcadeid: ArcadeID) -> List[Dict[str, Any]]: game_lut: Dict[GameConstants, Dict[int, str]] = {} settings_lut: Dict[GameConstants, Dict[int, Dict[str, Any]]] = {} all_settings = [] for (game, version, name) in Base.all_games(): if game not in game_lut: game_lut[game] = {} settings_lut[game] = {} game_lut[game][version] = name settings_lut[game][version] = {} for (game, version, settings) in Base.all_settings(): if not settings: continue # First, set up the basics game_settings: Dict[str, Any] = { 'game': game.value, 'version': version, 'name': game_lut[game][version], 'bools': [], 'ints': [], 'strs': [], 'longstrs': [], } # Now, look up the current setting for each returned setting for setting_type, setting_unpacker in [ ('bools', "get_bool"), ('ints', "get_int"), ('strs', "get_str"), ('longstrs', "get_str"), ]: for setting in settings.get(setting_type, []): if setting['category'] not in settings_lut[game][version]: cached_setting = data.local.machine.get_settings(arcadeid, game, version, setting['category']) if cached_setting is None: cached_setting = ValidatedDict() settings_lut[game][version][setting['category']] = cached_setting current_settings = settings_lut[game][version][setting['category']] setting['value'] = getattr(current_settings, setting_unpacker)(setting['setting']) game_settings[setting_type].append(setting) # Now, include it! all_settings.append(game_settings) return sorted( all_settings, key=lambda setting: (setting['game'], setting['version']), )