91 lines
2.9 KiB
Python
91 lines
2.9 KiB
Python
# vim: set fileencoding=utf-8
|
|
import copy
|
|
from typing import Any, Dict, Iterator, Tuple
|
|
|
|
from flask_caching import Cache
|
|
|
|
from bemani.backend.bishi import BishiBashiFactory
|
|
from bemani.common import Profile, ValidatedDict, ID, GameConstants
|
|
from bemani.data import Data, Config
|
|
from bemani.frontend.base import FrontendBase
|
|
|
|
|
|
class BishiBashiFrontend(FrontendBase):
|
|
|
|
game: GameConstants = GameConstants.BISHI_BASHI
|
|
|
|
def __init__(self, data: Data, config: Config, cache: Cache) -> None:
|
|
super().__init__(data, config, cache)
|
|
self.machines: Dict[int, str] = {}
|
|
|
|
def all_games(self) -> Iterator[Tuple[GameConstants, int, str]]:
|
|
yield from BishiBashiFactory.all_games()
|
|
|
|
def __update_value(self, oldvalue: str, newvalue: bytes) -> str:
|
|
try:
|
|
newstr = newvalue.decode("shift-jis")
|
|
except Exception:
|
|
newstr = ""
|
|
if len(newstr) == 0:
|
|
return oldvalue
|
|
else:
|
|
return newstr
|
|
|
|
def sanitize_name(self, name: str) -> str:
|
|
if len(name) == 0:
|
|
return "なし"
|
|
return name
|
|
|
|
def update_name(self, profile: Profile, name: str) -> Profile:
|
|
newprofile = copy.deepcopy(profile)
|
|
for i in range(len(newprofile["strdatas"])):
|
|
strdata = newprofile["strdatas"][i]
|
|
|
|
# Figure out the profile type
|
|
csvs = strdata.split(b",")
|
|
if len(csvs) < 2:
|
|
# Not long enough to care about
|
|
continue
|
|
datatype = csvs[1].decode("ascii")
|
|
if datatype != "IBBDAT00":
|
|
# Not the right profile type requested
|
|
continue
|
|
csvs[27] = name.encode("shift-jis")
|
|
newprofile["strdatas"][i] = b",".join(csvs)
|
|
|
|
return newprofile
|
|
|
|
def format_profile(
|
|
self, profile: Profile, playstats: ValidatedDict
|
|
) -> Dict[str, Any]:
|
|
name = "なし" # Nothing
|
|
shop = "未設定" # Not set
|
|
shop_area = "未設定" # Not set
|
|
|
|
for i in range(len(profile["strdatas"])):
|
|
strdata = profile["strdatas"][i]
|
|
|
|
# Figure out the profile type
|
|
csvs = strdata.split(b",")
|
|
if len(csvs) < 2:
|
|
# Not long enough to care about
|
|
continue
|
|
datatype = csvs[1].decode("ascii")
|
|
if datatype != "IBBDAT00":
|
|
# Not the right profile type requested
|
|
continue
|
|
|
|
name = self.__update_value(name, csvs[27])
|
|
shop = self.__update_value(shop, csvs[30])
|
|
shop_area = self.__update_value(shop_area, csvs[31])
|
|
|
|
return {
|
|
"name": name,
|
|
"extid": ID.format_extid(profile.extid),
|
|
"shop": shop,
|
|
"shop_area": shop_area,
|
|
"first_play_time": playstats.get_int("first_play_timestamp"),
|
|
"last_play_time": playstats.get_int("last_play_timestamp"),
|
|
"plays": playstats.get_int("total_plays"),
|
|
}
|