wacca: add region IDs and version helper classes

This commit is contained in:
Hay1tsme 2023-03-01 21:48:43 -05:00
parent 447743da4c
commit 88f6eba30b
7 changed files with 165 additions and 66 deletions

View File

@ -110,7 +110,6 @@ class WaccaBase():
def handle_user_status_get_request(self, data: Dict)-> Dict: def handle_user_status_get_request(self, data: Dict)-> Dict:
req = UserStatusGetRequest(data) req = UserStatusGetRequest(data)
resp = UserStatusGetV1Response() resp = UserStatusGetV1Response()
ver_split = req.appVersion.split(".")
profile = self.data.profile.get_profile(aime_id=req.aimeId) profile = self.data.profile.get_profile(aime_id=req.aimeId)
if profile is None: if profile is None:
@ -118,14 +117,11 @@ class WaccaBase():
resp.profileStatus = ProfileStatus.ProfileRegister resp.profileStatus = ProfileStatus.ProfileRegister
return resp.make() return resp.make()
self.logger.info(f"User preview for {req.aimeId} from {req.chipId}") self.logger.info(f"User preview for {req.aimeId} from {req.chipId}")
if profile["last_game_ver"] is None: if profile["last_game_ver"] is None:
profile_ver_split = ver_split resp.lastGameVersion = ShortVersion(str(req.appVersion))
resp.lastGameVersion = req.appVersion
else: else:
profile_ver_split = profile["last_game_ver"].split(".") resp.lastGameVersion = ShortVersion(profile["last_game_ver"])
resp.lastGameVersion = profile["last_game_ver"]
resp.userStatus.userId = profile["id"] resp.userStatus.userId = profile["id"]
resp.userStatus.username = profile["username"] resp.userStatus.username = profile["username"]
@ -145,27 +141,11 @@ class WaccaBase():
set_icon_id = self.OPTIONS_DEFAULTS["set_icon_id"] set_icon_id = self.OPTIONS_DEFAULTS["set_icon_id"]
resp.setIconId = set_icon_id resp.setIconId = set_icon_id
if req.appVersion > resp.lastGameVersion:
if int(ver_split[0]) > int(profile_ver_split[0]):
resp.versionStatus = PlayVersionStatus.VersionUpgrade resp.versionStatus = PlayVersionStatus.VersionUpgrade
elif int(ver_split[0]) < int(profile_ver_split[0]):
resp.versionStatus = PlayVersionStatus.VersionTooNew
else: elif req.appVersion < resp.lastGameVersion:
if int(ver_split[1]) > int(profile_ver_split[1]): resp.versionStatus = PlayVersionStatus.VersionTooNew
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
return resp.make() return resp.make()

View File

@ -95,18 +95,68 @@ class WaccaConstants():
"set_plate_id": 1005, # ID "set_plate_id": 1005, # ID
} }
DIFFICULTIES = {
"Normal": 1,
"Hard": 2,
"Expert": 3,
"Inferno": 4,
}
class Difficulty(Enum): class Difficulty(Enum):
NORMAL = 1 NORMAL = 1
HARD = 2 HARD = 2
EXPERT = 3 EXPERT = 3
INFERNO = 4 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 @classmethod
def game_ver_to_string(cls, ver: int): def game_ver_to_string(cls, ver: int):

View File

@ -1,10 +1,11 @@
from typing import Dict, List from typing import Dict, List
from titles.wacca.handlers.helpers import Version
from datetime import datetime from datetime import datetime
class BaseRequest(): class BaseRequest():
def __init__(self, data: Dict) -> None: def __init__(self, data: Dict) -> None:
self.requestNo: int = data["requestNo"] self.requestNo: int = data["requestNo"]
self.appVersion: str = data["appVersion"] self.appVersion: Version = Version(data["appVersion"])
self.boardId: str = data["boardId"] self.boardId: str = data["boardId"]
self.chipId: str = data["chipId"] self.chipId: str = data["chipId"]
self.params: List = data["params"] self.params: List = data["params"]

View File

@ -3,6 +3,94 @@ from enum import Enum
from titles.wacca.const import WaccaConstants 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(): class HousingInfo():
""" """
1 is lan install role, 2 is country 1 is lan install role, 2 is country

View File

@ -19,7 +19,7 @@ class UserStatusGetV1Response(BaseResponse):
self.setIconId: int = 0 self.setIconId: int = 0
self.profileStatus: ProfileStatus = ProfileStatus.ProfileGood self.profileStatus: ProfileStatus = ProfileStatus.ProfileGood
self.versionStatus: PlayVersionStatus = PlayVersionStatus.VersionGood self.versionStatus: PlayVersionStatus = PlayVersionStatus.VersionGood
self.lastGameVersion: str = "" self.lastGameVersion: ShortVersion = ShortVersion()
def make(self) -> Dict: def make(self) -> Dict:
self.params = [ self.params = [
@ -29,7 +29,7 @@ class UserStatusGetV1Response(BaseResponse):
self.profileStatus.value, self.profileStatus.value,
[ [
self.versionStatus.value, self.versionStatus.value,
self.lastGameVersion str(self.lastGameVersion)
] ]
] ]

