1
0
mirror of synced 2024-11-28 07:50:48 +01:00

wacca: add region logic

This commit is contained in:
Hay1tsme 2023-03-01 22:27:33 -05:00
parent e46c8e7dbd
commit e961c1dfb3
5 changed files with 63 additions and 59 deletions

View File

@ -73,9 +73,9 @@ class WaccaBase():
prefecture_name = inflection.underscore(game_cfg.server.prefecture_name).replace(' ', '_').upper() prefecture_name = inflection.underscore(game_cfg.server.prefecture_name).replace(' ', '_').upper()
if prefecture_name not in [region.name for region in WaccaConstants.Region]: if prefecture_name not in [region.name for region in WaccaConstants.Region]:
self.logger.warning(f"Invalid prefecture name {game_cfg.server.prefecture_name} in config file") self.logger.warning(f"Invalid prefecture name {game_cfg.server.prefecture_name} in config file")
self.region_id = 1 self.region_id = WaccaConstants.Region.HOKKAIDO
else: else:
self.region_id = int(WaccaConstants.Region[prefecture_name].value) self.region_id = WaccaConstants.Region[prefecture_name]
def handle_housing_get_request(self, data: Dict) -> Dict: def handle_housing_get_request(self, data: Dict) -> Dict:
req = BaseRequest(data) req = BaseRequest(data)
@ -91,17 +91,12 @@ class WaccaBase():
def handle_housing_start_request(self, data: Dict) -> Dict: def handle_housing_start_request(self, data: Dict) -> Dict:
req = HousingStartRequestV1(data) req = HousingStartRequestV1(data)
resp = HousingStartResponseV1( if req.appVersion.country != "JPN" and req.appVersion.country in [region.name for region in WaccaConstants.Region]:
self.region_id, region_id = WaccaConstants.Region[req.appVersion.country]
[ # Recomended songs else:
1269,1007,1270,1002,1020,1003,1008,1211,1018,1092,1056,32, region_id = self.region_id
1260,1230,1258,1251,2212,1264,1125,1037,2001,1272,1126,1119,
1104,1070,1047,1044,1027,1004,1001,24,2068,2062,2021,1275, resp = HousingStartResponseV1(region_id)
1249,1207,1203,1107,1021,1009,9,4,3,23,22,2014,13,1276,1247,
1240,1237,1128,1114,1110,1109,1102,1045,1043,1036,1035,1030,
1023,1015
]
)
return resp.make() return resp.make()
def handle_advertise_GetNews_request(self, data: Dict) -> Dict: def handle_advertise_GetNews_request(self, data: Dict) -> Dict:

View File

@ -153,9 +153,13 @@ class WaccaConstants():
UNITED_STATES = 48 UNITED_STATES = 48
USA = 48 USA = 48
TAIWAN = 49 TAIWAN = 49
TWN = 49
HONG_KONG = 50 HONG_KONG = 50
HKG = 50
SINGAPORE = 51 SINGAPORE = 51
SGP = 51
KOREA = 52 KOREA = 52
KOR = 52
VALID_COUNTRIES = set(["JPN", "USA", "KOR", "HKG", "SGP"]) VALID_COUNTRIES = set(["JPN", "USA", "KOR", "HKG", "SGP"])

View File

