diff --git a/titles/chuni/base.py b/titles/chuni/base.py index 86d5bc5..9645a74 100644 --- a/titles/chuni/base.py +++ b/titles/chuni/base.py @@ -1,6 +1,4 @@ import itertools -import logging -import json from datetime import datetime, timedelta import pytz @@ -131,19 +129,22 @@ class ChuniBase: return {"length": 0, "gameChargeList": []} charges = [] - for x in range(len(game_charge_list)): - charges.append( - { - "orderId": x, - "chargeId": game_charge_list[x]["chargeId"], - "price": 1, - "startDate": "2017-12-05 07:00:00.0", - "endDate": "2099-12-31 00:00:00.0", - "salePrice": 1, - "saleStartDate": "2017-12-05 07:00:00.0", - "saleEndDate": "2099-12-31 00:00:00.0", - } - ) + + for _, charge_list in itertools.groupby(game_charge_list, key=lambda x: x["chargeId"] // 1000): + for price, charge in enumerate(charge_list): + charges.append( + { + "orderId": len(charges), + "chargeId": charge["chargeId"], + "price": price + 1, + "startDate": "2017-12-05 07:00:00.0", + "endDate": "2099-12-31 00:00:00.0", + "salePrice": 1, + "saleStartDate": "2099-12-31 07:00:00.0", + "saleEndDate": "2099-12-31 00:00:00.0", + } + ) + return {"length": len(charges), "gameChargeList": charges} async def handle_get_game_event_api_request(self, data: Dict) -> Dict: @@ -787,155 +788,157 @@ class ChuniBase: self.logger.info("Guest play from place ID %d, ignoring.", place_id) return {"returnCode": "1"} - if "userData" in upsert: - try: - upsert["userData"][0]["userName"] = self.read_wtf8( - upsert["userData"][0]["userName"] + with self.data.session.begin(): + if "userData" in upsert: + try: + upsert["userData"][0]["userName"] = self.read_wtf8( + upsert["userData"][0]["userName"] + ) + except Exception: + pass + + await self.data.profile.put_profile_data( + user_id, self.version, upsert["userData"][0] ) - except Exception: - pass - await self.data.profile.put_profile_data( - user_id, self.version, upsert["userData"][0] - ) - - if "userDataEx" in upsert: - await self.data.profile.put_profile_data_ex( - user_id, self.version, upsert["userDataEx"][0] - ) - - if "userGameOption" in upsert: - await self.data.profile.put_profile_option(user_id, upsert["userGameOption"][0]) - - if "userGameOptionEx" in upsert: - await self.data.profile.put_profile_option_ex( - user_id, upsert["userGameOptionEx"][0] - ) - if "userRecentRatingList" in upsert: - await self.data.profile.put_profile_recent_rating( - user_id, upsert["userRecentRatingList"] - ) - - if "userCharacterList" in upsert: - for character in upsert["userCharacterList"]: - await self.data.item.put_character(user_id, character) - - if "userMapList" in upsert: - for map in upsert["userMapList"]: - await self.data.item.put_map(user_id, map) - - if "userCourseList" in upsert: - for course in upsert["userCourseList"]: - await self.data.score.put_course(user_id, course) - - if "userDuelList" in upsert: - for duel in upsert["userDuelList"]: - await self.data.item.put_duel(user_id, duel) - - if "userItemList" in upsert: - for item in upsert["userItemList"]: - await self.data.item.put_item(user_id, item) - - if "userActivityList" in upsert: - for activity in upsert["userActivityList"]: - await self.data.profile.put_profile_activity(user_id, activity) - - if "userChargeList" in upsert: - for charge in upsert["userChargeList"]: - await self.data.profile.put_profile_charge(user_id, charge) - - if "userMusicDetailList" in upsert: - for song in upsert["userMusicDetailList"]: - await self.data.score.put_score(user_id, song) - - if "userPlaylogList" in upsert: - for playlog in upsert["userPlaylogList"]: - # convert the player names to utf-8 - if playlog["playedUserName1"] is not None: - playlog["playedUserName1"] = self.read_wtf8(playlog["playedUserName1"]) - if playlog["playedUserName2"] is not None: - playlog["playedUserName2"] = self.read_wtf8(playlog["playedUserName2"]) - if playlog["playedUserName3"] is not None: - playlog["playedUserName3"] = self.read_wtf8(playlog["playedUserName3"]) - await self.data.score.put_playlog(user_id, playlog, self.version) - - if "userTeamPoint" in upsert: - team_points = upsert["userTeamPoint"] - try: - for tp in team_points: - if tp["teamId"] != '65535': - # Fetch the current team data - current_team = await self.data.profile.get_team_by_id(tp["teamId"]) - - # Calculate the new teamPoint - new_team_point = int(tp["teamPoint"]) + current_team["teamPoint"] - - # Prepare the data to update - team_data = { - "teamPoint": new_team_point - } - - # Update the team data - await self.data.profile.update_team(tp["teamId"], team_data) - except: - pass # Probably a better way to catch if the team is not set yet (new profiles), but let's just pass - if "userMapAreaList" in upsert: - for map_area in upsert["userMapAreaList"]: - await self.data.item.put_map_area(user_id, map_area) - - if "userOverPowerList" in upsert: - for overpower in upsert["userOverPowerList"]: - await self.data.profile.put_profile_overpower(user_id, overpower) - - if "userEmoneyList" in upsert: - for emoney in upsert["userEmoneyList"]: - await self.data.profile.put_profile_emoney(user_id, emoney) - - if "userLoginBonusList" in upsert: - for login in upsert["userLoginBonusList"]: - await self.data.item.put_login_bonus( - user_id, self.version, login["presetId"], isWatched=True + if "userDataEx" in upsert: + await self.data.profile.put_profile_data_ex( + user_id, self.version, upsert["userDataEx"][0] ) - - if "userRecentPlayerList" in upsert: # TODO: Seen in Air, maybe implement sometime - for rp in upsert["userRecentPlayerList"]: - pass - for rating_type in {"userRatingBaseList", "userRatingBaseHotList", "userRatingBaseNextList"}: - if rating_type not in upsert: - continue + if "userGameOption" in upsert: + await self.data.profile.put_profile_option(user_id, upsert["userGameOption"][0]) + + if "userGameOptionEx" in upsert: + await self.data.profile.put_profile_option_ex( + user_id, upsert["userGameOptionEx"][0] + ) + if "userRecentRatingList" in upsert: + await self.data.profile.put_profile_recent_rating( + user_id, upsert["userRecentRatingList"] + ) + + if "userCharacterList" in upsert: + for character in upsert["userCharacterList"]: + await self.data.item.put_character(user_id, character) + + if "userMapList" in upsert: + for map in upsert["userMapList"]: + await self.data.item.put_map(user_id, map) + + if "userCourseList" in upsert: + for course in upsert["userCourseList"]: + await self.data.score.put_course(user_id, course) + + if "userDuelList" in upsert: + for duel in upsert["userDuelList"]: + await self.data.item.put_duel(user_id, duel) + + if "userItemList" in upsert: + for item in upsert["userItemList"]: + await self.data.item.put_item(user_id, item) + + if "userActivityList" in upsert: + for activity in upsert["userActivityList"]: + await self.data.profile.put_profile_activity(user_id, activity) + + if "userChargeList" in upsert: + for charge in upsert["userChargeList"]: + await self.data.profile.put_profile_charge(user_id, charge) + + if "userMusicDetailList" in upsert: + for song in upsert["userMusicDetailList"]: + await self.data.score.put_score(user_id, song) + + if "userTeamPoint" in upsert: + team_points = upsert["userTeamPoint"] + try: + for tp in team_points: + if tp["teamId"] != '65535': + # Fetch the current team data + current_team = await self.data.profile.get_team_by_id(tp["teamId"]) + + # Calculate the new teamPoint + new_team_point = int(tp["teamPoint"]) + current_team["teamPoint"] + + # Prepare the data to update + team_data = { + "teamPoint": new_team_point + } + + # Update the team data + await self.data.profile.update_team(tp["teamId"], team_data) + except: + pass # Probably a better way to catch if the team is not set yet (new profiles), but let's just pass + if "userMapAreaList" in upsert: + for map_area in upsert["userMapAreaList"]: + await self.data.item.put_map_area(user_id, map_area) + + if "userOverPowerList" in upsert: + for overpower in upsert["userOverPowerList"]: + await self.data.profile.put_profile_overpower(user_id, overpower) + + if "userEmoneyList" in upsert: + for emoney in upsert["userEmoneyList"]: + await self.data.profile.put_profile_emoney(user_id, emoney) + + if "userLoginBonusList" in upsert: + for login in upsert["userLoginBonusList"]: + await self.data.item.put_login_bonus( + user_id, self.version, login["presetId"], isWatched=True + ) - await self.data.profile.put_profile_rating( - user_id, - self.version, - rating_type, - upsert[rating_type], - ) + if "userRecentPlayerList" in upsert: # TODO: Seen in Air, maybe implement sometime + for rp in upsert["userRecentPlayerList"]: + pass - # added in LUMINOUS - if "userCMissionList" in upsert: - for cmission in upsert["userCMissionList"]: - mission_id = cmission["missionId"] + # added in LUMINOUS + if "userCMissionList" in upsert: + for cmission in upsert["userCMissionList"]: + mission_id = cmission["missionId"] - await self.data.item.put_cmission( - user_id, - { - "missionId": mission_id, - "point": cmission["point"], - }, + await self.data.item.put_cmission( + user_id, + { + "missionId": mission_id, + "point": cmission["point"], + }, + ) + + for progress in cmission["userCMissionProgressList"]: + await self.data.item.put_cmission_progress(user_id, mission_id, progress) + + if "userNetBattleData" in upsert: + net_battle = upsert["userNetBattleData"][0] + + # fix the boolean + net_battle["isRankUpChallengeFailed"] = ( + False if net_battle["isRankUpChallengeFailed"] == "false" else True ) - - for progress in cmission["userCMissionProgressList"]: - await self.data.item.put_cmission_progress(user_id, mission_id, progress) - - if "userNetBattleData" in upsert: - net_battle = upsert["userNetBattleData"][0] - - # fix the boolean - net_battle["isRankUpChallengeFailed"] = ( - False if net_battle["isRankUpChallengeFailed"] == "false" else True - ) - await self.data.profile.put_net_battle(user_id, net_battle) + await self.data.profile.put_net_battle(user_id, net_battle) + + with self.data.session.begin(): + for rating_type in {"userRatingBaseList", "userRatingBaseHotList", "userRatingBaseNextList"}: + if rating_type not in upsert: + continue + + await self.data.profile.put_profile_rating( + user_id, + self.version, + rating_type, + upsert[rating_type], + ) + + if "userPlaylogList" in upsert: + for playlog in upsert["userPlaylogList"]: + # convert the player names to utf-8 + if playlog["playedUserName1"] is not None: + playlog["playedUserName1"] = self.read_wtf8(playlog["playedUserName1"]) + if playlog["playedUserName2"] is not None: + playlog["playedUserName2"] = self.read_wtf8(playlog["playedUserName2"]) + if playlog["playedUserName3"] is not None: + playlog["playedUserName3"] = self.read_wtf8(playlog["playedUserName3"]) + await self.data.score.put_playlog(user_id, playlog, self.version) return {"returnCode": "1"}