diff --git a/src/main/java/icu/samnyan/aqua/api/controller/sega/game/chuni/amazon/ApiAmazonPlayerDataController.java b/src/main/java/icu/samnyan/aqua/api/controller/sega/game/chuni/amazon/ApiAmazonPlayerDataController.java index 5a39d767..710df6d1 100644 --- a/src/main/java/icu/samnyan/aqua/api/controller/sega/game/chuni/amazon/ApiAmazonPlayerDataController.java +++ b/src/main/java/icu/samnyan/aqua/api/controller/sega/game/chuni/amazon/ApiAmazonPlayerDataController.java @@ -16,6 +16,9 @@ import icu.samnyan.aqua.sega.chunithm.model.userdata.*; import icu.samnyan.aqua.sega.chunithm.service.*; import icu.samnyan.aqua.sega.general.model.Card; import icu.samnyan.aqua.sega.general.service.CardService; +import icu.samnyan.aqua.sega.util.VersionInfo; +import icu.samnyan.aqua.sega.util.VersionUtil; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -147,7 +150,10 @@ public class ApiAmazonPlayerDataController { public List getRating(@RequestParam String aimeId) { Map musicMap = gameMusicService.getIdMap(); - List details = userMusicDetailService.getByUser(aimeId); + List details = userMusicDetailService.getByUserId(aimeId); + + var user = userDataService.getUserByExtId(aimeId).orElseThrow(); + var version = VersionUtil.parseVersion(user.getLastRomVersion()); List result = new ArrayList<>(); for (UserMusicDetail detail : details) { @@ -157,7 +163,7 @@ public class ApiAmazonPlayerDataController { if (level != null) { int levelBase = level.getLevel() * 100 + level.getLevelDecimal(); int score = detail.getScoreMax(); - int rating = calculateRating(levelBase, score); + int rating = calculateRating(levelBase, score, version); result.add(new RatingItem(music.getMusicId(), music.getName(), music.getArtistName(), level.getDiff(), score, levelBase, rating)); } } @@ -173,19 +179,46 @@ public class ApiAmazonPlayerDataController { @GetMapping("rating/recent") public List getRecentRating(@RequestParam String aimeId) { Map musicMap = gameMusicService.getIdMap(); - List logList = userPlaylogService.getRecent30Plays(aimeId); + Optional recentOptional = userGeneralDataService.getByUserIdAndKey(aimeId, "recent_rating_list"); - List result = new ArrayList<>(); - for (UserPlaylog log : logList) { - Music music = musicMap.get(log.getMusicId()); - if (music != null) { - Level level = music.getLevels().get(log.getLevel()); - if (level != null) { - int levelBase = level.getLevel() * 100 + level.getLevelDecimal(); - int score = log.getScore(); - int rating = calculateRating(levelBase, score); - result.add(new RatingItem(music.getMusicId(), music.getName(), music.getArtistName(), level.getDiff(), score, levelBase, rating)); + var user = userDataService.getUserByExtId(aimeId).orElseThrow(); + var version = VersionUtil.parseVersion(user.getLastRomVersion()); + + List result = new LinkedList<>(); + if (recentOptional.isPresent()) { + // Read from recent_rating_list + String val = recentOptional.get().getPropertyValue(); + if (StringUtils.isNotBlank(val) && val.contains(",")) { + String[] records = val.split(","); + for (String record : + records) { + String[] value = record.split(":"); + Music music = musicMap.get(Integer.parseInt(value[0])); + if (music != null) { + Level level = music.getLevels().get(Integer.parseInt(value[1])); + if (level != null) { + int levelBase = getLevelBase(level.getLevel(), level.getLevelDecimal()); + int score = Integer.parseInt(value[2]); + int rating = calculateRating(levelBase, score, version); + result.add(new RatingItem(music.getMusicId(), music.getName(), music.getArtistName(), level.getDiff(), score, levelBase, rating)); + } + } + } + } + } else { + // Use old method + List logList = userPlaylogService.getRecent30Plays(aimeId); + for (UserPlaylog log : logList) { + Music music = musicMap.get(log.getMusicId()); + if (music != null) { + Level level = music.getLevels().get(log.getLevel()); + if (level != null) { + int levelBase = getLevelBase(level.getLevel(), level.getLevelDecimal()); + int score = log.getScore(); + int rating = calculateRating(levelBase, score, version); + result.add(new RatingItem(music.getMusicId(), music.getName(), music.getArtistName(), level.getDiff(), score, levelBase, rating)); + } } } } @@ -387,14 +420,20 @@ public class ApiAmazonPlayerDataController { return ResponseEntity.ok(new MessageResponse("Import successfully, aimeId: " + card.getExtId())); } - private int calculateRating(int levelBase, int score) { + private int getLevelBase(int level, int levelDecimal) { + return level * 100 + levelDecimal; + } + + private int calculateRating(int levelBase, int score, VersionInfo version) { if (score >= 1007500) return levelBase + 200; if (score >= 1005000) return levelBase + 150 + (score - 1005000) * 10 / 500; if (score >= 1000000) return levelBase + 100 + (score - 1000000) * 5 / 500; if (score >= 975000) return levelBase + (score - 975000) * 2 / 500; - if (score >= 950000) return levelBase - 150 + (score - 950000) * 3 / 500; + if (score >= 950000 && version.getMinorVersion() < 35) return levelBase - 150 + (score - 950000) * 3 / 500; if (score >= 925000) return levelBase - 300 + (score - 925000) * 3 / 500; if (score >= 900000) return levelBase - 500 + (score - 900000) * 4 / 500; + if (score >= 800000) + return ((levelBase - 500) / 2 + (score - 800000) * ((levelBase - 500) / 2) / (100000)); return 0; } } diff --git a/src/main/java/icu/samnyan/aqua/sega/chunithm/handler/impl/GetUserMusicHandler.java b/src/main/java/icu/samnyan/aqua/sega/chunithm/handler/impl/GetUserMusicHandler.java index adda9f85..78017a49 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chunithm/handler/impl/GetUserMusicHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/chunithm/handler/impl/GetUserMusicHandler.java @@ -50,7 +50,7 @@ public class GetUserMusicHandler implements BaseHandler { } Page dbPage = userMusicDetailService - .getByUser(userId, OffsetPageRequest.of(currentIndex, maxCount, Sort.by("musicId"))); + .getByUserId(userId, OffsetPageRequest.of(currentIndex, maxCount, Sort.by("musicId"))); // Convert to result format diff --git a/src/main/java/icu/samnyan/aqua/sega/chunithm/service/UserMusicDetailService.java b/src/main/java/icu/samnyan/aqua/sega/chunithm/service/UserMusicDetailService.java index e2bb3006..3dbd4e71 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chunithm/service/UserMusicDetailService.java +++ b/src/main/java/icu/samnyan/aqua/sega/chunithm/service/UserMusicDetailService.java @@ -33,18 +33,14 @@ public class UserMusicDetailService { return userMusicDetailRepository.saveAll(userMusicDetail); } - public List getByUser(String userId) { - return userMusicDetailRepository.findByUser_Card_ExtId(Integer.parseInt(userId)); - } - - public Page getByUser(String userId, Pageable page) { - return userMusicDetailRepository.findByUser_Card_ExtId(Integer.parseInt(userId), page); - } - public List getByUserId(String userId) { return userMusicDetailRepository.findByUser_Card_ExtId(Integer.parseInt(userId)); } + public Page getByUserId(String userId, Pageable page) { + return userMusicDetailRepository.findByUser_Card_ExtId(Integer.parseInt(userId), page); + } + public List getByUserIdAndMusicId(String userId, int musicId) { return userMusicDetailRepository.findByUser_Card_ExtIdAndMusicId(Integer.parseInt(userId), musicId); } diff --git a/src/main/java/icu/samnyan/aqua/sega/util/VersionInfo.java b/src/main/java/icu/samnyan/aqua/sega/util/VersionInfo.java new file mode 100644 index 00000000..dd4afb97 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/util/VersionInfo.java @@ -0,0 +1,17 @@ +package icu.samnyan.aqua.sega.util; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author sam_nya (privateamusement@protonmail.com) + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class VersionInfo { + private Integer majorVersion; + private Integer minorVersion; + private Integer releaseVersion; +} diff --git a/src/main/java/icu/samnyan/aqua/sega/util/VersionUtil.java b/src/main/java/icu/samnyan/aqua/sega/util/VersionUtil.java index b26d341d..49a13069 100644 --- a/src/main/java/icu/samnyan/aqua/sega/util/VersionUtil.java +++ b/src/main/java/icu/samnyan/aqua/sega/util/VersionUtil.java @@ -2,6 +2,26 @@ package icu.samnyan.aqua.sega.util; public class VersionUtil { + public static VersionInfo parseVersion(String version) { + var vs = version.split("\\."); + try { + VersionInfo v = new VersionInfo(); + if (vs.length > 0) { + v.setMajorVersion(Integer.parseInt(vs[0])); + } + if (vs.length > 1) { + v.setMinorVersion(Integer.parseInt(vs[1])); + } + if (vs.length > 2) { + v.setReleaseVersion(Integer.parseInt(vs[2])); + } + return v; + } catch (Exception e) { + return new VersionInfo(0, 0, 0); + } + + } + public static String getTargetVersion(String savedVersion, String currentVersion) { var v1s = savedVersion.split("\\."); var v2s = currentVersion.split("\\.");