@ -90,8 +90,7 @@ class Version(ShortVersion):
def __str__(self) -> str: def __str__(self) -> str:
return f"{self.major}.{self.minor}.{self.patch}.{self.country}.{self.role}.{self.build}" 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
""" """
@ -105,7 +104,7 @@ class HousingInfo():
def make(self) -> List: def make(self) -> List:
return [ self.id, self.val ] return [ self.id, self.val ]
class Notice(): class Notice:
name: str = "" name: str = ""
title: str = "" title: str = ""
message: str = "" message: str = ""
@ -128,7 +127,7 @@ class Notice():
return [ self.name, self.title, self.message, self.unknown3, self.unknown4, int(self.showTitleScreen), return [ self.name, self.title, self.message, self.unknown3, self.unknown4, int(self.showTitleScreen),
int(self.showWelcomeScreen), self.startTime, self.endTime, self.voiceline] int(self.showWelcomeScreen), self.startTime, self.endTime, self.voiceline]
class UserOption(): class UserOption:
def __init__(self, opt_id: int = 0, opt_val: Any = 0) -> None: def __init__(self, opt_id: int = 0, opt_val: Any = 0) -> None:
self.opt_id = opt_id self.opt_id = opt_id
self.opt_val = opt_val self.opt_val = opt_val
@ -136,7 +135,7 @@ class UserOption():
def make(self) -> List: def make(self) -> List:
return [self.opt_id, self.opt_val] return [self.opt_id, self.opt_val]
class UserStatusV1(): class UserStatusV1:
def __init__(self) -> None: def __init__(self) -> None:
self.userId: int = 0 self.userId: int = 0
self.username: str = "" self.username: str = ""
@ -194,7 +193,7 @@ class PlayVersionStatus(Enum):
VersionTooNew = 1 VersionTooNew = 1
VersionUpgrade = 2 VersionUpgrade = 2
class PlayModeCounts(): class PlayModeCounts:
seasonId: int = 0 seasonId: int = 0
modeId: int = 0 modeId: int = 0
playNum: int = 0 playNum: int = 0
@ -211,7 +210,7 @@ class PlayModeCounts():
self.playNum self.playNum
] ]
class SongUnlock(): class SongUnlock:
songId: int = 0 songId: int = 0
difficulty: int = 0 difficulty: int = 0
whenAppeared: int = 0 whenAppeared: int = 0
@ -231,7 +230,7 @@ class SongUnlock():
self.whenUnlocked self.whenUnlocked
] ]
class GenericItemRecv(): class GenericItemRecv:
def __init__(self, item_type: int = 1, item_id: int = 1, quantity: int = 1) -> None: def __init__(self, item_type: int = 1, item_id: int = 1, quantity: int = 1) -> None:
self.itemId = item_id self.itemId = item_id
self.itemType = item_type self.itemType = item_type
@ -240,7 +239,7 @@ class GenericItemRecv():
def make(self) -> List: def make(self) -> List:
return [ self.itemType, self.itemId, self.quantity ] return [ self.itemType, self.itemId, self.quantity ]
class GenericItemSend(): class GenericItemSend:
def __init__(self, itemId: int, itemType: int, whenAcquired: int) -> None: def __init__(self, itemId: int, itemType: int, whenAcquired: int) -> None:
self.itemId = itemId self.itemId = itemId
self.itemType = itemType self.itemType = itemType
@ -268,7 +267,7 @@ class IconItem(GenericItemSend):
self.whenAcquired self.whenAcquired
] ]
class TrophyItem(): class TrophyItem:
trophyId: int = 0 trophyId: int = 0
season: int = 1 season: int = 1
progress: int = 0 progress: int = 0
@ -288,7 +287,7 @@ class TrophyItem():
self.badgeType self.badgeType
] ]
class TicketItem(): class TicketItem:
userTicketId: int = 0 userTicketId: int = 0
ticketId: int = 0 ticketId: int = 0
whenExpires: int = 0 whenExpires: int = 0
@ -321,7 +320,7 @@ class NavigatorItem(IconItem):
self.usesToday self.usesToday
] ]
class SkillItem(): class SkillItem:
skill_type: int skill_type: int
level: int level: int
flag: int flag: int
@ -335,7 +334,7 @@ class SkillItem():
self.badge self.badge
] ]
class UserItemInfoV1(): class UserItemInfoV1:
def __init__(self) -> None: def __init__(self) -> None:
self.songUnlocks: List[SongUnlock] = [] self.songUnlocks: List[SongUnlock] = []
self.titles: List[GenericItemSend] = [] self.titles: List[GenericItemSend] = []
@ -419,7 +418,7 @@ class UserItemInfoV3(UserItemInfoV2):
ret.append(effect) ret.append(effect)
return ret return ret
class SongDetailClearCounts(): class SongDetailClearCounts:
def __init__(self, play_ct: int = 0, clear_ct: int = 0, ml_ct: int = 0, fc_ct: int = 0, def __init__(self, play_ct: int = 0, clear_ct: int = 0, ml_ct: int = 0, fc_ct: int = 0,
am_ct: int = 0, counts: Optional[List[int]] = None) -> None: am_ct: int = 0, counts: Optional[List[int]] = None) -> None:
if counts is None: if counts is None:
@ -439,7 +438,7 @@ class SongDetailClearCounts():
def make(self) -> List: def make(self) -> List:
return [self.playCt, self.clearCt, self.misslessCt, self.fullComboCt, self.allMarvelousCt] return [self.playCt, self.clearCt, self.misslessCt, self.fullComboCt, self.allMarvelousCt]
class SongDetailGradeCountsV1(): class SongDetailGradeCountsV1:
dCt: int dCt: int
cCt: int cCt: int
bCt: int bCt: int
@ -501,7 +500,7 @@ class SongDetailGradeCountsV2(SongDetailGradeCountsV1):
def make(self) -> List: def make(self) -> List:
return super().make() + [self.spCt, self.sspCt, self.ssspCt] return super().make() + [self.spCt, self.sspCt, self.ssspCt]
class BestScoreDetailV1(): class BestScoreDetailV1:
songId: int = 0 songId: int = 0
difficulty: int = 1 difficulty: int = 1
clearCounts: SongDetailClearCounts = SongDetailClearCounts() clearCounts: SongDetailClearCounts = SongDetailClearCounts()
@ -534,7 +533,7 @@ class BestScoreDetailV1():
class BestScoreDetailV2(BestScoreDetailV1): class BestScoreDetailV2(BestScoreDetailV1):
gradeCounts: SongDetailGradeCountsV2 = SongDetailGradeCountsV2() gradeCounts: SongDetailGradeCountsV2 = SongDetailGradeCountsV2()
class SongUpdateJudgementCounts(): class SongUpdateJudgementCounts:
marvCt: int marvCt: int
greatCt: int greatCt: int
goodCt: int goodCt: int
@ -549,7 +548,7 @@ class SongUpdateJudgementCounts():
def make(self) -> List: def make(self) -> List:
return [self.marvCt, self.greatCt, self.goodCt, self.missCt] return [self.marvCt, self.greatCt, self.goodCt, self.missCt]
class SongUpdateDetailV1(): class SongUpdateDetailV1:
def __init__(self, data: List) -> None: def __init__(self, data: List) -> None:
if data is not None: if data is not None:
self.songId = data[0] self.songId = data[0]
@ -579,7 +578,7 @@ class SongUpdateDetailV2(SongUpdateDetailV1):
self.slowCt = data[14] self.slowCt = data[14]
self.flagNewRecord = False if data[15] == 0 else True self.flagNewRecord = False if data[15] == 0 else True
class SeasonalInfoV1(): class SeasonalInfoV1:
def __init__(self) -> None: def __init__(self) -> None:
self.level: int = 0 self.level: int = 0
self.wpObtained: int = 0 self.wpObtained: int = 0
@ -613,7 +612,7 @@ class SeasonalInfoV2(SeasonalInfoV1):
def make(self) -> List: def make(self) -> List:
return super().make() + [self.platesObtained, self.cumulativeGatePts] return super().make() + [self.platesObtained, self.cumulativeGatePts]
class BingoPageStatus(): class BingoPageStatus:
id = 0 id = 0
location = 1 location = 1
progress = 0 progress = 0
@ -626,7 +625,7 @@ class BingoPageStatus():
def make(self) -> List: def make(self) -> List:
return [self.id, self.location, self.progress] return [self.id, self.location, self.progress]
class BingoDetail(): class BingoDetail:
def __init__(self, pageNumber: int) -> None: def __init__(self, pageNumber: int) -> None:
self.pageNumber = pageNumber self.pageNumber = pageNumber
self.pageStatus: List[BingoPageStatus] = [] self.pageStatus: List[BingoPageStatus] = []
@ -641,7 +640,7 @@ class BingoDetail():
status status
] ]
class GateDetailV1(): class GateDetailV1:
def __init__(self, gate_id: int = 1, page: int = 1, progress: int = 0, loops: int = 0, last_used: int = 0, mission_flg = 0) -> None: def __init__(self, gate_id: int = 1, page: int = 1, progress: int = 0, loops: int = 0, last_used: int = 0, mission_flg = 0) -> None:
self.id = gate_id self.id = gate_id
self.page = page self.page = page
@ -657,11 +656,11 @@ class GateDetailV2(GateDetailV1):
def make(self) -> List: def make(self) -> List:
return super().make() + [self.missionFlg] return super().make() + [self.missionFlg]
class GachaInfo(): class GachaInfo:
def make(self) -> List: def make(self) -> List:
return [] return []
class LastSongDetail(): class LastSongDetail:
lastSongId = 90 lastSongId = 90
lastSongDiff = 1 lastSongDiff = 1
lastFolderOrd = 1 lastFolderOrd = 1
@ -680,11 +679,11 @@ class LastSongDetail():
return [self.lastSongId, self.lastSongDiff, self.lastFolderOrd, self.lastFolderId, return [self.lastSongId, self.lastSongDiff, self.lastFolderOrd, self.lastFolderId,
self.lastSongOrd] self.lastSongOrd]
class FriendDetail(): class FriendDetail:
def make(self) -> List: def make(self) -> List:
return [] return []
class LoginBonusInfo(): class LoginBonusInfo:
def __init__(self) -> None: def __init__(self) -> None:
self.tickets: List[TicketItem] = [] self.tickets: List[TicketItem] = []
self.items: List[GenericItemRecv] = [] self.items: List[GenericItemRecv] = []
@ -702,7 +701,7 @@ class LoginBonusInfo():
return [ tks, itms, self.message ] return [ tks, itms, self.message ]
class VipLoginBonus(): class VipLoginBonus:
id = 1 id = 1
unknown = 0 unknown = 0
item: GenericItemRecv item: GenericItemRecv
@ -715,7 +714,7 @@ class VipLoginBonus():
def make(self) -> List: def make(self) -> List:
return [ self.id, self.unknown, self.item.make() ] return [ self.id, self.unknown, self.item.make() ]
class VipInfo(): class VipInfo:
def __init__(self, year: int = 2019, month: int = 1, day: int = 1, num_item: int = 1) -> None: def __init__(self, year: int = 2019, month: int = 1, day: int = 1, num_item: int = 1) -> None:
self.pageYear = year self.pageYear = year
self.pageMonth = month self.pageMonth = month
@ -746,7 +745,7 @@ class PlayType(Enum):
PlayTypeCoop = 3 PlayTypeCoop = 3
PlayTypeStageup = 4 PlayTypeStageup = 4
class StageInfo(): class StageInfo:
danId: int = 0 danId: int = 0
danLevel: int = 0 danLevel: int = 0
clearStatus: int = 0 clearStatus: int = 0
@ -780,7 +779,7 @@ class StageupClearType(Enum):
CLEAR_SILVER = 2 CLEAR_SILVER = 2
CLEAR_GOLD = 3 CLEAR_GOLD = 3
class MusicUpdateDetailV1(): class MusicUpdateDetailV1:
def __init__(self) -> None: def __init__(self) -> None:
self.songId = 0 self.songId = 0
self.difficulty = 1 self.difficulty = 1
@ -818,7 +817,7 @@ class MusicUpdateDetailV3(MusicUpdateDetailV2):
super().__init__() super().__init__()
self.grades = SongDetailGradeCountsV2() self.grades = SongDetailGradeCountsV2()
class SongRatingUpdate(): class SongRatingUpdate:
def __init__(self, song_id: int = 0, difficulty: int = 1, new_rating: int = 0) -> None: def __init__(self, song_id: int = 0, difficulty: int = 1, new_rating: int = 0) -> None:
self.songId = song_id self.songId = song_id
self.difficulty = difficulty self.difficulty = difficulty
@ -831,7 +830,7 @@ class SongRatingUpdate():
self.rating, self.rating,
] ]
class GateTutorialFlag(): class GateTutorialFlag:
def __init__(self, tutorial_id: int = 1, flg_watched: bool = False) -> None: def __init__(self, tutorial_id: int = 1, flg_watched: bool = False) -> None:
self.tutorialId = tutorial_id self.tutorialId = tutorial_id
self.flagWatched = flg_watched self.flagWatched = flg_watched

