From f39317301b9b892c5852258d4e15b770b38ba8d3 Mon Sep 17 00:00:00 2001 From: Dniel97 Date: Sat, 15 Jul 2023 22:51:54 +0200 Subject: [PATCH] mai2: fixed update script, added mai2 heredity, fixed cards import --- core/data/schema/versions/SDEZ_5_rollback.sql | 2 +- core/data/schema/versions/SDEZ_6_upgrade.sql | 2 +- titles/cm/index.py | 2 +- titles/cm/read.py | 12 +- titles/mai2/dx.py | 173 ------------------ titles/mai2/festival.py | 6 +- titles/mai2/splash.py | 4 +- titles/mai2/splashplus.py | 4 +- titles/mai2/universe.py | 12 +- titles/mai2/universeplus.py | 4 +- 10 files changed, 26 insertions(+), 195 deletions(-) diff --git a/core/data/schema/versions/SDEZ_5_rollback.sql b/core/data/schema/versions/SDEZ_5_rollback.sql index 1507faa..2b66afe 100644 --- a/core/data/schema/versions/SDEZ_5_rollback.sql +++ b/core/data/schema/versions/SDEZ_5_rollback.sql @@ -51,7 +51,7 @@ ALTER TABLE mai2_item_favorite MODIFY COLUMN itemKind int(11) NOT NULL; ALTER TABLE mai2_item_friend_season_ranking MODIFY COLUMN seasonId int(11) NOT NULL; ALTER TABLE mai2_item_friend_season_ranking MODIFY COLUMN point int(11) NOT NULL; -ALTER TABLE mai2_item_friend_season_ranking MODIFY COLUMN rank int(11) NOT NULL; +ALTER TABLE mai2_item_friend_season_ranking MODIFY COLUMN `rank` int(11) NOT NULL; ALTER TABLE mai2_item_friend_season_ranking MODIFY COLUMN rewardGet tinyint(1) NOT NULL; ALTER TABLE mai2_item_friend_season_ranking MODIFY COLUMN userName varchar(8) NOT NULL; diff --git a/core/data/schema/versions/SDEZ_6_upgrade.sql b/core/data/schema/versions/SDEZ_6_upgrade.sql index 06b2d45..472747d 100644 --- a/core/data/schema/versions/SDEZ_6_upgrade.sql +++ b/core/data/schema/versions/SDEZ_6_upgrade.sql @@ -35,7 +35,7 @@ ALTER TABLE mai2_item_favorite MODIFY COLUMN itemKind int(11) NULL; ALTER TABLE mai2_item_friend_season_ranking MODIFY COLUMN seasonId int(11) NULL; ALTER TABLE mai2_item_friend_season_ranking MODIFY COLUMN point int(11) NULL; -ALTER TABLE mai2_item_friend_season_ranking MODIFY COLUMN rank int(11) NULL; +ALTER TABLE mai2_item_friend_season_ranking MODIFY COLUMN `rank` int(11) NULL; ALTER TABLE mai2_item_friend_season_ranking MODIFY COLUMN rewardGet tinyint(1) NULL; ALTER TABLE mai2_item_friend_season_ranking MODIFY COLUMN userName varchar(8) NULL; diff --git a/titles/cm/index.py b/titles/cm/index.py index 3bde49c..348ec4f 100644 --- a/titles/cm/index.py +++ b/titles/cm/index.py @@ -129,6 +129,6 @@ class CardMakerServlet: if resp is None: resp = {"returnCode": 1} - self.logger.info(f"Response {resp}") + self.logger.debug(f"Response {resp}") return zlib.compress(json.dumps(resp, ensure_ascii=False).encode("utf-8")) diff --git a/titles/cm/read.py b/titles/cm/read.py index 109483c..a26f35e 100644 --- a/titles/cm/read.py +++ b/titles/cm/read.py @@ -89,8 +89,7 @@ class CardMakerReader(BaseReader): version_ids = { "v2_00": ChuniConstants.VER_CHUNITHM_NEW, "v2_05": ChuniConstants.VER_CHUNITHM_NEW_PLUS, - # Chunithm SUN, ignore for now - "v2_10": ChuniConstants.VER_CHUNITHM_NEW_PLUS + 1, + "v2_10": ChuniConstants.VER_CHUNITHM_SUN, } for root, dirs, files in os.walk(base_dir): @@ -138,8 +137,7 @@ class CardMakerReader(BaseReader): version_ids = { "v2_00": ChuniConstants.VER_CHUNITHM_NEW, "v2_05": ChuniConstants.VER_CHUNITHM_NEW_PLUS, - # Chunithm SUN, ignore for now - "v2_10": ChuniConstants.VER_CHUNITHM_NEW_PLUS + 1, + "v2_10": ChuniConstants.VER_CHUNITHM_SUN, } for root, dirs, files in os.walk(base_dir): @@ -226,6 +224,12 @@ class CardMakerReader(BaseReader): True if troot.find("disable").text == "false" else False ) + # check if a date is part of the name and disable the + # card if it is + enabled = ( + False if re.search(r"\d{2}/\d{2}/\d{2}", name) else enabled + ) + self.mai2_data.static.put_card( version, card_id, name, enabled=enabled ) diff --git a/titles/mai2/dx.py b/titles/mai2/dx.py index 971135d..185dda0 100644 --- a/titles/mai2/dx.py +++ b/titles/mai2/dx.py @@ -568,176 +568,3 @@ class Mai2DX(Mai2Base): "nextIndex": next_index, "userMusicList": [{"userMusicDetailList": music_detail_list}], } - - def handle_cm_get_user_preview_api_request(self, data: Dict) -> Dict: - p = self.data.profile.get_profile_detail(data["userId"], self.version) - if p is None: - return {} - - return { - "userName": p["userName"], - "rating": p["playerRating"], - # hardcode lastDataVersion for CardMaker 1.34 - "lastDataVersion": "1.20.00", - "isLogin": False, - "isExistSellingCard": False, - } - - def handle_cm_get_user_data_api_request(self, data: Dict) -> Dict: - # user already exists, because the preview checks that already - p = self.data.profile.get_profile_detail(data["userId"], self.version) - - cards = self.data.card.get_user_cards(data["userId"]) - if cards is None or len(cards) == 0: - # This should never happen - self.logger.error( - f"handle_get_user_data_api_request: Internal error - No cards found for user id {data['userId']}" - ) - return {} - - # get the dict representation of the row so we can modify values - user_data = p._asdict() - - # remove the values the game doesn't want - user_data.pop("id") - user_data.pop("user") - user_data.pop("version") - - return {"userId": data["userId"], "userData": user_data} - - def handle_cm_login_api_request(self, data: Dict) -> Dict: - return {"returnCode": 1} - - def handle_cm_logout_api_request(self, data: Dict) -> Dict: - return {"returnCode": 1} - - def handle_cm_get_selling_card_api_request(self, data: Dict) -> Dict: - selling_cards = self.data.static.get_enabled_cards(self.version) - if selling_cards is None: - return {"length": 0, "sellingCardList": []} - - selling_card_list = [] - for card in selling_cards: - tmp = card._asdict() - tmp.pop("id") - tmp.pop("version") - tmp.pop("cardName") - tmp.pop("enabled") - - tmp["startDate"] = datetime.strftime(tmp["startDate"], "%Y-%m-%d %H:%M:%S") - tmp["endDate"] = datetime.strftime(tmp["endDate"], "%Y-%m-%d %H:%M:%S") - tmp["noticeStartDate"] = datetime.strftime( - tmp["noticeStartDate"], "%Y-%m-%d %H:%M:%S" - ) - tmp["noticeEndDate"] = datetime.strftime( - tmp["noticeEndDate"], "%Y-%m-%d %H:%M:%S" - ) - - selling_card_list.append(tmp) - - return {"length": len(selling_card_list), "sellingCardList": selling_card_list} - - def handle_cm_get_user_card_api_request(self, data: Dict) -> Dict: - user_cards = self.data.item.get_cards(data["userId"]) - if user_cards is None: - return {"returnCode": 1, "length": 0, "nextIndex": 0, "userCardList": []} - - max_ct = data["maxCount"] - next_idx = data["nextIndex"] - start_idx = next_idx - end_idx = max_ct + start_idx - - if len(user_cards[start_idx:]) > max_ct: - next_idx += max_ct - else: - next_idx = 0 - - card_list = [] - for card in user_cards: - tmp = card._asdict() - tmp.pop("id") - tmp.pop("user") - - tmp["startDate"] = datetime.strftime(tmp["startDate"], "%Y-%m-%d %H:%M:%S") - tmp["endDate"] = datetime.strftime(tmp["endDate"], "%Y-%m-%d %H:%M:%S") - card_list.append(tmp) - - return { - "returnCode": 1, - "length": len(card_list[start_idx:end_idx]), - "nextIndex": next_idx, - "userCardList": card_list[start_idx:end_idx], - } - - def handle_cm_get_user_item_api_request(self, data: Dict) -> Dict: - super().handle_get_user_item_api_request(data) - - def handle_cm_get_user_character_api_request(self, data: Dict) -> Dict: - characters = self.data.item.get_characters(data["userId"]) - - chara_list = [] - for chara in characters: - chara_list.append( - { - "characterId": chara["characterId"], - # no clue why those values are even needed - "point": 0, - "count": 0, - "level": chara["level"], - "nextAwake": 0, - "nextAwakePercent": 0, - "favorite": False, - "awakening": chara["awakening"], - "useCount": chara["useCount"], - } - ) - - return { - "returnCode": 1, - "length": len(chara_list), - "userCharacterList": chara_list, - } - - def handle_cm_get_user_card_print_error_api_request(self, data: Dict) -> Dict: - return {"length": 0, "userPrintDetailList": []} - - def handle_cm_upsert_user_print_api_request(self, data: Dict) -> Dict: - user_id = data["userId"] - upsert = data["userPrintDetail"] - - # set a random card serial number - serial_id = "".join([str(randint(0, 9)) for _ in range(20)]) - - user_card = upsert["userCard"] - self.data.item.put_card( - user_id, - user_card["cardId"], - user_card["cardTypeId"], - user_card["charaId"], - user_card["mapId"], - ) - - # properly format userPrintDetail for the database - upsert.pop("userCard") - upsert.pop("serialId") - upsert["printDate"] = datetime.strptime(upsert["printDate"], "%Y-%m-%d") - - self.data.item.put_user_print_detail(user_id, serial_id, upsert) - - return { - "returnCode": 1, - "orderId": 0, - "serialId": serial_id, - "startDate": "2018-01-01 00:00:00", - "endDate": "2038-01-01 00:00:00", - } - - def handle_cm_upsert_user_printlog_api_request(self, data: Dict) -> Dict: - return { - "returnCode": 1, - "orderId": 0, - "serialId": data["userPrintlog"]["serialId"], - } - - def handle_cm_upsert_buy_card_api_request(self, data: Dict) -> Dict: - return {"returnCode": 1} diff --git a/titles/mai2/festival.py b/titles/mai2/festival.py index 85b3df2..fcdd4ed 100644 --- a/titles/mai2/festival.py +++ b/titles/mai2/festival.py @@ -1,12 +1,12 @@ from typing import Dict from core.config import CoreConfig -from titles.mai2.dx import Mai2DX +from titles.mai2.universeplus import Mai2UniversePlus from titles.mai2.const import Mai2Constants from titles.mai2.config import Mai2Config -class Mai2Festival(Mai2DX): +class Mai2Festival(Mai2UniversePlus): def __init__(self, cfg: CoreConfig, game_cfg: Mai2Config) -> None: super().__init__(cfg, game_cfg) self.version = Mai2Constants.VER_MAIMAI_DX_FESTIVAL @@ -14,7 +14,7 @@ class Mai2Festival(Mai2DX): def handle_cm_get_user_preview_api_request(self, data: Dict) -> Dict: user_data = super().handle_cm_get_user_preview_api_request(data) - # hardcode lastDataVersion for CardMaker 1.36 + # hardcode lastDataVersion for CardMaker 1.35 user_data["lastDataVersion"] = "1.30.00" return user_data diff --git a/titles/mai2/splash.py b/titles/mai2/splash.py index 0c9f827..026e3ae 100644 --- a/titles/mai2/splash.py +++ b/titles/mai2/splash.py @@ -4,12 +4,12 @@ import pytz import json from core.config import CoreConfig -from titles.mai2.dx import Mai2DX +from titles.mai2.dxplus import Mai2DXPlus from titles.mai2.config import Mai2Config from titles.mai2.const import Mai2Constants -class Mai2Splash(Mai2DX): +class Mai2Splash(Mai2DXPlus): def __init__(self, cfg: CoreConfig, game_cfg: Mai2Config) -> None: super().__init__(cfg, game_cfg) self.version = Mai2Constants.VER_MAIMAI_DX_SPLASH diff --git a/titles/mai2/splashplus.py b/titles/mai2/splashplus.py index e26b267..438941f 100644 --- a/titles/mai2/splashplus.py +++ b/titles/mai2/splashplus.py @@ -4,12 +4,12 @@ import pytz import json from core.config import CoreConfig -from titles.mai2.dx import Mai2DX +from titles.mai2.splash import Mai2Splash from titles.mai2.config import Mai2Config from titles.mai2.const import Mai2Constants -class Mai2SplashPlus(Mai2DX): +class Mai2SplashPlus(Mai2Splash): def __init__(self, cfg: CoreConfig, game_cfg: Mai2Config) -> None: super().__init__(cfg, game_cfg) self.version = Mai2Constants.VER_MAIMAI_DX_SPLASH_PLUS diff --git a/titles/mai2/universe.py b/titles/mai2/universe.py index f57ae1e..c17f899 100644 --- a/titles/mai2/universe.py +++ b/titles/mai2/universe.py @@ -5,12 +5,12 @@ import pytz import json from core.config import CoreConfig -from titles.mai2.dx import Mai2DX +from titles.mai2.splashplus import Mai2SplashPlus from titles.mai2.const import Mai2Constants from titles.mai2.config import Mai2Config -class Mai2Universe(Mai2DX): +class Mai2Universe(Mai2SplashPlus): def __init__(self, cfg: CoreConfig, game_cfg: Mai2Config) -> None: super().__init__(cfg, game_cfg) self.version = Mai2Constants.VER_MAIMAI_DX_UNIVERSE @@ -70,13 +70,13 @@ class Mai2Universe(Mai2DX): tmp.pop("cardName") tmp.pop("enabled") - tmp["startDate"] = datetime.strftime(tmp["startDate"], "%Y-%m-%d %H:%M:%S") - tmp["endDate"] = datetime.strftime(tmp["endDate"], "%Y-%m-%d %H:%M:%S") + tmp["startDate"] = datetime.strftime(tmp["startDate"], Mai2Constants.DATE_TIME_FORMAT) + tmp["endDate"] = datetime.strftime(tmp["endDate"], Mai2Constants.DATE_TIME_FORMAT) tmp["noticeStartDate"] = datetime.strftime( - tmp["noticeStartDate"], "%Y-%m-%d %H:%M:%S" + tmp["noticeStartDate"], Mai2Constants.DATE_TIME_FORMAT ) tmp["noticeEndDate"] = datetime.strftime( - tmp["noticeEndDate"], "%Y-%m-%d %H:%M:%S" + tmp["noticeEndDate"], Mai2Constants.DATE_TIME_FORMAT ) selling_card_list.append(tmp) diff --git a/titles/mai2/universeplus.py b/titles/mai2/universeplus.py index e9f03f4..e45c719 100644 --- a/titles/mai2/universeplus.py +++ b/titles/mai2/universeplus.py @@ -1,12 +1,12 @@ from typing import Dict from core.config import CoreConfig -from titles.mai2.dx import Mai2DX +from titles.mai2.universe import Mai2Universe from titles.mai2.const import Mai2Constants from titles.mai2.config import Mai2Config -class Mai2UniversePlus(Mai2DX): +class Mai2UniversePlus(Mai2Universe): def __init__(self, cfg: CoreConfig, game_cfg: Mai2Config) -> None: super().__init__(cfg, game_cfg) self.version = Mai2Constants.VER_MAIMAI_DX_UNIVERSE_PLUS