View File

@ -18,6 +18,7 @@ from titles.wacca.lily import WaccaLily
from titles.wacca.s import WaccaS from titles.wacca.s import WaccaS
from titles.wacca.base import WaccaBase from titles.wacca.base import WaccaBase
from titles.wacca.handlers.base import BaseResponse from titles.wacca.handlers.base import BaseResponse
from titles.wacca.handlers.helpers import Version
class WaccaServlet(): class WaccaServlet():
def __init__(self, core_cfg: CoreConfig, cfg_dir: str) -> None: 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() hash = md5(json.dumps(resp, ensure_ascii=False).encode()).digest()
request.responseHeaders.addRawHeader(b"X-Wacca-Hash", hash.hex().encode()) request.responseHeaders.addRawHeader(b"X-Wacca-Hash", hash.hex().encode())
return json.dumps(resp).encode() return json.dumps(resp).encode()
version_full = []
try: try:
req_json = json.loads(request.content.getvalue()) req_json = json.loads(request.content.getvalue())
version_full = req_json["appVersion"].split(".") version_full = Version(req_json["appVersion"])
except: except:
self.logger.error(f"Failed to parse request toi {request.uri} -> {request.content.getvalue()}") self.logger.error(f"Failed to parse request toi {request.uri} -> {request.content.getvalue()}")
resp = BaseResponse() resp = BaseResponse()
@ -76,7 +75,7 @@ class WaccaServlet():
func_to_find += f"{url_split[x + start_req_idx]}_" func_to_find += f"{url_split[x + start_req_idx]}_"
func_to_find += "request" 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: if ver_search < 15000:
internal_ver = WaccaConstants.VER_WACCA internal_ver = WaccaConstants.VER_WACCA

View File

@ -59,7 +59,6 @@ class WaccaLily(WaccaS):
def handle_user_status_get_request(self, data: Dict)-> Dict: def handle_user_status_get_request(self, data: Dict)-> Dict:
req = UserStatusGetRequest(data) req = UserStatusGetRequest(data)
resp = UserStatusGetV2Response() resp = UserStatusGetV2Response()
ver_split = req.appVersion.split(".")
profile = self.data.profile.get_profile(aime_id=req.aimeId) profile = self.data.profile.get_profile(aime_id=req.aimeId)
if profile is None: if profile is None:
@ -69,11 +68,9 @@ class WaccaLily(WaccaS):
self.logger.info(f"User preview for {req.aimeId} from {req.chipId}") self.logger.info(f"User preview for {req.aimeId} from {req.chipId}")
if profile["last_game_ver"] is None: if profile["last_game_ver"] is None:
profile_ver_split = ver_split resp.lastGameVersion = ShortVersion(str(req.appVersion))
resp.lastGameVersion = req.appVersion
else: else:
profile_ver_split = profile["last_game_ver"].split(".") resp.lastGameVersion = ShortVersion(profile["last_game_ver"])
resp.lastGameVersion = profile["last_game_ver"]
resp.userStatus.userId = profile["id"] resp.userStatus.userId = profile["id"]
resp.userStatus.username = profile["username"] 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()): 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 resp.userStatus.loginConsecutiveDays = 0
if int(ver_split[0]) > int(profile_ver_split[0]): if req.appVersion > resp.lastGameVersion:
resp.versionStatus = PlayVersionStatus.VersionUpgrade resp.versionStatus = PlayVersionStatus.VersionUpgrade
elif int(ver_split[0]) < int(profile_ver_split[0]):
resp.versionStatus = PlayVersionStatus.VersionTooNew
else: elif req.appVersion < resp.lastGameVersion:
if int(ver_split[1]) > int(profile_ver_split[1]): resp.versionStatus = PlayVersionStatus.VersionTooNew
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
if profile["vip_expire_time"] is not None: if profile["vip_expire_time"] is not None:
resp.userStatus.vipExpireTime = int(profile["vip_expire_time"].timestamp()) 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: def handle_user_status_getDetail_request(self, data: Dict)-> Dict:
req = UserStatusGetDetailRequest(data) req = UserStatusGetDetailRequest(data)
ver_split = req.appVersion.split(".") if req.appVersion.minor >= 53:
if int(ver_split[1]) >= 53:
resp = UserStatusGetDetailResponseV3() resp = UserStatusGetDetailResponseV3()
else: else:
resp = UserStatusGetDetailResponseV2() resp = UserStatusGetDetailResponseV2()
@ -252,7 +233,7 @@ class WaccaLily(WaccaS):
for user_gate in profile_gates: for user_gate in profile_gates:
if user_gate["gate_id"] == gate: 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"], 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"])) user_gate["loops"],int(user_gate["last_used"].timestamp()),user_gate["mission_flag"]))
@ -266,7 +247,7 @@ class WaccaLily(WaccaS):
break break
if not added_gate: if not added_gate:
if int(ver_split[1]) >= 53: if req.appVersion.minor >= 53:
resp.gateInfo.append(GateDetailV2(gate)) resp.gateInfo.append(GateDetailV2(gate))
else: else: