From 6a1a2dc2c4cb46bd6f59247e23c0bd1775b7d714 Mon Sep 17 00:00:00 2001 From: Liam Date: Fri, 2 Aug 2024 00:38:08 +0100 Subject: [PATCH] API: fix stats --- .../scoresaber/ScoreSaberScoreResponse.java | 5 +- .../java/cc/fascinated/model/user/User.java | 47 +++++++++++++++++-- .../cc/fascinated/model/user/UserDTO.java | 40 ++++++++++++++++ .../services/PlatformMetricsService.java | 10 ---- .../fascinated/services/PlatformService.java | 2 + .../cc/fascinated/services/ScoreService.java | 3 +- 6 files changed, 89 insertions(+), 18 deletions(-) create mode 100644 API/src/main/java/cc/fascinated/model/user/UserDTO.java delete mode 100644 API/src/main/java/cc/fascinated/services/PlatformMetricsService.java 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 9ce34f2..200af92 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,6 +2,7 @@ package cc.fascinated.model.score.impl.scoresaber; import cc.fascinated.model.leaderboard.Leaderboard; import cc.fascinated.model.user.User; +import cc.fascinated.model.user.UserDTO; import cc.fascinated.platform.Platform; import lombok.Getter; @@ -15,7 +16,7 @@ public class ScoreSaberScoreResponse extends ScoreSaberScore { /** * The user that set the score. */ - private final User user; + private final UserDTO user; /** * The leaderboard the score was set on. @@ -24,7 +25,7 @@ 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, Date timestamp, - double weight, double multiplier, int maxCombo, User user, Leaderboard leaderboard) { + double weight, double multiplier, int maxCombo, UserDTO user, Leaderboard leaderboard) { super(id, playerId, platform, platformScoreId, leaderboardId, rank, accuracy, pp, score, modifiers, misses, badCuts, timestamp, weight, multiplier, maxCombo); this.user = user; diff --git a/API/src/main/java/cc/fascinated/model/user/User.java b/API/src/main/java/cc/fascinated/model/user/User.java index 84970ea..aaa3f9b 100644 --- a/API/src/main/java/cc/fascinated/model/user/User.java +++ b/API/src/main/java/cc/fascinated/model/user/User.java @@ -1,5 +1,6 @@ package cc.fascinated.model.user; +import cc.fascinated.common.DateUtils; import cc.fascinated.model.user.statistic.Statistic; import cc.fascinated.platform.Platform; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -9,6 +10,7 @@ import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.index.Indexed; import org.springframework.data.mongodb.core.mapping.Document; +import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -23,6 +25,8 @@ import java.util.UUID; @ToString @Document("user") public class User { + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy"); + /** * The ID of the user. */ @@ -64,8 +68,21 @@ public class User { /** * The user's statistic history. */ - @JsonIgnore - public Map> statistics; + public Map> statistics; + + /** + * The user's statistic history. + */ + public Map> getStatistics() { + if (this.statistics == null) { + this.statistics = new HashMap<>(); + } + Map> toReturn = new HashMap<>(); + for (Platform.Platforms platform : statistics.keySet()) { + toReturn.put(platform, getStatistic(platform)); + } + return toReturn; + } /** * Gets the statistics for a platform. @@ -73,11 +90,17 @@ public class User { * @param platform the platform to get the statistics for * @return the statistics */ - public Map getStatistics(@NonNull Platform.Platforms platform) { + @SneakyThrows + public Map getStatistic(@NonNull Platform.Platforms platform) { if (this.statistics == null) { this.statistics = new HashMap<>(); } - return this.statistics.computeIfAbsent(platform, k -> new HashMap<>()); + Map statisticMap = this.statistics.computeIfAbsent(platform, k -> new HashMap<>()); + Map statistics = new HashMap<>(); + for (Map.Entry entry : statisticMap.entrySet()) { + statistics.put(DATE_FORMAT.parse(entry.getKey()), entry.getValue()); + } + return statistics; } /** @@ -88,6 +111,20 @@ public class User { * @param statistic the statistic to add */ public void addStatistic(@NonNull Platform.Platforms platform, @NonNull Date date, @NonNull Statistic statistic) { - this.getStatistics(platform).put(date, statistic); + if (this.statistics == null) { + this.statistics = new HashMap<>(); + } + Map statisticMap = this.statistics.computeIfAbsent(platform, k -> new HashMap<>()); + statisticMap.put(String.valueOf(date.toString()), statistic); + } + + /** + * Gets the user as a DTO. + * + * @return the user as a DTO + */ + @JsonIgnore + public UserDTO getAsDTO() { + return new UserDTO(this.id, this.username, this.steamId, this.scoresaberAccount); } } diff --git a/API/src/main/java/cc/fascinated/model/user/UserDTO.java b/API/src/main/java/cc/fascinated/model/user/UserDTO.java new file mode 100644 index 0000000..ce326e6 --- /dev/null +++ b/API/src/main/java/cc/fascinated/model/user/UserDTO.java @@ -0,0 +1,40 @@ +package cc.fascinated.model.user; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.Indexed; + +import java.util.UUID; + +/** + * @author Fascinated (fascinated7) + */ +@AllArgsConstructor +@Getter +public class UserDTO { + /** + * The ID of the user. + */ + private final UUID id; + + /** + * The username of the user. + *

+ * Usually their Steam name. + *

+ */ + private String username; + + /** + * The ID of the users steam profile. + */ + private String steamId; + + /** + * The user's ScoreSaber account. + */ + public ScoreSaberAccount scoresaberAccount; +} diff --git a/API/src/main/java/cc/fascinated/services/PlatformMetricsService.java b/API/src/main/java/cc/fascinated/services/PlatformMetricsService.java deleted file mode 100644 index 8d1b3b1..0000000 --- a/API/src/main/java/cc/fascinated/services/PlatformMetricsService.java +++ /dev/null @@ -1,10 +0,0 @@ -package cc.fascinated.services; - -import org.springframework.stereotype.Service; - -/** - * @author Fascinated (fascinated7) - */ -@Service -public class PlatformMetricsService { -} diff --git a/API/src/main/java/cc/fascinated/services/PlatformService.java b/API/src/main/java/cc/fascinated/services/PlatformService.java index 681424d..f5f761b 100644 --- a/API/src/main/java/cc/fascinated/services/PlatformService.java +++ b/API/src/main/java/cc/fascinated/services/PlatformService.java @@ -38,6 +38,8 @@ public class PlatformService { log.info("Registering platforms..."); registerPlatform(context.getBean(ScoreSaberPlatform.class)); log.info("Loaded %s platforms.".formatted(this.platforms.size())); + + this.updatePlayerMetrics(); } /** diff --git a/API/src/main/java/cc/fascinated/services/ScoreService.java b/API/src/main/java/cc/fascinated/services/ScoreService.java index 17eda03..1f5f25a 100644 --- a/API/src/main/java/cc/fascinated/services/ScoreService.java +++ b/API/src/main/java/cc/fascinated/services/ScoreService.java @@ -12,6 +12,7 @@ import cc.fascinated.model.token.ScoreSaberLeaderboardToken; import cc.fascinated.model.token.ScoreSaberPlayerScoreToken; import cc.fascinated.model.token.ScoreSaberScoreToken; import cc.fascinated.model.user.User; +import cc.fascinated.model.user.UserDTO; import cc.fascinated.platform.Platform; import cc.fascinated.repository.ScoreRepository; import lombok.NonNull; @@ -77,7 +78,7 @@ public class ScoreService { List scores = new ArrayList<>(); for (Score score : trackedScores) { ScoreSaberScore scoreSaberScore = (ScoreSaberScore) score; - User user = scoresOnly ? null : userService.getUser(score.getPlayerId()); + UserDTO user = scoresOnly ? null : userService.getUser(score.getPlayerId()).getAsDTO(); Leaderboard leaderboard = scoresOnly ? null : Leaderboard.getFromScoreSaberToken(scoreSaberService.getLeaderboard(score.getLeaderboardId())); scores.add(new ScoreSaberScoreResponse(