···2121 Stage string
2222 LastPlayed time.Time
2323 IsPending bool
2424+ IsBroken bool
2425}
25262627type Submission struct {
···199200 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,
200201 AVG(CASE WHEN m.player1_id = s.id THEN m.player1_moves ELSE m.player2_moves END) as avg_moves,
201202 MAX(m.timestamp) as last_played,
202202- 0 as is_pending
203203+ 0 as is_pending,
204204+ 0 as is_broken
203205 FROM submissions s
204206 LEFT JOIN matches m ON (m.player1_id = s.id OR m.player2_id = s.id) AND m.is_valid = 1
205205- WHERE s.is_active = 1
207207+ WHERE s.is_active = 1 AND s.status NOT IN ('compilation_failed')
206208 GROUP BY s.username, s.glicko_rating, s.glicko_rd
207209 HAVING COUNT(m.id) > 0
208210···216218 0 as total_losses,
217219 0.0 as avg_moves,
218220 s.upload_time as last_played,
219219- 1 as is_pending
221221+ 1 as is_pending,
222222+ 0 as is_broken
220223 FROM submissions s
221224 LEFT JOIN matches m ON (m.player1_id = s.id OR m.player2_id = s.id) AND m.is_valid = 1
222225 WHERE s.is_active = 1 AND s.status IN ('pending', 'testing', 'completed')
223226 GROUP BY s.username, s.upload_time
224227 HAVING COUNT(m.id) = 0
225228226226- ORDER BY is_pending ASC, rating DESC, total_wins DESC
229229+ UNION ALL
230230+231231+ SELECT
232232+ s.username,
233233+ 0 as rating,
234234+ 0 as rd,
235235+ 0 as total_wins,
236236+ 0 as total_losses,
237237+ 0.0 as avg_moves,
238238+ s.upload_time as last_played,
239239+ 0 as is_pending,
240240+ 1 as is_broken
241241+ FROM submissions s
242242+ WHERE s.is_active = 1 AND s.status = 'compilation_failed'
243243+244244+ ORDER BY is_broken ASC, is_pending ASC, rating DESC, total_wins DESC
227245 LIMIT ?
228246 `
229247···238256 var e LeaderboardEntry
239257 var lastPlayed string
240258 var rating, rd float64
241241- var isPending int
242242- err := rows.Scan(&e.Username, &rating, &rd, &e.Wins, &e.Losses, &e.AvgMoves, &lastPlayed, &isPending)
259259+ var isPending, isBroken int
260260+ err := rows.Scan(&e.Username, &rating, &rd, &e.Wins, &e.Losses, &e.AvgMoves, &lastPlayed, &isPending, &isBroken)
243261 if err != nil {
244262 return nil, err
245263 }
···247265 e.Rating = int(rating)
248266 e.RD = int(rd)
249267 e.IsPending = isPending == 1
268268+ e.IsBroken = isBroken == 1
250269251270 totalGames := e.Wins + e.Losses
252271 if totalGames > 0 {