From 550f4c422838bacb4dc0d3866c0a77312d4133a9 Mon Sep 17 00:00:00 2001 From: Dom Eori <4j6dq2zi8@relay.firefox.com> Date: Thu, 7 Oct 2021 22:30:15 +0900 Subject: [PATCH] [maimai2] Implement proper player rate saving --- .../dao/userdata/UserRateRepository.java | 22 ------ .../handler/impl/GetUserRatingHandler.java | 76 ++++++++++++++----- .../handler/impl/UpsertUserAllHandler.java | 47 +++++++----- .../sega/maimai2/model/userdata/UserRate.java | 25 +----- .../mysql/V59__rename_maimai2_rate_table.sql | 1 + .../sqlite/V59__rename_maimai2_rate_table.sql | 1 + 6 files changed, 89 insertions(+), 83 deletions(-) delete mode 100644 src/main/java/icu/samnyan/aqua/sega/maimai2/dao/userdata/UserRateRepository.java create mode 100644 src/main/resources/db/migration/mysql/V59__rename_maimai2_rate_table.sql create mode 100644 src/main/resources/db/migration/sqlite/V59__rename_maimai2_rate_table.sql diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/dao/userdata/UserRateRepository.java b/src/main/java/icu/samnyan/aqua/sega/maimai2/dao/userdata/UserRateRepository.java deleted file mode 100644 index e3d4bba6..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/dao/userdata/UserRateRepository.java +++ /dev/null @@ -1,22 +0,0 @@ -package icu.samnyan.aqua.sega.maimai2.dao.userdata; - -import icu.samnyan.aqua.sega.maimai2.model.userdata.UserDetail; -import icu.samnyan.aqua.sega.maimai2.model.userdata.UserRate; - -import java.util.List; -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Repository("Maimai2UserRateRepository") -public interface UserRateRepository extends JpaRepository { - - Optional findByUserAndMusicIdAndLevel(UserDetail user, int musicId, int level); - - List findByUser_Card_ExtId(long userId); - -} diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/GetUserRatingHandler.java b/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/GetUserRatingHandler.java index e17c45f8..cc4d41f1 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/GetUserRatingHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/GetUserRatingHandler.java @@ -3,23 +3,21 @@ package icu.samnyan.aqua.sega.maimai2.handler.impl; import com.fasterxml.jackson.core.JsonProcessingException; import icu.samnyan.aqua.sega.maimai2.dao.userdata.UserDataRepository; -import icu.samnyan.aqua.sega.maimai2.dao.userdata.UserRateRepository; +import icu.samnyan.aqua.sega.maimai2.dao.userdata.UserGeneralDataRepository; import icu.samnyan.aqua.sega.maimai2.dao.userdata.UserUdemaeRepository; import icu.samnyan.aqua.sega.maimai2.handler.BaseHandler; import icu.samnyan.aqua.sega.maimai2.model.response.data.UserRating; import icu.samnyan.aqua.sega.maimai2.model.userdata.UserDetail; +import icu.samnyan.aqua.sega.maimai2.model.userdata.UserGeneralData; import icu.samnyan.aqua.sega.maimai2.model.userdata.UserRate; import icu.samnyan.aqua.sega.maimai2.model.userdata.UserUdemae; 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.stereotype.Component; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; /** * @author samnyan (privateamusement@protonmail.com) @@ -30,15 +28,14 @@ public class GetUserRatingHandler implements BaseHandler { private static final Logger logger = LoggerFactory.getLogger(GetUserRatingHandler.class); private final BasicMapper mapper; - - private final UserRateRepository userRateRepository; + private final UserGeneralDataRepository userGeneralDataRepository; private final UserUdemaeRepository userUdemaeRepository; private final UserDataRepository userDataRepository; - public GetUserRatingHandler(BasicMapper mapper, UserRateRepository userRateRepository, UserUdemaeRepository userUdemaeRepository, + public GetUserRatingHandler(BasicMapper mapper, UserUdemaeRepository userUdemaeRepository, UserGeneralDataRepository userGeneralDataRepository, UserDataRepository userDataRepository) { this.mapper = mapper; - this.userRateRepository = userRateRepository; + this.userGeneralDataRepository = userGeneralDataRepository; this.userUdemaeRepository = userUdemaeRepository; this.userDataRepository = userDataRepository; } @@ -47,7 +44,10 @@ public class GetUserRatingHandler implements BaseHandler { public String handle(Map request) throws JsonProcessingException { long userId = ((Number) request.get("userId")).longValue(); - List userRate = userRateRepository.findByUser_Card_ExtId(userId); + Optional recentOptional = userGeneralDataRepository.findByUser_Card_ExtIdAndPropertyKey(userId, "recent_rating"); + Optional recentNewOptional = userGeneralDataRepository.findByUser_Card_ExtIdAndPropertyKey(userId, "recent_rating_new"); + Optional recentNextOptional = userGeneralDataRepository.findByUser_Card_ExtIdAndPropertyKey(userId, "recent_rating_next"); + Optional recentNextNewOptional = userGeneralDataRepository.findByUser_Card_ExtIdAndPropertyKey(userId, "recent_rating_next_new"); List emptyRating = new ArrayList<>(); UserRating userRating = new UserRating(); @@ -58,17 +58,36 @@ public class GetUserRatingHandler implements BaseHandler { userRating.setRating(user.getPlayerRating()); } - // TODO: Fix these, rating is incorrect - // Old charts (standard) = 25 - userRating.setRatingList(userRate); + if (recentOptional.isPresent()) { + String val = recentOptional.get().getPropertyValue(); + userRating.setRatingList(loadRateData(val)); + } else { + userRating.setRatingList(emptyRating); + } // New charts (DX) = 15 - userRating.setNewRatingList(emptyRating); - + if (recentNewOptional.isPresent()) { + String val = recentNewOptional.get().getPropertyValue(); + userRating.setNewRatingList(loadRateData(val)); + } else { + userRating.setNewRatingList(emptyRating); + } + // ?? - userRating.setNextRatingList(emptyRating); - userRating.setNextNewRatingList(emptyRating); + if (recentNextOptional.isPresent()) { + String val = recentNextOptional.get().getPropertyValue(); + userRating.setNextRatingList(loadRateData(val)); + } else { + userRating.setNextRatingList(emptyRating); + } + + if (recentNextNewOptional.isPresent()) { + String val = recentNextNewOptional.get().getPropertyValue(); + userRating.setNextNewRatingList(loadRateData(val)); + } else { + userRating.setNextNewRatingList(emptyRating); + } Optional optionalUserUdemae = userUdemaeRepository.findByUser_Card_ExtId(userId); if (optionalUserUdemae.isPresent()) { @@ -86,4 +105,25 @@ public class GetUserRatingHandler implements BaseHandler { logger.info("Response: " + json); return json; } + + private List loadRateData(String val) { + List rateList = new LinkedList<>(); + + if(StringUtils.isNotBlank(val) && val.contains(",")) { + String[] records = val.split(","); + for (String record : + records) { + String[] value = record.split(":"); + rateList.add(new UserRate( + Integer.parseInt(value[0]), + Integer.parseInt(value[1]), + Integer.parseInt(value[2]), + Integer.parseInt(value[3]) + )); + } + } + + return rateList; + } + } diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/UpsertUserAllHandler.java b/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/UpsertUserAllHandler.java index 8cb03ba4..5c6f75ed 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/UpsertUserAllHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/UpsertUserAllHandler.java @@ -43,10 +43,10 @@ public class UpsertUserAllHandler implements BaseHandler { private final UserMapRepository userMapRepository; private final UserLoginBonusRepository userLoginBonusRepository; private final UserFavoriteRepository userFavoriteRepository; - private final UserRateRepository userRateRepository; private final UserUdemaeRepository userUdemaeRepository; + private final UserGeneralDataRepository userGeneralDataRepository; - public UpsertUserAllHandler(BasicMapper mapper, CardService cardService, UserDataRepository userDataRepository, UserExtendRepository userExtendRepository, UserOptionRepository userOptionRepository, UserItemRepository userItemRepository, UserMusicDetailRepository userMusicDetailRepository, UserActRepository userActRepository, UserCharacterRepository userCharacterRepository, UserMapRepository userMapRepository, UserLoginBonusRepository userLoginBonusRepository, UserFavoriteRepository userFavoriteRepository, UserRateRepository userRateRepository, UserUdemaeRepository userUdemaeRepository) { + public UpsertUserAllHandler(BasicMapper mapper, CardService cardService, UserDataRepository userDataRepository, UserExtendRepository userExtendRepository, UserOptionRepository userOptionRepository, UserItemRepository userItemRepository, UserMusicDetailRepository userMusicDetailRepository, UserActRepository userActRepository, UserCharacterRepository userCharacterRepository, UserMapRepository userMapRepository, UserLoginBonusRepository userLoginBonusRepository, UserFavoriteRepository userFavoriteRepository, UserUdemaeRepository userUdemaeRepository, UserGeneralDataRepository userGeneralDataRepository) { this.mapper = mapper; this.cardService = cardService; this.userDataRepository = userDataRepository; @@ -59,8 +59,8 @@ public class UpsertUserAllHandler implements BaseHandler { this.userMapRepository = userMapRepository; this.userLoginBonusRepository = userLoginBonusRepository; this.userFavoriteRepository = userFavoriteRepository; - this.userRateRepository = userRateRepository; this.userUdemaeRepository = userUdemaeRepository; + this.userGeneralDataRepository = userGeneralDataRepository; } @Override @@ -198,23 +198,15 @@ public class UpsertUserAllHandler implements BaseHandler { userUdemaeRepository.saveAndFlush(newUserUdemae); - List userRateList = userRating.getRatingList(); - List newUserRateList = new ArrayList<>(); + /* UserRate: + Let's save recent user rating as same as ongeki implementation. + Previously saved rating will not compatible with this and will be lost, sorry. + */ - // UserRate - for (UserRate newUserRate : userRateList) { - int musicId = newUserRate.getMusicId(); - int musicLevel = newUserRate.getLevel(); - - Optional rateOptional = userRateRepository.findByUserAndMusicIdAndLevel(newUserData, musicId, musicLevel); - UserRate userRate = rateOptional.orElseGet(() -> new UserRate(newUserData)); - - newUserRate.setId(userRate.getId()); - newUserRate.setUser(newUserData); - newUserRateList.add(newUserRate); - - } - userRateRepository.saveAll(newUserRateList); + this.saveGeneralData(userRating.getRatingList(), newUserData, "recent_rating"); + this.saveGeneralData(userRating.getNewRatingList(), newUserData, "recent_rating_new"); + this.saveGeneralData(userRating.getNextRatingList(), newUserData, "recent_rating_next"); + this.saveGeneralData(userRating.getNextNewRatingList(), newUserData, "recent_rating_next_new"); } // UserItemList @@ -303,4 +295,21 @@ public class UpsertUserAllHandler implements BaseHandler { return "{\"returnCode\":1,\"apiName\":\"com.sega.maimai2servlet.api.UpsertUserAllApi\"}"; } + + private void saveGeneralData(List itemList, UserDetail newUserData, String key) { + StringBuilder sb = new StringBuilder(); + // Convert to a string + for (UserRate item : + itemList) { + sb.append(item.getMusicId()).append(":").append(item.getLevel()).append(":").append(item.getRomVersion()).append(":").append(item.getAchievement()); + 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/maimai2/model/userdata/UserRate.java b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserRate.java index 52df08b6..7f325f3d 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserRate.java +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserRate.java @@ -4,38 +4,15 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.io.Serializable; - -import javax.persistence.*; - -import com.fasterxml.jackson.annotation.JsonIgnore; - /** * @author samnyan (privateamusement@protonmail.com) */ -@Entity(name = "Maimai2UserRate") -@Table(name = "maimai2_user_rate") @Data @AllArgsConstructor @NoArgsConstructor -public class UserRate implements Serializable { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @JsonIgnore - private long id; - - @JsonIgnore - @ManyToOne - @JoinColumn(name = "user_id") - private UserDetail user; - +public class UserRate { private int musicId; private int level; private int romVersion; private int achievement; - - public UserRate(UserDetail user) { - this.user = user; - } } diff --git a/src/main/resources/db/migration/mysql/V59__rename_maimai2_rate_table.sql b/src/main/resources/db/migration/mysql/V59__rename_maimai2_rate_table.sql new file mode 100644 index 00000000..9ada9699 --- /dev/null +++ b/src/main/resources/db/migration/mysql/V59__rename_maimai2_rate_table.sql @@ -0,0 +1 @@ +ALTER TABLE maimai2_user_rate RENAME TO bak_maimai2_user_rate; \ No newline at end of file diff --git a/src/main/resources/db/migration/sqlite/V59__rename_maimai2_rate_table.sql b/src/main/resources/db/migration/sqlite/V59__rename_maimai2_rate_table.sql new file mode 100644 index 00000000..9ada9699 --- /dev/null +++ b/src/main/resources/db/migration/sqlite/V59__rename_maimai2_rate_table.sql @@ -0,0 +1 @@ +ALTER TABLE maimai2_user_rate RENAME TO bak_maimai2_user_rate; \ No newline at end of file