View File

@ -2,6 +2,7 @@ from typing import List, Dict
from titles.wacca.handlers.base import BaseRequest, BaseResponse from titles.wacca.handlers.base import BaseRequest, BaseResponse
from titles.wacca.handlers.helpers import HousingInfo from titles.wacca.handlers.helpers import HousingInfo
from titles.wacca.const import WaccaConstants
# ---housing/get---- # ---housing/get----
class HousingGetResponse(BaseResponse): class HousingGetResponse(BaseResponse):
@ -37,12 +38,22 @@ class HousingStartRequestV2(HousingStartRequestV1):
self.info.append(HousingInfo(info[0], info[1])) self.info.append(HousingInfo(info[0], info[1]))
class HousingStartResponseV1(BaseResponse): class HousingStartResponseV1(BaseResponse):
def __init__(self, regionId: int, songList: List[int]) -> None: def __init__(self, regionId: WaccaConstants.Region = WaccaConstants.Region.HOKKAIDO, songList: List[int] = []) -> None:
super().__init__() super().__init__()
self.regionId = regionId self.regionId = regionId
self.songList = songList self.songList = songList # Recomended songs
if not self.songList:
self.songList = [
1269,1007,1270,1002,1020,1003,1008,1211,1018,1092,1056,32,
1260,1230,1258,1251,2212,1264,1125,1037,2001,1272,1126,1119,
1104,1070,1047,1044,1027,1004,1001,24,2068,2062,2021,1275,
1249,1207,1203,1107,1021,1009,9,4,3,23,22,2014,13,1276,1247,
1240,1237,1128,1114,1110,1109,1102,1045,1043,1036,1035,1030,
1023,1015
]
def make(self) -> Dict: def make(self) -> Dict:
self.params = [self.regionId, self.songList] self.params = [self.regionId.value, self.songList]
return super().make() return super().make()

View File

@ -43,17 +43,12 @@ class WaccaLily(WaccaS):
def handle_housing_start_request(self, data: Dict) -> Dict: def handle_housing_start_request(self, data: Dict) -> Dict:
req = HousingStartRequestV2(data) req = HousingStartRequestV2(data)
resp = HousingStartResponseV1( if req.appVersion.country != "JPN" and req.appVersion.country in [region.name for region in WaccaConstants.Region]:
self.region_id, region_id = WaccaConstants.Region[req.appVersion.country]
[ # Recomended songs else:
1269,1007,1270,1002,1020,1003,1008,1211,1018,1092,1056,32, region_id = self.region_id
1260,1230,1258,1251,2212,1264,1125,1037,2001,1272,1126,1119,
1104,1070,1047,1044,1027,1004,1001,24,2068,2062,2021,1275, resp = HousingStartResponseV1(region_id)
1249,1207,1203,1107,1021,1009,9,4,3,23,22,2014,13,1276,1247,
1240,1237,1128,1114,1110,1109,1102,1045,1043,1036,1035,1030,
1023,1015
]
)
return resp.make() return resp.make()
def handle_user_status_get_request(self, data: Dict)-> Dict: def handle_user_status_get_request(self, data: Dict)-> Dict: