···2020 AvgMoves float64
2121 Stage string
2222 LastPlayed time.Time
2323+ IsPending bool
2324}
24252526type Submission struct {
···175176}
176177177178func GetLeaderboard(limit int) ([]LeaderboardEntry, error) {
179179+ // Get submissions with matches
178180 query := `
179181 SELECT
180182 s.username,
···183185 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,
184186 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,
185187 AVG(CASE WHEN m.player1_id = s.id THEN m.player1_moves ELSE m.player2_moves END) as avg_moves,
186186- MAX(m.timestamp) as last_played
188188+ MAX(m.timestamp) as last_played,
189189+ 0 as is_pending
187190 FROM submissions s
188191 LEFT JOIN matches m ON (m.player1_id = s.id OR m.player2_id = s.id) AND m.is_valid = 1
189192 WHERE s.is_active = 1
190193 GROUP BY s.username, s.glicko_rating, s.glicko_rd
191194 HAVING COUNT(m.id) > 0
192192- ORDER BY rating DESC, total_wins DESC
195195+196196+ UNION ALL
197197+198198+ SELECT
199199+ s.username,
200200+ 1500.0 as rating,
201201+ 350.0 as rd,
202202+ 0 as total_wins,
203203+ 0 as total_losses,
204204+ 0.0 as avg_moves,
205205+ s.upload_time as last_played,
206206+ 1 as is_pending
207207+ FROM submissions s
208208+ LEFT JOIN matches m ON (m.player1_id = s.id OR m.player2_id = s.id) AND m.is_valid = 1
209209+ WHERE s.is_active = 1 AND s.status IN ('pending', 'testing')
210210+ GROUP BY s.username, s.upload_time
211211+ HAVING COUNT(m.id) = 0
212212+213213+ ORDER BY is_pending ASC, rating DESC, total_wins DESC
193214 LIMIT ?
194215 `
195216···204225 var e LeaderboardEntry
205226 var lastPlayed string
206227 var rating, rd float64
207207- err := rows.Scan(&e.Username, &rating, &rd, &e.Wins, &e.Losses, &e.AvgMoves, &lastPlayed)
228228+ var isPending int
229229+ err := rows.Scan(&e.Username, &rating, &rd, &e.Wins, &e.Losses, &e.AvgMoves, &lastPlayed, &isPending)
208230 if err != nil {
209231 return nil, err
210232 }
211233212234 e.Rating = int(rating)
213235 e.RD = int(rd)
236236+ e.IsPending = isPending == 1
214237215238 totalGames := e.Wins + e.Losses
216239 if totalGames > 0 {