diva: add register, fixes, start still busted

This commit is contained in:
Kevin Trocolli
2023-10-04 02:18:04 -04:00
parent 7322bc60dc
commit 53c74c6511
4 changed files with 125 additions and 84 deletions

View File

@@ -2,6 +2,16 @@ from urllib import parse
from datetime import datetime
from typing import Union, Dict
def lazy_http_form_parse(src: Union[str, bytes]) -> Dict[bytes, bytes]:
out = {}
if type(src) == str:
src = src.encode()
for param in src.split(b"&"):
kvp = param.split(b"=")
out[parse.unquote(kvp[0])] = parse.unquote(kvp[1])
return out
class DivaRequestParseException(Exception):
"""
@@ -30,7 +40,7 @@ class BaseBinaryRequest:
f"req_id not in request data {self.raw_dict}"
)
for k, v in self.raw_dict:
for k, v in self.raw_dict.items():
setattr(self, k, v)
@@ -45,53 +55,56 @@ class BaseRequest:
def __init__(self, raw: Union[str, bytes]) -> None:
self.raw = raw
self.raw_dict: Dict[bytes, bytes] = dict(parse.parse_qsl(raw))
try:
self.raw_dict: Dict[str, str] = lazy_http_form_parse(raw)
except UnicodeDecodeError as e:
raise DivaRequestParseException(f"Could not decode data {raw} - {e}")
if b"cmd" not in self.raw_dict:
if "cmd" not in self.raw_dict:
raise DivaRequestParseException(f"cmd not in request data {self.raw_dict}")
if b"req_id" not in self.raw_dict:
if "req_id" not in self.raw_dict:
raise DivaRequestParseException(
f"req_id not in request data {self.raw_dict}"
)
if b"place_id" not in self.raw_dict:
if "place_id" not in self.raw_dict:
raise DivaRequestParseException(
f"place_id not in request data {self.raw_dict}"
)
if b"start_up_mode" not in self.raw_dict:
if "start_up_mode" not in self.raw_dict:
raise DivaRequestParseException(
f"start_up_mode not in request data {self.raw_dict}"
)
if b"cmm_dly_mod" not in self.raw_dict:
if "cmm_dly_mod" not in self.raw_dict:
raise DivaRequestParseException(
f"cmm_dly_mod not in request data {self.raw_dict}"
)
if b"cmm_dly_sec" not in self.raw_dict:
if "cmm_dly_sec" not in self.raw_dict:
raise DivaRequestParseException(
f"cmm_dly_sec not in request data {self.raw_dict}"
)
if b"cmm_err_mod" not in self.raw_dict:
if "cmm_err_mod" not in self.raw_dict:
raise DivaRequestParseException(
f"cmm_err_mod not in request data {self.raw_dict}"
)
if b"region_code" not in self.raw_dict:
if "region_code" not in self.raw_dict:
raise DivaRequestParseException(
f"region_code not in request data {self.raw_dict}"
)
if b"time_stamp" not in self.raw_dict:
if "time_stamp" not in self.raw_dict:
raise DivaRequestParseException(
f"time_stamp not in request data {self.raw_dict}"
)
for k, v in self.raw_dict.items():
setattr(self, k.decode(), v.decode())
setattr(self, k, v)
self.place_id = int(self.place_id)
self.start_up_mode = int(self.start_up_mode)
@@ -110,7 +123,13 @@ class BaseResponse:
self.stat = "ok"
def make(self) -> str:
return f"cmd={self.cmd}&req_id={self.req_id}&stat={self.stat}"
ret = ""
for k, v in vars(self).items():
ret += f"{k}={v}&"
if ret[-1] == "&":
ret = ret[:-1]
return ret
class GameInitRequest(BaseRequest):
def __init__(self, raw: Union[str, bytes]) -> None:

View File

@@ -27,21 +27,7 @@ class PreStartRequest(BaseRequest):
class PreStartResponse(BaseResponse):
player_name: str
sort_kind: str
lv_efct_id: str
lv_plt_id: str
lv_str: str
lv_num: str
lv_pnt: str
vcld_pts: str
skn_eqp: str
btn_se_eqp: str
sld_se_eqp: str
chn_sld_se_eqp: str
sldr_tch_se_eqp: str
passwd_stat: str
mdl_eqp_tm: str
def __init__(self, cmd_id: str, req_id: int, pd_id: int) -> None:
super().__init__(cmd_id, req_id)
@@ -51,6 +37,21 @@ class PreStartResponse(BaseResponse):
self.nblss_ltt_stts = -1
self.nblss_ltt_tckt = -1
self.nblss_ltt_is_opn = -1
self.player_name: str = ""
self.sort_kind: str = ""
self.lv_efct_id: str = ""
self.lv_plt_id: str = ""
self.lv_str: str = ""
self.lv_num: str = ""
self.lv_pnt: str = ""
self.vcld_pts: str = ""
self.skn_eqp: str = ""
self.btn_se_eqp: str = ""
self.sld_se_eqp: str = ""
self.chn_sld_se_eqp: str = ""
self.sldr_tch_se_eqp: str = ""
self.passwd_stat: str = ""
self.mdl_eqp_tm: str = ""
# Ideally this would be a real array that would get converted later
# But this is how it's stored in the db, so w/e for now
self.mdl_eqp_ary = "-999,-999,-999"
@@ -100,6 +101,11 @@ class StartResponse(BaseResponse):
self.dsp_intrm_rnk: int = 0
self.dsp_clr_sts: int = 0
self.rgo_sts: int = 0
self.cv_cid: str = "-1,-1,-1,-1"
self.cv_sc: str = "-1,-1,-1,-1"
#self.cv_bv: str = "-1,-1,-1,-1"
self.cv_bv: str = "-1,-1,-1,-1"
self.cv_bf: str = "-1,-1,-1,-1"
self.my_qst_id: str = ",".join(["-1"] * 25)
self.my_qst_sts: str = ",".join("0" * 5) + "," + ",".join(["-1"] * 20)
self.my_qst_prgrs: str = ",".join("0" * 5) + "," + ",".join(["-1"] * 20)
@@ -109,3 +115,28 @@ class StartResponse(BaseResponse):
self.mdl_eqp_ary = ",".join(["-999"] * 3)
self.c_itm_eqp_ary = ",".join(["-999"] * 12)
self.ms_itm_flg_ary = ",".join(["1"] * 12)
class RegisterRequest(BaseRequest):
pmm: str
idm: str
mmgameid: str
mmuid: str
a_code: str
aime_a_code: str
player_name: str
passwd: str
def __init__(self, raw: str) -> None:
super().__init__(raw)
try:
self.aime_id = int(self.aime_id)
self.key_obj_type = int(self.key_obj_type)
except AttributeError as e:
raise DivaRequestParseException(f"RegisterRequest: {e}")
class RegisterResponse(BaseResponse):
def __init__(self, cmd_id: str, req_id: int, pv_id: int) -> None:
super().__init__(cmd_id, req_id)
self.cd_adm_result: int = 1
self.pd_id: int = pv_id