From 88f6eba30bf1c86f53623cfbe0c28b98ed20a0da Mon Sep 17 00:00:00 2001 From: Hay1tsme Date: Wed, 1 Mar 2023 21:48:43 -0500 Subject: [PATCH] wacca: add region IDs and version helper classes --- titles/wacca/base.py | 30 ++-------- titles/wacca/const.py | 64 +++++++++++++++++--- titles/wacca/handlers/base.py | 3 +- titles/wacca/handlers/helpers.py | 88 ++++++++++++++++++++++++++++ titles/wacca/handlers/user_status.py | 4 +- titles/wacca/index.py | 7 +-- titles/wacca/lily.py | 35 +++-------- 7 files changed, 165 insertions(+), 66 deletions(-) diff --git a/titles/wacca/base.py b/titles/wacca/base.py index 5bb83ae..535048f 100644 --- a/titles/wacca/base.py +++ b/titles/wacca/base.py @@ -110,7 +110,6 @@ class WaccaBase(): def handle_user_status_get_request(self, data: Dict)-> Dict: req = UserStatusGetRequest(data) resp = UserStatusGetV1Response() - ver_split = req.appVersion.split(".") profile = self.data.profile.get_profile(aime_id=req.aimeId) if profile is None: @@ -118,14 +117,11 @@ class WaccaBase(): resp.profileStatus = ProfileStatus.ProfileRegister return resp.make() - self.logger.info(f"User preview for {req.aimeId} from {req.chipId}") if profile["last_game_ver"] is None: - profile_ver_split = ver_split - resp.lastGameVersion = req.appVersion + resp.lastGameVersion = ShortVersion(str(req.appVersion)) else: - profile_ver_split = profile["last_game_ver"].split(".") - resp.lastGameVersion = profile["last_game_ver"] + resp.lastGameVersion = ShortVersion(profile["last_game_ver"]) resp.userStatus.userId = profile["id"] resp.userStatus.username = profile["username"] @@ -145,27 +141,11 @@ class WaccaBase(): set_icon_id = self.OPTIONS_DEFAULTS["set_icon_id"] resp.setIconId = set_icon_id - - if int(ver_split[0]) > int(profile_ver_split[0]): + if req.appVersion > resp.lastGameVersion: resp.versionStatus = PlayVersionStatus.VersionUpgrade - - elif int(ver_split[0]) < int(profile_ver_split[0]): - resp.versionStatus = PlayVersionStatus.VersionTooNew - else: - if int(ver_split[1]) > int(profile_ver_split[1]): - resp.versionStatus = PlayVersionStatus.VersionUpgrade - - elif int(ver_split[1]) < int(profile_ver_split[1]): - resp.versionStatus = PlayVersionStatus.VersionTooNew - - else: - if int(ver_split[2]) > int(profile_ver_split[2]): - resp.versionStatus = PlayVersionStatus.VersionUpgrade - - - elif int(ver_split[2]) < int(profile_ver_split[2]): - resp.versionStatus = PlayVersionStatus.VersionTooNew + elif req.appVersion < resp.lastGameVersion: + resp.versionStatus = PlayVersionStatus.VersionTooNew return resp.make() diff --git a/titles/wacca/const.py b/titles/wacca/const.py index 910f313..0590f5f 100644 --- a/titles/wacca/const.py +++ b/titles/wacca/const.py @@ -95,18 +95,68 @@ class WaccaConstants(): "set_plate_id": 1005, # ID } - DIFFICULTIES = { - "Normal": 1, - "Hard": 2, - "Expert": 3, - "Inferno": 4, - } - class Difficulty(Enum): NORMAL = 1 HARD = 2 EXPERT = 3 INFERNO = 4 + + class Region(Enum): + NONE = 0 + HOKKAIDO = 1 + AOMORI = 2 + IWATE = 3 + MIYAGI = 4 + AKITA = 5 + YAMAGATA = 6 + FUKUSHIMA = 7 + IBARAKI = 8 + TOCHIGI = 9 + GUNMA = 10 + SAITAMA = 11 + CHIBA = 12 + TOKYO = 13 + KANAGAWA = 14 + NIIGATA = 15 + TOYAMA = 16 + ISHIKAWA = 17 + FUKUI = 18 + YAMANASHI = 19 + NAGANO = 20 + GIFU = 21 + SHIZUOKA = 22 + AICHI = 23 + MIE = 24 + SHIGA = 25 + KYOTO = 26 + OSAKA = 27 + HYOGO = 28 + NARA = 29 + WAKAYAMA = 30 + TOTTORI = 31 + SHIMANE = 32 + OKAYAMA = 33 + HIROSHIMA = 34 + YAMAGUCHI = 35 + TOKUSHIMA = 36 + KAGAWA = 37 + EHIME = 38 + KOCHI = 39 + FUKUOKA = 40 + SAGA = 41 + NAGASAKI = 42 + KUMAMOTO = 43 + OITA = 44 + MIYAZAKI = 45 + KAGOSHIMA = 46 + OKINAWA = 47 + UNITED_STATES = 48 + TAIWAN = 49 + HONG_KONG = 50 + SINGAPORE = 51 + KOREA = 52 + + VALID_COUNTRIES = set(["JPN", "USA", "KOR", "HKG", "SGP"]) @classmethod def game_ver_to_string(cls, ver: int): diff --git a/titles/wacca/handlers/base.py b/titles/wacca/handlers/base.py index 1e1197b..d7a2fb2 100644 --- a/titles/wacca/handlers/base.py +++ b/titles/wacca/handlers/base.py @@ -1,10 +1,11 @@ from typing import Dict, List +from titles.wacca.handlers.helpers import Version from datetime import datetime class BaseRequest(): def __init__(self, data: Dict) -> None: self.requestNo: int = data["requestNo"] - self.appVersion: str = data["appVersion"] + self.appVersion: Version = Version(data["appVersion"]) self.boardId: str = data["boardId"] self.chipId: str = data["chipId"] self.params: List = data["params"] diff --git a/titles/wacca/handlers/helpers.py b/titles/wacca/handlers/helpers.py index f476216..752a656 100644 --- a/titles/wacca/handlers/helpers.py +++ b/titles/wacca/handlers/helpers.py @@ -3,6 +3,94 @@ from enum import Enum from titles.wacca.const import WaccaConstants +class ShortVersion: + def __init__(self, version: str = "", major = 1, minor = 0, patch = 0) -> None: + split = version.split(".") + if len(split) >= 3: + self.major = int(split[0]) + self.minor = int(split[1]) + self.patch = int(split[2]) + + else: + self.major = major + self.minor = minor + self.patch = patch + + def __str__(self) -> str: + return f"{self.major}.{self.minor}.{self.patch}" + + def __int__(self) -> int: + return (self.major * 10000) + (self.minor * 100) + self.patch + + def __eq__(self, other: "ShortVersion"): + return self.major == other.major and self.minor == other.minor and self.patch == other.patch + + def __gt__(self, other: "ShortVersion"): + if self.major > other.major: + return True + elif self.major == other.major: + if self.minor > other.minor: + return True + elif self.minor == other.minor: + if self.patch > other.patch: + return True + + return False + + def __ge__(self, other: "ShortVersion"): + if self.major > other.major: + return True + elif self.major == other.major: + if self.minor > other.minor: + return True + elif self.minor == other.minor: + if self.patch > other.patch or self.patch == other.patch: + return True + + return False + + def __lt__(self, other: "ShortVersion"): + if self.major < other.major: + return True + elif self.major == other.major: + if self.minor < other.minor: + return True + elif self.minor == other.minor: + if self.patch < other.patch: + return True + + return False + + def __le__(self, other: "ShortVersion"): + if self.major < other.major: + return True + elif self.major == other.major: + if self.minor < other.minor: + return True + elif self.minor == other.minor: + if self.patch < other.patch or self.patch == other.patch: + return True + + return False + +class Version(ShortVersion): + def __init__(self, version = "", major = 1, minor = 0, patch = 0, country = "JPN", build = 0, role = "C") -> None: + super().__init__(version, major, minor, patch) + split = version.split(".") + if len(split) >= 6: + self.country = split[3] + self.build = int(split[4]) + self.role = split[5] + + else: + self.country = country + self.build = build + self.role = role + + def __str__(self) -> str: + return f"{self.major}.{self.minor}.{self.patch}.{self.country}.{self.role}.{self.build}" + + class HousingInfo(): """ 1 is lan install role, 2 is country diff --git a/titles/wacca/handlers/user_status.py b/titles/wacca/handlers/user_status.py index 103f878..b852dd1 100644 --- a/titles/wacca/handlers/user_status.py +++ b/titles/wacca/handlers/user_status.py @@ -19,7 +19,7 @@ class UserStatusGetV1Response(BaseResponse): self.setIconId: int = 0 self.profileStatus: ProfileStatus = ProfileStatus.ProfileGood self.versionStatus: PlayVersionStatus = PlayVersionStatus.VersionGood - self.lastGameVersion: str = "" + self.lastGameVersion: ShortVersion = ShortVersion() def make(self) -> Dict: self.params = [ @@ -29,7 +29,7 @@ class UserStatusGetV1Response(BaseResponse): self.profileStatus.value, [ self.versionStatus.value, - self.lastGameVersion + str(self.lastGameVersion) ] ] diff --git a/titles/wacca/index.py b/titles/wacca/index.py index 963fa7a..37d3f9e 100644 --- a/titles/wacca/index.py +++ b/titles/wacca/index.py @@ -18,6 +18,7 @@ from titles.wacca.lily import WaccaLily from titles.wacca.s import WaccaS from titles.wacca.base import WaccaBase from titles.wacca.handlers.base import BaseResponse +from titles.wacca.handlers.helpers import Version class WaccaServlet(): def __init__(self, core_cfg: CoreConfig, cfg_dir: str) -> None: @@ -55,12 +56,10 @@ class WaccaServlet(): hash = md5(json.dumps(resp, ensure_ascii=False).encode()).digest() request.responseHeaders.addRawHeader(b"X-Wacca-Hash", hash.hex().encode()) return json.dumps(resp).encode() - - version_full = [] try: req_json = json.loads(request.content.getvalue()) - version_full = req_json["appVersion"].split(".") + version_full = Version(req_json["appVersion"]) except: self.logger.error(f"Failed to parse request toi {request.uri} -> {request.content.getvalue()}") resp = BaseResponse() @@ -76,7 +75,7 @@ class WaccaServlet(): func_to_find += f"{url_split[x + start_req_idx]}_" func_to_find += "request" - ver_search = (int(version_full[0]) * 10000) + (int(version_full[1]) * 100) + int(version_full[2]) + ver_search = int(version_full) if ver_search < 15000: internal_ver = WaccaConstants.VER_WACCA diff --git a/titles/wacca/lily.py b/titles/wacca/lily.py index cf5fd43..77d37de 100644 --- a/titles/wacca/lily.py +++ b/titles/wacca/lily.py @@ -59,7 +59,6 @@ class WaccaLily(WaccaS): def handle_user_status_get_request(self, data: Dict)-> Dict: req = UserStatusGetRequest(data) resp = UserStatusGetV2Response() - ver_split = req.appVersion.split(".") profile = self.data.profile.get_profile(aime_id=req.aimeId) if profile is None: @@ -69,11 +68,9 @@ class WaccaLily(WaccaS): self.logger.info(f"User preview for {req.aimeId} from {req.chipId}") if profile["last_game_ver"] is None: - profile_ver_split = ver_split - resp.lastGameVersion = req.appVersion + resp.lastGameVersion = ShortVersion(str(req.appVersion)) else: - profile_ver_split = profile["last_game_ver"].split(".") - resp.lastGameVersion = profile["last_game_ver"] + resp.lastGameVersion = ShortVersion(profile["last_game_ver"]) resp.userStatus.userId = profile["id"] resp.userStatus.username = profile["username"] @@ -103,26 +100,11 @@ class WaccaLily(WaccaS): if profile["last_login_date"].timestamp() < int((datetime.now().replace(hour=0,minute=0,second=0,microsecond=0) - timedelta(days=1)).timestamp()): resp.userStatus.loginConsecutiveDays = 0 - if int(ver_split[0]) > int(profile_ver_split[0]): + if req.appVersion > resp.lastGameVersion: resp.versionStatus = PlayVersionStatus.VersionUpgrade - - elif int(ver_split[0]) < int(profile_ver_split[0]): - resp.versionStatus = PlayVersionStatus.VersionTooNew - else: - if int(ver_split[1]) > int(profile_ver_split[1]): - resp.versionStatus = PlayVersionStatus.VersionUpgrade - - elif int(ver_split[1]) < int(profile_ver_split[1]): - resp.versionStatus = PlayVersionStatus.VersionTooNew - - else: - if int(ver_split[2]) > int(profile_ver_split[2]): - resp.versionStatus = PlayVersionStatus.VersionUpgrade - - - elif int(ver_split[2]) < int(profile_ver_split[2]): - resp.versionStatus = PlayVersionStatus.VersionTooNew + elif req.appVersion < resp.lastGameVersion: + resp.versionStatus = PlayVersionStatus.VersionTooNew if profile["vip_expire_time"] is not None: resp.userStatus.vipExpireTime = int(profile["vip_expire_time"].timestamp()) @@ -178,8 +160,7 @@ class WaccaLily(WaccaS): def handle_user_status_getDetail_request(self, data: Dict)-> Dict: req = UserStatusGetDetailRequest(data) - ver_split = req.appVersion.split(".") - if int(ver_split[1]) >= 53: + if req.appVersion.minor >= 53: resp = UserStatusGetDetailResponseV3() else: resp = UserStatusGetDetailResponseV2() @@ -252,7 +233,7 @@ class WaccaLily(WaccaS): for user_gate in profile_gates: if user_gate["gate_id"] == gate: - if int(ver_split[1]) >= 53: + if req.appVersion.minor >= 53: resp.gateInfo.append(GateDetailV2(user_gate["gate_id"],user_gate["page"],user_gate["progress"], user_gate["loops"],int(user_gate["last_used"].timestamp()),user_gate["mission_flag"])) @@ -266,7 +247,7 @@ class WaccaLily(WaccaS): break if not added_gate: - if int(ver_split[1]) >= 53: + if req.appVersion.minor >= 53: resp.gateInfo.append(GateDetailV2(gate)) else: