[maimai2] Implement proper player rate saving

pull/1/head
Dom Eori 2021-10-07 22:30:15 +09:00
parent 974a0d3fe2
commit 550f4c4228
6 changed files with 89 additions and 83 deletions

View File

@ -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<UserRate, Long> {
Optional<UserRate> findByUserAndMusicIdAndLevel(UserDetail user, int musicId, int level);
List<UserRate> findByUser_Card_ExtId(long userId);
}

View File

@ -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<String, Object> request) throws JsonProcessingException {
long userId = ((Number) request.get("userId")).longValue();
List<UserRate> userRate = userRateRepository.findByUser_Card_ExtId(userId);
Optional<UserGeneralData> recentOptional = userGeneralDataRepository.findByUser_Card_ExtIdAndPropertyKey(userId, "recent_rating");
Optional<UserGeneralData> recentNewOptional = userGeneralDataRepository.findByUser_Card_ExtIdAndPropertyKey(userId, "recent_rating_new");
Optional<UserGeneralData> recentNextOptional = userGeneralDataRepository.findByUser_Card_ExtIdAndPropertyKey(userId, "recent_rating_next");
Optional<UserGeneralData> recentNextNewOptional = userGeneralDataRepository.findByUser_Card_ExtIdAndPropertyKey(userId, "recent_rating_next_new");
List<UserRate> 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<UserUdemae> 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<UserRate> loadRateData(String val) {
List<UserRate> 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;
}
}

View File

@ -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<UserRate> userRateList = userRating.getRatingList();
List<UserRate> 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<UserRate> 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<UserRate> 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<UserGeneralData> uOptional = userGeneralDataRepository.findByUserAndPropertyKey(newUserData, key);
UserGeneralData userGeneralData = uOptional.orElseGet(() -> new UserGeneralData(newUserData, key));
userGeneralData.setPropertyValue(sb.toString());
userGeneralDataRepository.save(userGeneralData);
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1 @@
ALTER TABLE maimai2_user_rate RENAME TO bak_maimai2_user_rate;

View File

@ -0,0 +1 @@
ALTER TABLE maimai2_user_rate RENAME TO bak_maimai2_user_rate;