diff --git a/API/src/main/java/cc/fascinated/controller/ScoresController.java b/API/src/main/java/cc/fascinated/controller/ScoresController.java index c7785cc..cf3697a 100644 --- a/API/src/main/java/cc/fascinated/controller/ScoresController.java +++ b/API/src/main/java/cc/fascinated/controller/ScoresController.java @@ -74,45 +74,10 @@ public class ScoresController { @ResponseBody @GetMapping(value = "/history/{platform}/{playerId}/{leaderboardId}") public ResponseEntity getScoreHistory(@PathVariable String platform, @PathVariable String playerId, @PathVariable String leaderboardId) { - return ResponseEntity.ok(scoreService.getPreviousScore( + return ResponseEntity.ok(scoreService.getScoreHistory( Platform.Platforms.getPlatform(platform), userService.getUser(playerId), leaderboardId - ).getRight()); - } - - /** - * A GET mapping to retrieve the score - * history for a leaderboard - * - * @param platform the platform to get the history from - * @return the score history - * @throws BadRequestException if there were no history found - */ - @ResponseBody - @GetMapping(value = "/history/{platform}/{playerId}") - public ResponseEntity getScoreHistory(@PathVariable String platform, @PathVariable String playerId) { - return ResponseEntity.ok(scoreService.getImprovedScores( - Platform.Platforms.getPlatform(platform), - userService.getUser(playerId), - 30 - )); - } - - /** - * A GET mapping to retrieve the score - * history for a leaderboard - * - * @param platform the platform to get the history from - * @return the score history - * @throws BadRequestException if there were no history found - */ - @ResponseBody - @GetMapping(value = "/improved/best/{platform}") - public ResponseEntity getBestImprovedScores(@PathVariable String platform) { - return ResponseEntity.ok(scoreService.getBestImprovedScores( - Platform.Platforms.getPlatform(platform), - 30 )); } } diff --git a/API/src/main/java/cc/fascinated/model/score/Score.java b/API/src/main/java/cc/fascinated/model/score/Score.java index fb56cd3..ca83c42 100644 --- a/API/src/main/java/cc/fascinated/model/score/Score.java +++ b/API/src/main/java/cc/fascinated/model/score/Score.java @@ -7,12 +7,10 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import org.springframework.data.annotation.Id; -import org.springframework.data.annotation.Reference; import org.springframework.data.mongodb.core.index.Indexed; import org.springframework.data.mongodb.core.mapping.Document; import java.util.Date; -import java.util.List; /** * @author Fascinated (fascinated7) @@ -110,12 +108,6 @@ public class Score { */ private final DeviceInformation deviceInformation; - /** - * The score history for map the score was set on. - */ - @Reference - private List previousScores; - /** * The timestamp of when the score was set. */ @@ -157,15 +149,6 @@ public class Score { return modifiers == null ? new String[0] : modifiers; } - /** - * Gets the previous scores of the score. - * - * @return the previous scores - */ - public List getPreviousScores() { - return previousScores == null ? List.of() : previousScores; - } - /** * Gets if the score is ranked. * diff --git a/API/src/main/java/cc/fascinated/model/score/impl/scoresaber/ScoreSaberScore.java b/API/src/main/java/cc/fascinated/model/score/impl/scoresaber/ScoreSaberScore.java index 2f679f4..8d411c6 100644 --- a/API/src/main/java/cc/fascinated/model/score/impl/scoresaber/ScoreSaberScore.java +++ b/API/src/main/java/cc/fascinated/model/score/impl/scoresaber/ScoreSaberScore.java @@ -6,7 +6,6 @@ import cc.fascinated.platform.Platform; import lombok.Getter; import java.util.Date; -import java.util.List; /** * @author Fascinated (fascinated7) @@ -30,9 +29,9 @@ public class ScoreSaberScore extends Score { public ScoreSaberScore(long id, String playerId, Platform.Platforms platform, String platformScoreId, String leaderboardId, int rank, double accuracy, Double pp, int score, String[] modifiers, Integer misses, Integer badCuts, DeviceInformation deviceInformation, - List previousScores, Date timestamp, Double weight, double multiplier, int maxCombo) { + Date timestamp, Double weight, double multiplier, int maxCombo) { super(id, playerId, platform, platformScoreId, leaderboardId, rank, accuracy, pp, score, modifiers, misses, - badCuts, deviceInformation, previousScores, timestamp); + badCuts, deviceInformation, timestamp); this.weight = weight; this.multiplier = multiplier; this.maxCombo = maxCombo; diff --git a/API/src/main/java/cc/fascinated/model/score/impl/scoresaber/ScoreSaberScoreResponse.java b/API/src/main/java/cc/fascinated/model/score/impl/scoresaber/ScoreSaberScoreResponse.java index e852928..f6c93e4 100644 --- a/API/src/main/java/cc/fascinated/model/score/impl/scoresaber/ScoreSaberScoreResponse.java +++ b/API/src/main/java/cc/fascinated/model/score/impl/scoresaber/ScoreSaberScoreResponse.java @@ -2,13 +2,11 @@ package cc.fascinated.model.score.impl.scoresaber; import cc.fascinated.model.leaderboard.Leaderboard; import cc.fascinated.model.score.DeviceInformation; -import cc.fascinated.model.score.Score; import cc.fascinated.model.user.UserDTO; import cc.fascinated.platform.Platform; import lombok.Getter; import java.util.Date; -import java.util.List; /** * @author Fascinated (fascinated7) @@ -27,10 +25,9 @@ public class ScoreSaberScoreResponse extends ScoreSaberScore { public ScoreSaberScoreResponse(long id, String playerId, Platform.Platforms platform, String platformScoreId, String leaderboardId, int rank, double accuracy, double pp, int score, String[] modifiers, int misses, int badCuts, DeviceInformation deviceInformation, - List previousScores, Date timestamp, double weight, double multiplier, int maxCombo, UserDTO user, - Leaderboard leaderboard) { + Date timestamp, double weight, double multiplier, int maxCombo, UserDTO user, Leaderboard leaderboard) { super(id, playerId, platform, platformScoreId, leaderboardId, rank, accuracy, pp, score, modifiers, misses, badCuts, - deviceInformation, previousScores, timestamp, weight, multiplier, maxCombo); + deviceInformation, timestamp, weight, multiplier, maxCombo); this.user = user; this.leaderboard = leaderboard; } diff --git a/API/src/main/java/cc/fascinated/model/user/history/HistoryPoint.java b/API/src/main/java/cc/fascinated/model/user/history/HistoryPoint.java index fbd75ef..b5601a4 100644 --- a/API/src/main/java/cc/fascinated/model/user/history/HistoryPoint.java +++ b/API/src/main/java/cc/fascinated/model/user/history/HistoryPoint.java @@ -65,7 +65,7 @@ public class HistoryPoint { * eg: if the user doesn't have their data tracked by * {@link Platform#trackPlayerMetrics()} then some * data will be inaccurate or missing. - * This will only affect rank, countryRank, and pp + * This will only affect {@link #rank}, {@link #countryRank}, and {@link #pp}. *

* * @return true if the data is possibly inaccurate, false otherwise diff --git a/API/src/main/java/cc/fascinated/repository/ScoreRepository.java b/API/src/main/java/cc/fascinated/repository/ScoreRepository.java index 6190f8a..1fa6d24 100644 --- a/API/src/main/java/cc/fascinated/repository/ScoreRepository.java +++ b/API/src/main/java/cc/fascinated/repository/ScoreRepository.java @@ -13,7 +13,7 @@ import java.util.List; /** * @author Fascinated (fascinated7) */ -public interface ScoreRepository extends MongoRepository { +public interface ScoreRepository extends MongoRepository { /** * Gets the top ranked scores from the platform. * @@ -78,11 +78,10 @@ public interface ScoreRepository extends MongoRepository { * @return the score */ @Aggregation(pipeline = { - "{ $match: { platform: ?0, leaderboardId: ?1, playerId: ?2 } }", - "{ $sort: { pp: -1 } }", - "{ $limit: 1 }" + "{ $match: { platform: ?0, playerId: ?1, leaderboardId: ?2 } }", + "{ $sort: { timestamp: -1 } }", }) - Score findScore(@NonNull Platform.Platforms platform, @NonNull String playerId, @NonNull String leaderboardId); + List findScores(@NonNull Platform.Platforms platform, @NonNull String playerId, @NonNull String leaderboardId); /** * Updates a scores pp value. diff --git a/API/src/main/java/cc/fascinated/services/ScoreService.java b/API/src/main/java/cc/fascinated/services/ScoreService.java index bd21188..417e624 100644 --- a/API/src/main/java/cc/fascinated/services/ScoreService.java +++ b/API/src/main/java/cc/fascinated/services/ScoreService.java @@ -3,7 +3,6 @@ package cc.fascinated.services; import cc.fascinated.common.DateUtils; import cc.fascinated.common.EnumUtils; import cc.fascinated.common.MathUtils; -import cc.fascinated.common.Tuple; import cc.fascinated.model.leaderboard.Leaderboard; import cc.fascinated.model.score.DeviceInformation; import cc.fascinated.model.score.Score; @@ -101,7 +100,6 @@ public class ScoreService { score.getMisses(), score.getBadCuts(), score.getDeviceInformation(), - score.getPreviousScores(), score.getTimestamp(), scoreSaberScore.getWeight(), scoreSaberScore.getMultiplier(), @@ -194,18 +192,6 @@ public class ScoreService { ScoreSaberScoreToken score = token.getScore(); User user = userService.getUser(score.getLeaderboardPlayerInfo().getId()); - Tuple> previousScoreTuple = this.getPreviousScore(Platform.Platforms.SCORESABER, user, leaderboard.getId()); - List previousScores = previousScoreTuple.getRight(); - Score previousScore = previousScoreTuple.getLeft(); - boolean previousScoreExists = previousScore != null && (previousScores != null && !previousScores.isEmpty()); - if (previousScoreExists) { // There is a previous score - // Delete the previous score - scoreRepository.delete(previousScore); - } else { - // There are no previous scores, so set it to null to save data - previousScores = null; - } - double accuracy = leaderboard.getMaxScore() != 0 ? ((double) score.getBaseScore() / leaderboard.getMaxScore()) * 100 : 0; if (accuracy == 0) { log.warn("[Scoresaber] Leaderboard '{}' has a max score of 0, unable to calculate accuracy :(", leaderboard.getId()); @@ -231,71 +217,29 @@ public class ScoreService { score.getDeviceControllerLeft() == null ? DeviceController.UNKNOWN : DeviceController.getByName(score.getDeviceControllerLeft()), score.getDeviceControllerRight() == null ? DeviceController.UNKNOWN : DeviceController.getByName(score.getDeviceControllerRight()) ), - previousScores, DateUtils.getDateFromIsoString(score.getTimeSet()), score.getWeight() == 0 ? null : score.getWeight(), // no weight, set to null to save data score.getMultiplier(), score.getMaxCombo() ); this.saveScore(user, scoreSaberScore); - this.logScore(Platform.Platforms.SCORESABER, Leaderboard.getFromScoreSaberToken(leaderboard), scoreSaberScore, user, - previousScoreExists && previousScore.getScore() < scoreSaberScore.getScore()); - if (scoreSaberScore.getDeviceInformation().containsUnknownDevices()) { - log.warn(" - Score contains unknown device: hmd: {}, controller left: {}, controller right: {}", - score.getDeviceHmd(), - score.getDeviceControllerLeft(), - score.getDeviceControllerRight() - ); - } + this.logScore(Platform.Platforms.SCORESABER, Leaderboard.getFromScoreSaberToken(leaderboard), scoreSaberScore, user); } /** - * Gets the previous score of a user. + * Gets the previous scores for a leaderboard. * * @param platform The platform to get the score from. * @param user The user to get the score from. * @param leaderboardId The leaderboard id to get the score from. * @return The previous score. */ - public Tuple> getPreviousScore(@NonNull Platform.Platforms platform, @NonNull User user, @NonNull String leaderboardId) { - Score score = this.scoreRepository.findScore(platform, user.getSteamId(), leaderboardId); - List previousScores = new ArrayList<>(); - if (score == null) { // There is a previous score - return new Tuple<>(null, previousScores); - } - if (score.getPreviousScores() != null) { - previousScores.addAll(score.getPreviousScores()); // Add the previous scores - } - score.setPreviousScores(null); // Clear the previous scores - previousScores.add(score); // Add the previous score + public @NonNull List getScoreHistory(@NonNull Platform.Platforms platform, @NonNull User user, @NonNull String leaderboardId) { + List foundScores = new ArrayList<>(this.scoreRepository.findScores(platform, user.getSteamId(), leaderboardId)); // Sort previous scores by timestamp (newest -> oldest) - previousScores.sort(Comparator.comparing(Score::getTimestamp).reversed()); - - return new Tuple<>(score, previousScores); - } - - /** - * Gets the improved scores of a user. - * - * @param platform The platform to get the scores from. - * @param user The user to get the scores from. - * @param days The amount of days in the past to get the scores from. - * @return The improved scores. - */ - public List getImprovedScores(@NonNull Platform.Platforms platform, @NonNull User user, int days) { - return scoreRepository.getUserImprovedScores(platform, user.getSteamId(), DateUtils.getDaysAgo(days)); - } - - /** - * Gets the best improved scores from the platform. - * - * @param platform The platform to get the scores from. - * @param days The amount of days in the past to get the scores from. - * @return The scores. - */ - public List getBestImprovedScores(@NonNull Platform.Platforms platform, int days) { - return scoreRepository.getBestImprovedScores(platform, DateUtils.getDaysAgo(days)); + foundScores.sort(Comparator.comparing(Score::getTimestamp).reversed()); + return foundScores; } /** @@ -326,13 +270,12 @@ public class ScoreService { * @param user The user who set the score. */ private void logScore(@NonNull Platform.Platforms platform, @NonNull Leaderboard leaderboard, @NonNull Score score, - @NonNull User user, boolean improvedScore) { + @NonNull User user) { String platformName = EnumUtils.getEnumName(platform); boolean isRanked = score.getPp() != 0; - log.info("[{}] {}Tracked{} Score! id: {}, acc: {}%, {} score id: {},{} leaderboard: {}, difficulty: {}, player: {} ({})", + log.info("[{}] Tracked{} Score! id: {}, acc: {}%, {} score id: {},{} leaderboard: {}, difficulty: {}, player: {} ({})", platformName, - improvedScore ? "Improved " : "", isRanked ? " Ranked" : "", score.getId(), MathUtils.format(score.getAccuracy(), 2),