···20 AvgMoves float64
21 Stage string
22 LastPlayed time.Time
023}
2425type Submission struct {
···175}
176177func GetLeaderboard(limit int) ([]LeaderboardEntry, error) {
0178 query := `
179 SELECT
180 s.username,
···183 SUM(CASE WHEN m.player1_id = s.id THEN m.player1_wins WHEN m.player2_id = s.id THEN m.player2_wins ELSE 0 END) as total_wins,
184 SUM(CASE WHEN m.player1_id = s.id THEN m.player2_wins WHEN m.player2_id = s.id THEN m.player1_wins ELSE 0 END) as total_losses,
185 AVG(CASE WHEN m.player1_id = s.id THEN m.player1_moves ELSE m.player2_moves END) as avg_moves,
186- MAX(m.timestamp) as last_played
0187 FROM submissions s
188 LEFT JOIN matches m ON (m.player1_id = s.id OR m.player2_id = s.id) AND m.is_valid = 1
189 WHERE s.is_active = 1
190 GROUP BY s.username, s.glicko_rating, s.glicko_rd
191 HAVING COUNT(m.id) > 0
192- ORDER BY rating DESC, total_wins DESC
000000000000000000193 LIMIT ?
194 `
195···204 var e LeaderboardEntry
205 var lastPlayed string
206 var rating, rd float64
207- err := rows.Scan(&e.Username, &rating, &rd, &e.Wins, &e.Losses, &e.AvgMoves, &lastPlayed)
0208 if err != nil {
209 return nil, err
210 }
211212 e.Rating = int(rating)
213 e.RD = int(rd)
0214215 totalGames := e.Wins + e.Losses
216 if totalGames > 0 {
···20 AvgMoves float64
21 Stage string
22 LastPlayed time.Time
23+ IsPending bool
24}
2526type Submission struct {
···176}
177178func GetLeaderboard(limit int) ([]LeaderboardEntry, error) {
179+ // Get submissions with matches
180 query := `
181 SELECT
182 s.username,
···185 SUM(CASE WHEN m.player1_id = s.id THEN m.player1_wins WHEN m.player2_id = s.id THEN m.player2_wins ELSE 0 END) as total_wins,
186 SUM(CASE WHEN m.player1_id = s.id THEN m.player2_wins WHEN m.player2_id = s.id THEN m.player1_wins ELSE 0 END) as total_losses,
187 AVG(CASE WHEN m.player1_id = s.id THEN m.player1_moves ELSE m.player2_moves END) as avg_moves,
188+ MAX(m.timestamp) as last_played,
189+ 0 as is_pending
190 FROM submissions s
191 LEFT JOIN matches m ON (m.player1_id = s.id OR m.player2_id = s.id) AND m.is_valid = 1
192 WHERE s.is_active = 1
193 GROUP BY s.username, s.glicko_rating, s.glicko_rd
194 HAVING COUNT(m.id) > 0
195+196+ UNION ALL
197+198+ SELECT
199+ s.username,
200+ 1500.0 as rating,
201+ 350.0 as rd,
202+ 0 as total_wins,
203+ 0 as total_losses,
204+ 0.0 as avg_moves,
205+ s.upload_time as last_played,
206+ 1 as is_pending
207+ FROM submissions s
208+ LEFT JOIN matches m ON (m.player1_id = s.id OR m.player2_id = s.id) AND m.is_valid = 1
209+ WHERE s.is_active = 1 AND s.status IN ('pending', 'testing')
210+ GROUP BY s.username, s.upload_time
211+ HAVING COUNT(m.id) = 0
212+213+ ORDER BY is_pending ASC, rating DESC, total_wins DESC
214 LIMIT ?
215 `
216···225 var e LeaderboardEntry
226 var lastPlayed string
227 var rating, rd float64
228+ var isPending int
229+ err := rows.Scan(&e.Username, &rating, &rd, &e.Wins, &e.Losses, &e.AvgMoves, &lastPlayed, &isPending)
230 if err != nil {
231 return nil, err
232 }
233234 e.Rating = int(rating)
235 e.RD = int(rd)
236+ e.IsPending = isPending == 1
237238 totalGames := e.Wins + e.Losses
239 if totalGames > 0 {