diff --git a/src/main/java/icu/samnyan/aqua/api/controller/sega/game/ongeki/ApiOngekiPlayerDataController.java b/src/main/java/icu/samnyan/aqua/api/controller/sega/game/ongeki/ApiOngekiPlayerDataController.java index fe4798f0..ce589499 100644 --- a/src/main/java/icu/samnyan/aqua/api/controller/sega/game/ongeki/ApiOngekiPlayerDataController.java +++ b/src/main/java/icu/samnyan/aqua/api/controller/sega/game/ongeki/ApiOngekiPlayerDataController.java @@ -43,10 +43,11 @@ public class ApiOngekiPlayerDataController { private final UserMusicDetailRepository userMusicDetailRepository; private final UserOptionRepository userOptionRepository; private final UserPlaylogRepository userPlaylogRepository; + private final UserGeneralDataRepository userGeneralDataRepository; private final GameCardRepository gameCardRepository; - public ApiOngekiPlayerDataController(ApiMapper mapper, UserActivityRepository userActivityRepository, UserCardRepository userCardRepository, UserCharacterRepository userCharacterRepository, UserDataRepository userDataRepository, UserDeckRepository userDeckRepository, UserEventPointRepository userEventPointRepository, UserItemRepository userItemRepository, UserMusicDetailRepository userMusicDetailRepository, UserOptionRepository userOptionRepository, UserPlaylogRepository userPlaylogRepository, GameCardRepository gameCardRepository) { + public ApiOngekiPlayerDataController(ApiMapper mapper, UserActivityRepository userActivityRepository, UserCardRepository userCardRepository, UserCharacterRepository userCharacterRepository, UserDataRepository userDataRepository, UserDeckRepository userDeckRepository, UserEventPointRepository userEventPointRepository, UserItemRepository userItemRepository, UserMusicDetailRepository userMusicDetailRepository, UserOptionRepository userOptionRepository, UserPlaylogRepository userPlaylogRepository, UserGeneralDataRepository userGeneralDataRepository, GameCardRepository gameCardRepository) { this.mapper = mapper; this.userActivityRepository = userActivityRepository; this.userCardRepository = userCardRepository; @@ -58,6 +59,7 @@ public class ApiOngekiPlayerDataController { this.userMusicDetailRepository = userMusicDetailRepository; this.userOptionRepository = userOptionRepository; this.userPlaylogRepository = userPlaylogRepository; + this.userGeneralDataRepository = userGeneralDataRepository; this.gameCardRepository = gameCardRepository; } @@ -280,4 +282,11 @@ public class ApiOngekiPlayerDataController { public UserOption getOptions(@RequestParam Integer aimeId) { return userOptionRepository.findByUser_Card_ExtId(aimeId).orElseThrow(); } + + @GetMapping("general") + public ResponseEntity getGeneralData(@RequestParam Integer aimeId, @RequestParam String key) { + Optional userGeneralDataOptional = userGeneralDataRepository.findByUser_Card_ExtIdAndPropertyKey(aimeId,key); + return userGeneralDataOptional.>map(ResponseEntity::ok) + .orElseGet(() -> ResponseEntity.status(HttpStatus.NOT_FOUND).body(new MessageResponse("User or value not found."))); + } } diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/gamedata/GamePointRepository.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/gamedata/GamePointRepository.java new file mode 100644 index 00000000..07374990 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/gamedata/GamePointRepository.java @@ -0,0 +1,12 @@ +package icu.samnyan.aqua.sega.ongeki.dao.gamedata; + +import icu.samnyan.aqua.sega.ongeki.model.gamedata.GamePoint; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Repository("OngekiGamePointRepository") +public interface GamePointRepository extends JpaRepository { +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/gamedata/GamePresentRepository.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/gamedata/GamePresentRepository.java new file mode 100644 index 00000000..854fab08 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/gamedata/GamePresentRepository.java @@ -0,0 +1,13 @@ +package icu.samnyan.aqua.sega.ongeki.dao.gamedata; + +import icu.samnyan.aqua.sega.ongeki.model.gamedata.GamePoint; +import icu.samnyan.aqua.sega.ongeki.model.gamedata.GamePresent; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Repository("OngekiGamePresentRepository") +public interface GamePresentRepository extends JpaRepository { +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/gamedata/GameRewardRepository.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/gamedata/GameRewardRepository.java new file mode 100644 index 00000000..29ccf293 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/gamedata/GameRewardRepository.java @@ -0,0 +1,13 @@ +package icu.samnyan.aqua.sega.ongeki.dao.gamedata; + +import icu.samnyan.aqua.sega.ongeki.model.gamedata.GamePresent; +import icu.samnyan.aqua.sega.ongeki.model.gamedata.GameReward; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Repository("OngekiGameRewardRepository") +public interface GameRewardRepository extends JpaRepository { +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserGeneralDataRepository.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserGeneralDataRepository.java new file mode 100644 index 00000000..beb6e6c5 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserGeneralDataRepository.java @@ -0,0 +1,17 @@ +package icu.samnyan.aqua.sega.ongeki.dao.userdata; + +import icu.samnyan.aqua.sega.ongeki.model.userdata.UserData; +import icu.samnyan.aqua.sega.ongeki.model.userdata.UserGeneralData; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Repository("OngekiUserGeneralDataRepository") +public interface UserGeneralDataRepository extends JpaRepository { + Optional findByUserAndPropertyKey(UserData user, String key); + Optional findByUser_Card_ExtIdAndPropertyKey(int aimeId, String key); +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserMissionPointRepository.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserMissionPointRepository.java new file mode 100644 index 00000000..e8125530 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserMissionPointRepository.java @@ -0,0 +1,20 @@ +package icu.samnyan.aqua.sega.ongeki.dao.userdata; + +import icu.samnyan.aqua.sega.ongeki.model.userdata.UserData; +import icu.samnyan.aqua.sega.ongeki.model.userdata.UserEventPoint; +import icu.samnyan.aqua.sega.ongeki.model.userdata.UserMissionPoint; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Repository("OngekiUserMissionPointRepository") +public interface UserMissionPointRepository extends JpaRepository { + Optional findByUserAndEventId(UserData userData, int eventId); + + List findByUser_Card_ExtId(int userId); +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserTrainingRoomRepository.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserTrainingRoomRepository.java index df3e6976..9621bac8 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserTrainingRoomRepository.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserTrainingRoomRepository.java @@ -1,12 +1,19 @@ package icu.samnyan.aqua.sega.ongeki.dao.userdata; +import icu.samnyan.aqua.sega.ongeki.model.userdata.UserData; import icu.samnyan.aqua.sega.ongeki.model.userdata.UserTrainingRoom; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Optional; + /** * @author samnyan (privateamusement@protonmail.com) */ @Repository("OngekiUserTrainingRoomRepository") public interface UserTrainingRoomRepository extends JpaRepository { + Optional findByUserAndRoomId(UserData user, int roomId); + + List findByUser_Card_ExtId(int userId); } diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameEventHandler.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameEventHandler.java index f02ce44b..b821a50b 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameEventHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameEventHandler.java @@ -45,7 +45,7 @@ public class GetGameEventHandler implements BaseHandler { x.getId(), type, "2005-01-01 00:00:00.0", - "2099-01-01 00:00:00.0" + "2099-01-01 05:00:00.0" )); }); diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameIdlistHandler.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameIdlistHandler.java index 5ea9df5f..76d227c3 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameIdlistHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameIdlistHandler.java @@ -1,18 +1,19 @@ package icu.samnyan.aqua.sega.ongeki.handler.impl; import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.general.dao.PropertyEntryRepository; +import icu.samnyan.aqua.sega.general.model.PropertyEntry; import icu.samnyan.aqua.sega.ongeki.handler.BaseHandler; import icu.samnyan.aqua.sega.ongeki.model.response.data.GameIdListItem; +import icu.samnyan.aqua.sega.ongeki.model.response.data.GameRankingItem; import icu.samnyan.aqua.sega.util.jackson.BasicMapper; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @author samnyan (privateamusement@protonmail.com) @@ -22,32 +23,56 @@ public class GetGameIdlistHandler implements BaseHandler { private static final Logger logger = LoggerFactory.getLogger(GetGameIdlistHandler.class); - private final BasicMapper mapper; + private final PropertyEntryRepository propertyEntryRepository; + @Autowired - public GetGameIdlistHandler(BasicMapper mapper) { + public GetGameIdlistHandler(BasicMapper mapper, PropertyEntryRepository propertyEntryRepository) { this.mapper = mapper; + this.propertyEntryRepository = propertyEntryRepository; } @Override public String handle(Map request) throws JsonProcessingException { Integer type = (Integer) request.get("type"); - List idList = new ArrayList<>(); + Optional propertyEntryOptional; if(type == 1) { - for (int i = 1; i <= 230; i++) { - idList.add(new GameIdListItem(i,type)); - } - for (int i = 8000; i <= 8050; i++) { - idList.add(new GameIdListItem(i,type)); - } + propertyEntryOptional = propertyEntryRepository.findByPropertyKey("ongeki_music_ng_list"); + } else if(type == 2) { + propertyEntryOptional = propertyEntryRepository.findByPropertyKey("ongeki_music_recommend_list"); + } else { + propertyEntryOptional = Optional.empty(); } Map resultMap = new LinkedHashMap<>(); resultMap.put("type", type); - resultMap.put("length", idList.size()); - resultMap.put("gameIdlistList", idList); + + if (propertyEntryOptional.isPresent()) { + String value = propertyEntryOptional.get().getPropertyValue(); + + if(StringUtils.isNotBlank(value) && value.contains(",")) { + String[] ids = value.split(","); + List idList = new LinkedList<>(); + + for (String id : ids) { + try { + idList.add(new GameIdListItem(Integer.parseInt(id), type)); + } catch (NumberFormatException ignored) { + } + } + resultMap.put("length", idList.size()); + resultMap.put("gameIdlistList", idList); + + } else { + resultMap.put("length", 0); + resultMap.put("gameIdlistList", new List[]{}); + } + } else { + resultMap.put("length", 0); + resultMap.put("gameIdlistList", new List[]{}); + } String json = mapper.write(resultMap); logger.info("Response: " + json); diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGamePointHandler.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGamePointHandler.java index d5fd2c43..3b8ccaf5 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGamePointHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGamePointHandler.java @@ -1,13 +1,17 @@ package icu.samnyan.aqua.sega.ongeki.handler.impl; import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.ongeki.dao.gamedata.GamePointRepository; import icu.samnyan.aqua.sega.ongeki.handler.BaseHandler; +import icu.samnyan.aqua.sega.ongeki.model.common.GpProductID; +import icu.samnyan.aqua.sega.ongeki.model.gamedata.GamePoint; import icu.samnyan.aqua.sega.util.jackson.BasicMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -22,19 +26,26 @@ public class GetGamePointHandler implements BaseHandler { private final BasicMapper mapper; + private final GamePointRepository gamePointRepository; + @Autowired - public GetGamePointHandler(BasicMapper mapper) { + public GetGamePointHandler(BasicMapper mapper, GamePointRepository gamePointRepository) { this.mapper = mapper; + this.gamePointRepository = gamePointRepository; } @Override public String handle(Map request) throws JsonProcessingException { + // This value is always false Boolean isAllGP = (Boolean) request.get("isAllGP"); Map resultMap = new LinkedHashMap<>(); - resultMap.put("length", 0); - resultMap.put("gamePointList", new List[]{}); + + List gpList = gamePointRepository.findAll(); + + resultMap.put("length", gpList.size()); + resultMap.put("gamePointList", gpList); String json = mapper.write(resultMap); diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGamePresentHandler.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGamePresentHandler.java index 1d22fea3..9f1f2f6b 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGamePresentHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGamePresentHandler.java @@ -1,13 +1,16 @@ package icu.samnyan.aqua.sega.ongeki.handler.impl; import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.ongeki.dao.gamedata.GamePresentRepository; import icu.samnyan.aqua.sega.ongeki.handler.BaseHandler; +import icu.samnyan.aqua.sega.ongeki.model.gamedata.GamePresent; import icu.samnyan.aqua.sega.util.jackson.BasicMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -22,19 +25,24 @@ public class GetGamePresentHandler implements BaseHandler { private final BasicMapper mapper; + private final GamePresentRepository gamePresentRepository; + @Autowired - public GetGamePresentHandler(BasicMapper mapper) { + public GetGamePresentHandler(BasicMapper mapper, GamePresentRepository gamePresentRepository) { this.mapper = mapper; + this.gamePresentRepository = gamePresentRepository; } @Override public String handle(Map request) throws JsonProcessingException { -// Boolean isAllGP = (Boolean) request.get("isAllReward"); + Boolean isAllPresent = (Boolean) request.get("isAllPresent"); + + List presentList = gamePresentRepository.findAll(); Map resultMap = new LinkedHashMap<>(); - resultMap.put("length", 0); - resultMap.put("gamePresentList", new List[]{}); + resultMap.put("length", presentList.size()); + resultMap.put("gamePresentList", presentList); String json = mapper.write(resultMap); diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameRankingHandler.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameRankingHandler.java index a7c26404..ecb5e681 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameRankingHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameRankingHandler.java @@ -1,18 +1,21 @@ package icu.samnyan.aqua.sega.ongeki.handler.impl; import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.general.dao.PropertyEntryRepository; +import icu.samnyan.aqua.sega.general.model.PropertyEntry; import icu.samnyan.aqua.sega.ongeki.handler.BaseHandler; +import icu.samnyan.aqua.sega.ongeki.model.response.data.GameRankingItem; import icu.samnyan.aqua.sega.util.jackson.BasicMapper; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** + * Get game music hot ranking list. * @author samnyan (privateamusement@protonmail.com) */ @Component("OngekiGetGameRankingHandler") @@ -20,22 +23,59 @@ public class GetGameRankingHandler implements BaseHandler { private static final Logger logger = LoggerFactory.getLogger(GetGameRankingHandler.class); - private final BasicMapper mapper; + private final PropertyEntryRepository propertyEntryRepository; + @Autowired - public GetGameRankingHandler(BasicMapper mapper) { + public GetGameRankingHandler(BasicMapper mapper, PropertyEntryRepository propertyEntryRepository) { this.mapper = mapper; + this.propertyEntryRepository = propertyEntryRepository; } @Override public String handle(Map request) throws JsonProcessingException { + // 1 is current, 2 is old + // See ADT_Ranking.cs Integer type = (Integer) request.get("type"); + Optional propertyEntryOptional; + if(type == 1) { + propertyEntryOptional = propertyEntryRepository.findByPropertyKey("ongeki_music_ranking_current"); + } else if(type == 2) { + propertyEntryOptional = propertyEntryRepository.findByPropertyKey("ongeki_music_ranking_old"); + } else { + propertyEntryOptional = Optional.empty(); + } Map resultMap = new LinkedHashMap<>(); resultMap.put("type", type); - resultMap.put("length", 0); - resultMap.put("gameRankingList", new List[]{}); + + if (propertyEntryOptional.isPresent()) { + String value = propertyEntryOptional.get().getPropertyValue(); + + if(StringUtils.isNotBlank(value) && value.contains(",")) { + String[] ids = value.split(","); + List list = new LinkedList<>(); + + for (String id : ids) { + try { + list.add(new GameRankingItem(Integer.parseInt(id), 0, "")); + } catch (NumberFormatException ignored) { + } + // in ADT_Ranking.cs, the game read this array and expected it has 10 value here. + while (list.size() < 10) { + list.add(new GameRankingItem(0, 0, "")); + } + } + + resultMap.put("gameRankingList", list); + + } else { + resultMap.put("gameRankingList", new List[]{}); + } + } else { + resultMap.put("gameRankingList", new List[]{}); + } String json = mapper.write(resultMap); logger.info("Response: " + json); diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameRewardHandler.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameRewardHandler.java index 56c482fa..0bdd69c5 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameRewardHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameRewardHandler.java @@ -1,13 +1,17 @@ package icu.samnyan.aqua.sega.ongeki.handler.impl; import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.ongeki.dao.gamedata.GameRewardRepository; import icu.samnyan.aqua.sega.ongeki.handler.BaseHandler; +import icu.samnyan.aqua.sega.ongeki.model.common.ItemType; +import icu.samnyan.aqua.sega.ongeki.model.gamedata.GameReward; import icu.samnyan.aqua.sega.util.jackson.BasicMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -22,9 +26,12 @@ public class GetGameRewardHandler implements BaseHandler { private final BasicMapper mapper; + private final GameRewardRepository gameRewardRepository; + @Autowired - public GetGameRewardHandler(BasicMapper mapper) { + public GetGameRewardHandler(BasicMapper mapper, GameRewardRepository gameRewardRepository) { this.mapper = mapper; + this.gameRewardRepository = gameRewardRepository; } @@ -32,9 +39,11 @@ public class GetGameRewardHandler implements BaseHandler { public String handle(Map request) throws JsonProcessingException { Boolean isAllGP = (Boolean) request.get("isAllReward"); + List rewardList = gameRewardRepository.findAll(); + Map resultMap = new LinkedHashMap<>(); - resultMap.put("length", 0); - resultMap.put("gameRewardList", new List[]{}); + resultMap.put("length", rewardList.size()); + resultMap.put("gameRewardList", rewardList); String json = mapper.write(resultMap); diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameSettingHandler.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameSettingHandler.java index 7b7ac6cd..3811dfe6 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameSettingHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetGameSettingHandler.java @@ -1,6 +1,8 @@ package icu.samnyan.aqua.sega.ongeki.handler.impl; import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.general.dao.PropertyEntryRepository; +import icu.samnyan.aqua.sega.general.model.PropertyEntry; import icu.samnyan.aqua.sega.ongeki.handler.BaseHandler; import icu.samnyan.aqua.sega.ongeki.model.response.GetGameSettingResp; import icu.samnyan.aqua.sega.ongeki.model.response.data.GameSetting; @@ -10,7 +12,6 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.time.LocalDateTime; import java.util.Map; /** @@ -23,23 +24,29 @@ public class GetGameSettingHandler implements BaseHandler { private final BasicMapper mapper; + private final PropertyEntryRepository propertyEntryRepository; + @Autowired - public GetGameSettingHandler(BasicMapper mapper) { + public GetGameSettingHandler(BasicMapper mapper, PropertyEntryRepository propertyEntryRepository) { this.mapper = mapper; + this.propertyEntryRepository = propertyEntryRepository; } @Override public String handle(Map request) throws JsonProcessingException { + PropertyEntry start = propertyEntryRepository.findByPropertyKey("reboot_start_time") + .orElseGet(() -> new PropertyEntry("reboot_start_time", "2020-01-01 23:59:00.0")); + PropertyEntry end = propertyEntryRepository.findByPropertyKey("reboot_end_time") + .orElseGet(() -> new PropertyEntry("reboot_end_time", "2020-01-01 23:59:00.0")); + GameSetting gameSetting = new GameSetting( "1.05.00", false, 10, - // So I test the game code that the game just - // can't run over 24 hour? Patch the isAutoRebootNeeded return false instead. - LocalDateTime.now().minusMinutes(1).minusSeconds(1), - LocalDateTime.now().minusMinutes(1), + start.getPropertyValue(), + end.getPropertyValue(), false, 300, 300, diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserEventRankingHandler.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserEventRankingHandler.java index 825a7503..eb0507c5 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserEventRankingHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserEventRankingHandler.java @@ -3,13 +3,18 @@ package icu.samnyan.aqua.sega.ongeki.handler.impl; import com.fasterxml.jackson.core.JsonProcessingException; import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserEventPointRepository; import icu.samnyan.aqua.sega.ongeki.handler.BaseHandler; +import icu.samnyan.aqua.sega.ongeki.model.response.data.UserEventRankingItem; +import icu.samnyan.aqua.sega.ongeki.model.userdata.UserEventPoint; import icu.samnyan.aqua.sega.util.jackson.BasicMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -36,10 +41,25 @@ public class GetUserEventRankingHandler implements BaseHandler { public String handle(Map request) throws JsonProcessingException { Integer userId = (Integer) request.get("userId"); + String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.0")); + + // TODO: query ranking from database + List eventPointList = userEventPointRepository.findByUser_Card_ExtId(userId); + List rankingItemList = new LinkedList<>(); + eventPointList.forEach(x -> { + rankingItemList.add(new UserEventRankingItem( + x.getEventId(), + 1, // Type 1 is latest ranking + time, + 1, + x.getPoint() + )); + }); + Map resultMap = new LinkedHashMap<>(); resultMap.put("userId", userId); - resultMap.put("length", 0); - resultMap.put("userEventRankingList", new List[]{}); + resultMap.put("length", rankingItemList.size()); + resultMap.put("userEventRankingList", rankingItemList); String json = mapper.write(resultMap); diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserMissionPointHandler.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserMissionPointHandler.java index c8827cdb..52b0f18c 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserMissionPointHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserMissionPointHandler.java @@ -1,7 +1,9 @@ package icu.samnyan.aqua.sega.ongeki.handler.impl; import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserMissionPointRepository; import icu.samnyan.aqua.sega.ongeki.handler.BaseHandler; +import icu.samnyan.aqua.sega.ongeki.model.userdata.UserMissionPoint; import icu.samnyan.aqua.sega.util.jackson.BasicMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,9 +24,12 @@ public class GetUserMissionPointHandler implements BaseHandler { private final BasicMapper mapper; + private final UserMissionPointRepository userMissionPointRepository; + @Autowired - public GetUserMissionPointHandler(BasicMapper mapper) { + public GetUserMissionPointHandler(BasicMapper mapper, UserMissionPointRepository userMissionPointRepository) { this.mapper = mapper; + this.userMissionPointRepository = userMissionPointRepository; } @@ -32,10 +37,12 @@ public class GetUserMissionPointHandler implements BaseHandler { public String handle(Map request) throws JsonProcessingException { Integer userId = (Integer) request.get("userId"); + List missionPointList = userMissionPointRepository.findByUser_Card_ExtId(userId); + Map resultMap = new LinkedHashMap<>(); resultMap.put("userId", userId); - resultMap.put("length", 0); - resultMap.put("userMissionPointList", new List[]{}); + resultMap.put("length", missionPointList.size()); + resultMap.put("userMissionPointList", missionPointList); String json = mapper.write(resultMap); diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserRecentRatingHandler.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserRecentRatingHandler.java index 2c8cfaa6..f2c05a5f 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserRecentRatingHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserRecentRatingHandler.java @@ -47,7 +47,6 @@ public class GetUserRecentRatingHandler implements BaseHandler { List ratingList = playlogList.stream().map(log -> new UserRecentRating(log.getMusicId(), log.getLevel(), "1000000", log.getTechScore())) .collect(Collectors.toList()); - Map resultMap = new LinkedHashMap<>(); resultMap.put("userId", userId); resultMap.put("length", ratingList.size()); diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserRegionHandler.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserRegionHandler.java index 3f43c40f..1c150521 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserRegionHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserRegionHandler.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.Map; /** + * The game doesn't send this to save * @author samnyan (privateamusement@protonmail.com) */ @Component("OngekiGetUserRegionHandler") diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserTrainingRoomByKeyHandler.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserTrainingRoomByKeyHandler.java index f27ca8fb..b1ec8e88 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserTrainingRoomByKeyHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/GetUserTrainingRoomByKeyHandler.java @@ -1,7 +1,9 @@ package icu.samnyan.aqua.sega.ongeki.handler.impl; import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserTrainingRoomRepository; import icu.samnyan.aqua.sega.ongeki.handler.BaseHandler; +import icu.samnyan.aqua.sega.ongeki.model.userdata.UserTrainingRoom; import icu.samnyan.aqua.sega.util.jackson.BasicMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,9 +24,12 @@ public class GetUserTrainingRoomByKeyHandler implements BaseHandler { private final BasicMapper mapper; + private final UserTrainingRoomRepository userTrainingRoomRepository; + @Autowired - public GetUserTrainingRoomByKeyHandler(BasicMapper mapper) { + public GetUserTrainingRoomByKeyHandler(BasicMapper mapper, UserTrainingRoomRepository userTrainingRoomRepository) { this.mapper = mapper; + this.userTrainingRoomRepository = userTrainingRoomRepository; } @@ -32,10 +37,12 @@ public class GetUserTrainingRoomByKeyHandler implements BaseHandler { public String handle(Map request) throws JsonProcessingException { Integer userId = (Integer) request.get("userId"); + List trainingRoomList = userTrainingRoomRepository.findByUser_Card_ExtId(userId); + Map resultMap = new LinkedHashMap<>(); resultMap.put("userId", userId); - resultMap.put("length", 0); - resultMap.put("userTrainingRoomList", new List[]{}); + resultMap.put("length", trainingRoomList.size()); + resultMap.put("userTrainingRoomList", trainingRoomList); String json = mapper.write(resultMap); diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/UpsertUserAllHandler.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/UpsertUserAllHandler.java index 11cbb798..3d44508c 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/UpsertUserAllHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/UpsertUserAllHandler.java @@ -1,6 +1,8 @@ package icu.samnyan.aqua.sega.ongeki.handler.impl; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import icu.samnyan.aqua.sega.chunithm.model.response.data.UserRecentRating; import icu.samnyan.aqua.sega.general.model.Card; import icu.samnyan.aqua.sega.general.service.CardService; import icu.samnyan.aqua.sega.ongeki.dao.userdata.*; @@ -48,10 +50,13 @@ public class UpsertUserAllHandler implements BaseHandler { private final UserMusicItemRepository userMusicItemRepository; private final UserLoginBonusRepository userLoginBonusRepository; private final UserEventPointRepository userEventPointRepository; + private final UserMissionPointRepository userMissionPointRepository; + private final UserTrainingRoomRepository userTrainingRoomRepository; + private final UserGeneralDataRepository userGeneralDataRepository; @Autowired public UpsertUserAllHandler(BasicMapper mapper, - CardService cardService, UserDataRepository userDataRepository, UserOptionRepository userOptionRepository, UserPlaylogRepository userPlaylogRepository, UserActivityRepository userActivityRepository, UserMusicDetailRepository userMusicDetailRepository, UserCharacterRepository userCharacterRepository, UserCardRepository userCardRepository, UserDeckRepository userDeckRepository, UserStoryRepository userStoryRepository, UserChapterRepository userChapterRepository, UserItemRepository userItemRepository, UserMusicItemRepository userMusicItemRepository, UserLoginBonusRepository userLoginBonusRepository, UserEventPointRepository userEventPointRepository) { + CardService cardService, UserDataRepository userDataRepository, UserOptionRepository userOptionRepository, UserPlaylogRepository userPlaylogRepository, UserActivityRepository userActivityRepository, UserMusicDetailRepository userMusicDetailRepository, UserCharacterRepository userCharacterRepository, UserCardRepository userCardRepository, UserDeckRepository userDeckRepository, UserStoryRepository userStoryRepository, UserChapterRepository userChapterRepository, UserItemRepository userItemRepository, UserMusicItemRepository userMusicItemRepository, UserLoginBonusRepository userLoginBonusRepository, UserEventPointRepository userEventPointRepository, UserMissionPointRepository userMissionPointRepository, UserTrainingRoomRepository userTrainingRoomRepository, UserGeneralDataRepository userGeneralDataRepository) { this.mapper = mapper; this.cardService = cardService; this.userDataRepository = userDataRepository; @@ -68,6 +73,9 @@ public class UpsertUserAllHandler implements BaseHandler { this.userMusicItemRepository = userMusicItemRepository; this.userLoginBonusRepository = userLoginBonusRepository; this.userEventPointRepository = userEventPointRepository; + this.userMissionPointRepository = userMissionPointRepository; + this.userTrainingRoomRepository = userTrainingRoomRepository; + this.userGeneralDataRepository = userGeneralDataRepository; } @Override @@ -85,7 +93,7 @@ public class UpsertUserAllHandler implements BaseHandler { Optional userOptional = userDataRepository.findByCard_ExtId(userId); - if(userOptional.isPresent()) { + if (userOptional.isPresent()) { userData = userOptional.get(); } else { userData = new UserData(); @@ -139,7 +147,7 @@ public class UpsertUserAllHandler implements BaseHandler { Integer kind = (Integer) userActivityMap.get("kind"); Integer id = (Integer) userActivityMap.get("id"); - if(kind != 0 && id!=0) { + if (kind != 0 && id != 0) { Optional activityOptional = userActivityRepository.findByUserAndKindAndActivityId(newUserData, kind, id); UserActivity userActivity = activityOptional.orElseGet(() -> new UserActivity(newUserData)); @@ -149,21 +157,54 @@ public class UpsertUserAllHandler implements BaseHandler { newUserActivityList.add(newUserActivity); } } + newUserActivityList.sort((a, b) -> Integer.compare(b.getSortNumber(), a.getSortNumber())); userActivityRepository.saveAll(newUserActivityList); } // UserRecentRatingList // This doesn't need to save. It can get from playlog - // UserBpBaseList - // From UserBatterPoint.cs, the game doesn't use the value here. So it doesn't need to save. + /* + * The rating and battle point calculation is little bit complex. + * So I just create a UserGeneralData class to store this value + * into a csv format for convenience + */ + // UserBpBaseList (For calculating Battle point) + if (upsertUserAll.containsKey("userBpBaseList")) { + this.saveGeneralData(upsertUserAll, newUserData, "userBpBaseList", "battle_point_base"); + } - // userRatingBaseBestNewList + // This is the best rating of all charts. Best 30 + 10 after that. // userRatingBaseBestList - // userRatingBaseHotList - // userRatingBaseNextNewList + if (upsertUserAll.containsKey("userRatingBaseBestList")) { + this.saveGeneralData(upsertUserAll, newUserData, "userRatingBaseBestList", "rating_base_best"); + } // userRatingBaseNextList + if (upsertUserAll.containsKey("userRatingBaseNextList")) { + this.saveGeneralData(upsertUserAll, newUserData, "userRatingBaseNextList", "rating_base_next"); + } + + + // This is the best rating of new charts. Best 15 + 10 after that. + // New chart means same version + // userRatingBaseBestNewList + if (upsertUserAll.containsKey("userRatingBaseBestNewList")) { + this.saveGeneralData(upsertUserAll, newUserData, "userRatingBaseBestNewList", "rating_base_new_best"); + } + // userRatingBaseNextNewList + if (upsertUserAll.containsKey("userRatingBaseNextNewList")) { + this.saveGeneralData(upsertUserAll, newUserData, "userRatingBaseBestNewList", "rating_base_new_next"); + } + + // This is the recent best + // userRatingBaseHotList + if (upsertUserAll.containsKey("userRatingBaseHotList")) { + this.saveGeneralData(upsertUserAll, newUserData, "userRatingBaseHotList", "rating_base_hot_best"); + } // userRatingBaseHotNextList + if (upsertUserAll.containsKey("userRatingBaseHotNextList")) { + this.saveGeneralData(upsertUserAll, newUserData, "userRatingBaseHotNextList", "rating_base_hot_next"); + } // UserMusicDetailList if (upsertUserAll.containsKey("userMusicDetailList")) { @@ -242,7 +283,25 @@ public class UpsertUserAllHandler implements BaseHandler { userDeckRepository.saveAll(newUserDeckList); } - // TODO: userTrainingRoomList + // userTrainingRoomList + if (upsertUserAll.containsKey("userTrainingRoomList")) { + List> userTrainingRoomList = ((List>) upsertUserAll.get("userTrainingRoomList")); + List newUserTrainingRoomList = new ArrayList<>(); + + for (Map userTrainingRoomMap : userTrainingRoomList) { + Integer roomId = (Integer) userTrainingRoomMap.get("roomId"); + + Optional trainingRoomOptional = userTrainingRoomRepository.findByUserAndRoomId(newUserData, roomId); + UserTrainingRoom trainingRoom = trainingRoomOptional.orElseGet(() -> new UserTrainingRoom(newUserData)); + + UserTrainingRoom newUserTrainingRoom = mapper.convert(userTrainingRoomMap, UserTrainingRoom.class); + newUserTrainingRoom.setId(trainingRoom.getId()); + newUserTrainingRoom.setUser(newUserData); + newUserTrainingRoomList.add(newUserTrainingRoom); + } + userTrainingRoomRepository.saveAll(newUserTrainingRoomList); + } + // UserStoryList if (upsertUserAll.containsKey("userStoryList")) { @@ -363,13 +422,51 @@ public class UpsertUserAllHandler implements BaseHandler { } // UserMissionPointList + if (upsertUserAll.containsKey("userMissionPointList")) { + List> userMissionPointList = ((List>) upsertUserAll.get("userMissionPointList")); + List newUserMissionPointList = new ArrayList<>(); - // UserRatinglogList + for (Map userMissionPointMap : userMissionPointList) { + Integer eventId = (Integer) userMissionPointMap.get("eventId"); + + Optional userMissionPointOptional = userMissionPointRepository.findByUserAndEventId(newUserData, eventId); + UserMissionPoint userMissionPoint = userMissionPointOptional.orElseGet(() -> new UserMissionPoint(newUserData)); + + UserMissionPoint newUserEventPoint = mapper.convert(userMissionPointMap, UserMissionPoint.class); + newUserEventPoint.setId(userMissionPoint.getId()); + newUserEventPoint.setUser(newUserData); + newUserMissionPointList.add(newUserEventPoint); + } + userMissionPointRepository.saveAll(newUserMissionPointList); + } + + // UserRatinglogList (For the highest rating of each version) - String json = mapper.write(new CodeResp(1,"upsertUserAll")); + String json = mapper.write(new CodeResp(1, "upsertUserAll")); logger.info("Response: " + json); return json; } + + private void saveGeneralData(Map upsertUserAll, UserData newUserData, String jsonName, String key) { + List> recordList = ((List>) upsertUserAll.get(jsonName)); + // User this recent rating class from chunithm + List itemList = mapper.convert(recordList, new TypeReference<>() { + }); + StringBuilder sb = new StringBuilder(); + // Convert to a string + for (UserRecentRating item : + itemList) { + sb.append(item.getMusicId()).append(":").append(item.getDifficultId()).append(":").append(item.getScore()); + sb.append(","); + } + if(sb.length() > 0) { + sb.deleteCharAt(sb.length() - 1); + } + Optional uOptional = userGeneralDataRepository.findByUserAndPropertyKey(newUserData, key); + UserGeneralData userGeneralData = uOptional.orElseGet(() -> new UserGeneralData(newUserData, key)); + userGeneralData.setPropertyValue(sb.toString()); + userGeneralDataRepository.save(userGeneralData); + } } diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/common/GpProductID.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/common/GpProductID.java new file mode 100644 index 00000000..fe00e53c --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/common/GpProductID.java @@ -0,0 +1,26 @@ +package icu.samnyan.aqua.sega.ongeki.model.common; + +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +public enum GpProductID { + A_Credit1(0), + A_Credit2(1), + A_Credit3(2), + B_Credit1(3), + B_Credit2(4), + B_Credit3(5), + End(6); + + private int value; + + GpProductID(int i) { this.value = i; } + + @JsonValue + public int getValue() { + return this.value; + } + +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/common/IdListType.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/common/IdListType.java new file mode 100644 index 00000000..c7986c55 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/common/IdListType.java @@ -0,0 +1,17 @@ +package icu.samnyan.aqua.sega.ongeki.model.common; + +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +public enum IdListType { + Invalid, + NgMusic, + Recommend; + + @JsonValue + public int toValue() { + return ordinal(); + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/common/ItemType.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/common/ItemType.java new file mode 100644 index 00000000..a99089ba --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/common/ItemType.java @@ -0,0 +1,27 @@ +package icu.samnyan.aqua.sega.ongeki.model.common; + +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +public enum ItemType { + None, + Card, + NamePlate, + Trophy, + LimitBreakItem, + AlmightyJewel, + Money, + Music, + ProfileVoice, + Present, + ChapterJewel, + GachaTicket, + Max; + + @JsonValue + public int toValue() { + return ordinal(); + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/gamedata/GamePoint.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/gamedata/GamePoint.java new file mode 100644 index 00000000..70b2921b --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/gamedata/GamePoint.java @@ -0,0 +1,42 @@ +package icu.samnyan.aqua.sega.ongeki.model.gamedata; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import icu.samnyan.aqua.sega.ongeki.model.common.GpProductID; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Entity(name = "OngekiGamePoint") +@Table(name = "ongeki_game_point", uniqueConstraints = {@UniqueConstraint(columnNames = {"type"})}) +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GamePoint implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @JsonIgnore + private long id; + + @Enumerated(EnumType.ORDINAL) + private GpProductID type; + + private int cost; + + private String startDate = "2000-01-01 05:00:00.0"; + + private String endDate = "2099-01-01 05:00:00.0"; + + public GamePoint(GpProductID type, int cost) { + this.type = type; + this.cost = cost; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/gamedata/GamePresent.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/gamedata/GamePresent.java new file mode 100644 index 00000000..23886d01 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/gamedata/GamePresent.java @@ -0,0 +1,47 @@ +package icu.samnyan.aqua.sega.ongeki.model.gamedata; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Entity(name = "OngekiGamePresent") +@Table(name = "ongeki_game_present") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GamePresent implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @Column(name = "id") + private long presentId; + + private String presentName; + + private int rewardId; + + // count + private int stock; + + // acquisitionCondition + private String message; + + private String startDate = "2000-01-01 05:00:00.0"; + + private String endDate = "2099-01-01 05:00:00.0"; + + public GamePresent(int presentId, String presentName, int rewardId, int stock, String message) { + this.presentId = presentId; + this.presentName = presentName; + this.rewardId = rewardId; + this.stock = stock; + this.message = message; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/gamedata/GameReward.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/gamedata/GameReward.java new file mode 100644 index 00000000..0105b777 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/gamedata/GameReward.java @@ -0,0 +1,38 @@ +package icu.samnyan.aqua.sega.ongeki.model.gamedata; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import icu.samnyan.aqua.sega.ongeki.model.common.ItemType; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Entity(name = "OngekiGameReward") +@Table(name = "ongeki_game_reward") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GameReward implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @Column(name = "id") + private long rewardId; + + @Enumerated(EnumType.ORDINAL) + private ItemType itemKind; + + private int itemId; + + public GameReward(int rewardId, ItemType itemKind, int itemId) { + this.rewardId = rewardId; + this.itemKind = itemKind; + this.itemId = itemId; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/response/data/GameRankingItem.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/response/data/GameRankingItem.java new file mode 100644 index 00000000..59e2e4e8 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/response/data/GameRankingItem.java @@ -0,0 +1,20 @@ +package icu.samnyan.aqua.sega.ongeki.model.response.data; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Fro getGameRanking request + * @author samnyan (privateamusement@protonmail.com) + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class GameRankingItem { + private long id; + // this 2 field never use in game code, + // maybe for the future update like in game player ranking + private long point; + private String userName; +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/response/data/GameSetting.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/response/data/GameSetting.java index 90929162..d607213f 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/response/data/GameSetting.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/response/data/GameSetting.java @@ -18,8 +18,8 @@ public class GameSetting { @JsonProperty("isMaintenance") private boolean isMaintenance; private int requestInterval; - private LocalDateTime rebootStartTime; - private LocalDateTime rebootEndTime; + private String rebootStartTime; + private String rebootEndTime; @JsonProperty("isBackgroundDistribute") private boolean isBackgroundDistribute; private int maxCountCharacter; diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/response/data/UserEventRankingItem.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/response/data/UserEventRankingItem.java new file mode 100644 index 00000000..46b7f3f7 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/response/data/UserEventRankingItem.java @@ -0,0 +1,19 @@ +package icu.samnyan.aqua.sega.ongeki.model.response.data; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserEventRankingItem { + private int eventId; + private int type; + private String date; + private int rank; + private long point; +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserEventPoint.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserEventPoint.java index 5390054f..d931a726 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserEventPoint.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserEventPoint.java @@ -10,6 +10,7 @@ import javax.persistence.*; import java.io.Serializable; /** + * For chapter event. * @author samnyan (privateamusement@protonmail.com) */ @Entity(name = "OngekiUserEventPoint") diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserGeneralData.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserGeneralData.java new file mode 100644 index 00000000..dd81f918 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserGeneralData.java @@ -0,0 +1,43 @@ +package icu.samnyan.aqua.sega.ongeki.model.userdata; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * This is for storing some data only use in aqua + * @author samnyan (privateamusement@protonmail.com) + */ +@Entity(name = "OngekiUserGeneralData") +@Table(name = "ongeki_user_general_data") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserGeneralData implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @JsonIgnore + private long id; + + @JsonIgnore + @ManyToOne + @JoinColumn(name = "user_id") + private UserData user; + + private String propertyKey; + + private String propertyValue; + + public UserGeneralData(UserData userData, String key) { + this.user = userData; + this.propertyKey = key; + this.propertyValue = ""; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserMissionPoint.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserMissionPoint.java new file mode 100644 index 00000000..30cb36d9 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserMissionPoint.java @@ -0,0 +1,42 @@ +package icu.samnyan.aqua.sega.ongeki.model.userdata; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * For mission event + * @author samnyan (privateamusement@protonmail.com) + */ +@Entity(name = "OngekiUserMissionPoint") +@Table(name = "ongeki_user_mission_point") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserMissionPoint implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @JsonIgnore + private long id; + + @JsonIgnore + @ManyToOne + @JoinColumn(name = "user_id") + private UserData user; + + private int eventId; + + private long point; + + public UserMissionPoint(UserData userData) { + this.user = userData; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserTrainingRoom.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserTrainingRoom.java index 5a48ee02..95c089dc 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserTrainingRoom.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserTrainingRoom.java @@ -38,4 +38,7 @@ public class UserTrainingRoom implements Serializable { public String valueDate; + public UserTrainingRoom(UserData userData) { + this.user = userData; + } } diff --git a/src/main/java/icu/samnyan/aqua/sega/util/jackson/BasicMapper.java b/src/main/java/icu/samnyan/aqua/sega/util/jackson/BasicMapper.java index c8462f3a..b054119a 100644 --- a/src/main/java/icu/samnyan/aqua/sega/util/jackson/BasicMapper.java +++ b/src/main/java/icu/samnyan/aqua/sega/util/jackson/BasicMapper.java @@ -39,10 +39,14 @@ public class BasicMapper { } - public T convert(Map map, Class toClass) { + public T convert(Object map, Class toClass) { return mapper.convertValue(map, toClass); } + public T convert(Object map, TypeReference toValueTypeRef) { + return mapper.convertValue(map, toValueTypeRef); + } + public LinkedHashMap toMap(Object object) { return mapper.convertValue(object, new TypeReference<>() { }); diff --git a/src/main/resources/db/migration/mysql/V17__addition_ongeki_game_data.sql b/src/main/resources/db/migration/mysql/V17__addition_ongeki_game_data.sql new file mode 100644 index 00000000..93f52769 --- /dev/null +++ b/src/main/resources/db/migration/mysql/V17__addition_ongeki_game_data.sql @@ -0,0 +1,66 @@ +create table ongeki_user_mission_point +( + id bigint auto_increment + primary key, + event_id int not null, + point bigint not null, + user_id bigint null, + constraint FK867xgd2c5g6ic4k1tbd32hhqb + foreign key (user_id) references ongeki_user_data (id) +); + +create table ongeki_game_point +( + id bigint not null + primary key, + type int not null, + cost int not null, + start_date varchar(255) not null, + end_date varchar(255) not null +); + +create table ongeki_game_present +( + id bigint not null + primary key, + present_name varchar(255) not null, + reward_id int not null, + stock int not null, + message varchar(255) not null, + start_date varchar(255) not null, + end_date varchar(255) not null +); + +create table ongeki_game_reward +( + id bigint not null + primary key, + item_kind int not null, + item_id int not null +); + +create table ongeki_user_general_data +( + id bigint auto_increment + primary key, + property_key varchar(255) not null, + property_value text not null, + user_id bigint null, + constraint UK2upnsa6nothlfrqewa4tma62d + unique (user_id, property_key), + constraint FKj1v48ag7iyelf1va5hbcv63uj + foreign key (user_id) references ongeki_user_data (id) +); + +INSERT INTO ongeki_game_point (id, type, cost, start_date, end_date) +VALUES (1, 0, 100, '2000-01-01 05:00:00.0', '2099-01-01 05:00:00.0'); +INSERT INTO ongeki_game_point (id, type, cost, start_date, end_date) +VALUES (2, 1, 200, '2000-01-01 05:00:00.0', '2099-01-01 05:00:00.0'); +INSERT INTO ongeki_game_point (id, type, cost, start_date, end_date) +VALUES (3, 2, 300, '2000-01-01 05:00:00.0', '2099-01-01 05:00:00.0'); +INSERT INTO ongeki_game_point (id, type, cost, start_date, end_date) +VALUES (4, 3, 333, '2000-01-01 05:00:00.0', '2099-01-01 05:00:00.0'); +INSERT INTO ongeki_game_point (id, type, cost, start_date, end_date) +VALUES (5, 4, 666, '2000-01-01 05:00:00.0', '2099-01-01 05:00:00.0'); +INSERT INTO ongeki_game_point (id, type, cost, start_date, end_date) +VALUES (6, 5, 999, '2000-01-01 05:00:00.0', '2099-01-01 05:00:00.0'); diff --git a/src/main/resources/db/migration/mysql/V18__add_default_reboot_time.sql b/src/main/resources/db/migration/mysql/V18__add_default_reboot_time.sql new file mode 100644 index 00000000..885b1a17 --- /dev/null +++ b/src/main/resources/db/migration/mysql/V18__add_default_reboot_time.sql @@ -0,0 +1,2 @@ +INSERT INTO property (property_key, property_value) VALUE ('reboot_start_time', '2020-01-01 23:59:00.0'); +INSERT INTO property (property_key, property_value) VALUE ('reboot_end_time', '2020-01-01 23:59:00.0'); \ No newline at end of file diff --git a/src/main/resources/db/migration/sqlite/V17__addition_ongeki_game_data.sql b/src/main/resources/db/migration/sqlite/V17__addition_ongeki_game_data.sql new file mode 100644 index 00000000..af7069fd --- /dev/null +++ b/src/main/resources/db/migration/sqlite/V17__addition_ongeki_game_data.sql @@ -0,0 +1,74 @@ +-- Table: ongeki_user_mission_point +CREATE TABLE ongeki_user_mission_point +( + id INTEGER, + event_id INTEGER NOT NULL, + point BIGINT NOT NULL, + user_id BIGINT REFERENCES ongeki_user_data (id) ON DELETE CASCADE, + PRIMARY KEY ( + id + ), + CONSTRAINT ongeki_user_mission_point_uq UNIQUE ( + event_id, + user_id + ) ON CONFLICT REPLACE +); + +CREATE TABLE ongeki_game_point +( + id BIGINT, + type INTEGER NOT NULL, + cost INTEGER NOT NULL, + start_date VARCHAR(255) NOT NULL, + end_date VARCHAR(255) NOT NULL, + PRIMARY KEY ( + id + ) +); + +CREATE TABLE ongeki_game_present +( + id BIGINT, + present_name VARCHAR(255) NOT NULL, + reward_id INTEGER NOT NULL, + stock INTEGER NOT NULL, + + message VARCHAR(255) NOT NULL, + start_date VARCHAR(255) NOT NULL, + end_date VARCHAR(255) NOT NULL, + PRIMARY KEY ( + id + ) +); + +CREATE TABLE ongeki_game_reward +( + id BIGINT, + item_kind INTEGER NOT NULL, + item_id INTEGER NOT NULL, + PRIMARY KEY ( + id + ) +); + +CREATE TABLE ongeki_user_general_data +( + id INTEGER, + property_key VARCHAR NOT NULL, + property_value VARCHAR NOT NULL, + user_id BIGINT REFERENCES ongeki_user_data (id) ON DELETE CASCADE, + PRIMARY KEY ( + id + ), + CONSTRAINT ongeki_user_general_data_uq UNIQUE ( + property_key, + user_id + ) ON CONFLICT REPLACE +); + +INSERT INTO ongeki_game_point (id, type, cost, start_date, end_date) VALUES (1, 0, 100, '2000-01-01 05:00:00.0', '2099-01-01 05:00:00.0'); +INSERT INTO ongeki_game_point (id, type, cost, start_date, end_date) VALUES (2, 1, 200, '2000-01-01 05:00:00.0', '2099-01-01 05:00:00.0'); +INSERT INTO ongeki_game_point (id, type, cost, start_date, end_date) VALUES (3, 2, 300, '2000-01-01 05:00:00.0', '2099-01-01 05:00:00.0'); +INSERT INTO ongeki_game_point (id, type, cost, start_date, end_date) VALUES (4, 3, 333, '2000-01-01 05:00:00.0', '2099-01-01 05:00:00.0'); +INSERT INTO ongeki_game_point (id, type, cost, start_date, end_date) VALUES (5, 4, 666, '2000-01-01 05:00:00.0', '2099-01-01 05:00:00.0'); +INSERT INTO ongeki_game_point (id, type, cost, start_date, end_date) VALUES (6, 5, 999, '2000-01-01 05:00:00.0', '2099-01-01 05:00:00.0'); diff --git a/src/main/resources/db/migration/sqlite/V18__add_default_reboot_time.sql b/src/main/resources/db/migration/sqlite/V18__add_default_reboot_time.sql new file mode 100644 index 00000000..885b1a17 --- /dev/null +++ b/src/main/resources/db/migration/sqlite/V18__add_default_reboot_time.sql @@ -0,0 +1,2 @@ +INSERT INTO property (property_key, property_value) VALUE ('reboot_start_time', '2020-01-01 23:59:00.0'); +INSERT INTO property (property_key, property_value) VALUE ('reboot_end_time', '2020-01-01 23:59:00.0'); \ No newline at end of file