@@ -58,6 +58,7 @@ public GameScore SubmitScore(ISerializedScore score, GameUser user, GameLevel le
5858 this . GameScores . Add ( newScore ) ;
5959 } ) ;
6060
61+ this . RecalculateScoreStatistics ( level . LevelId , score . ScoreType ) ;
6162 this . CreateLevelScoreEvent ( user , newScore ) ;
6263
6364 // Notify the last #1 users that they've been overtaken
@@ -101,12 +102,12 @@ public DatabaseScoreList GetTopScoresForLevel(GameLevel level, int count, int sk
101102 scores = scores . Where ( s => s . ScoreType == scoreType ) ;
102103
103104 if ( ! showDuplicates )
104- scores = scores . DistinctBy ( s => s . PublisherId ) ;
105+ scores = scores . Where ( s => s . Rank != 0 ) ;
105106
106107 if ( minAge != null )
107108 scores = scores . Where ( s => s . ScoreSubmitted >= minAge ) ;
108109
109- return new ( scores . ToArray ( ) . Select ( ( s , i ) => new ScoreWithRank ( s , i + 1 ) ) , skip , count , user ) ;
110+ return new ( scores . ToArray ( ) . Select ( s => new ScoreWithRank ( s , s . Rank ) ) , skip , count , user ) ;
110111 }
111112
112113 public DatabaseScoreList GetRankedScoresAroundScore ( GameScore score , int count , GameUser ? user = null )
@@ -118,13 +119,12 @@ public DatabaseScoreList GetRankedScoresAroundScore(GameScore score, int count,
118119 List < GameScore > scores = this . GameScoresIncluded
119120 . Where ( s => s . ScoreType == score . ScoreType && s . LevelId == score . LevelId )
120121 . OrderByDescending ( s => s . Score )
121- . ToArray ( )
122- . DistinctBy ( s => s . PublisherId )
122+ . Where ( s => s . Rank != 0 )
123123 . ToList ( ) ;
124124
125125 return new
126126 (
127- scores . Select ( ( s , i ) => new ScoreWithRank ( s , i + 1 ) ) ,
127+ scores . Select ( s => new ScoreWithRank ( s , s . Rank ) ) ,
128128 Math . Min ( scores . Count , scores . IndexOf ( score ) - count / 2 ) , // center user's score around other scores
129129 count , user
130130 ) ;
@@ -140,8 +140,7 @@ public DatabaseScoreList GetLevelTopScoresByFriends(GameUser user, GameLevel lev
140140 IEnumerable < GameScore > scores = this . GameScoresIncluded
141141 . Where ( s => s . LevelId == level . LevelId )
142142 . OrderByDescending ( s => s . Score )
143- . ToArray ( )
144- . DistinctBy ( s => s . PublisherId )
143+ . Where ( s => s . Rank != 0 )
145144 //TODO: THIS CALL IS EXTREMELY INEFFECIENT!!! once we are in postgres land, figure out a way to do this effeciently
146145 . Where ( s => s . PlayerIds . Any ( p => mutuals . Contains ( p ) ) ) ;
147146
@@ -151,7 +150,22 @@ public DatabaseScoreList GetLevelTopScoresByFriends(GameUser user, GameLevel lev
151150 if ( minAge != null )
152151 scores = scores . Where ( s => s . ScoreSubmitted >= minAge ) ;
153152
154- return new ( scores . Select ( ( s , i ) => new ScoreWithRank ( s , i + 1 ) ) , skip , count , user ) ;
153+ return new ( scores . ToArray ( ) . Select ( s => new ScoreWithRank ( s , s . Rank ) ) , skip , count , user ) ;
154+ }
155+
156+ /// <param name="scoreType">0 = don't filter by type</param>
157+ /// <param name="rank">0 = show all high-scores regardless of rank</param>
158+ public DatabaseList < ScoreWithRank > GetScoresByUser ( GameUser user , int skip , int count , byte scoreType , int rank )
159+ {
160+ IQueryable < GameScore > scores = this . GameScoresIncluded
161+ . Where ( s => s . PublisherId == user . UserId )
162+ . Where ( s => s . Rank != 0 )
163+ . OrderBy ( s => s . Rank ) ;
164+
165+ if ( scoreType != 0 ) scores = scores . Where ( s => s . ScoreType == scoreType ) ;
166+ if ( rank != 0 ) scores = scores . Where ( s => s . Rank == rank ) ;
167+
168+ return new ( scores . ToArray ( ) . Select ( s => new ScoreWithRank ( s , s . Rank ) ) , skip , count ) ;
155169 }
156170
157171 [ Pure ]
0 commit comments