forked from lichess-org/lila
-
Notifications
You must be signed in to change notification settings - Fork 0
/
routes
853 lines (772 loc) · 54.1 KB
/
routes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
# Run `./lila playRoutes` after modifying this file
# Lobby
GET / controllers.Lobby.home
GET /lobby/seeks controllers.Lobby.seeks
# 2-letter routes, then lang route
GET /tv controllers.Tv.index
GET /$lang<\w\w> controllers.Lobby.homeLang(lang)
# Highest hit count
GET /account/info controllers.Account.info
# Timeline
GET /timeline controllers.Timeline.home
POST /timeline/unsub/:channel controllers.Timeline.unsub(channel)
# Search
GET /games/search controllers.Search.index(page: Int ?= 1)
# Game export
POST /games/export/_ids controllers.Game.exportByIds
POST /api/games/export/_ids controllers.Game.exportByIds
GET /games/export/:username controllers.Game.exportByUser(username)
# Bookmark
POST /bookmark/$gameId<\w{8}> controllers.Game.bookmark(gameId)
# TV
GET /$lang<\w\w>/tv controllers.Tv.indexLang(lang)
GET /tv/frame controllers.Tv.frame
GET /tv/feed controllers.Tv.feed
GET /tv/channels controllers.Main.movedPermanently(to = "/api/tv/channels")
GET /tv/:chanKey controllers.Tv.onChannel(chanKey)
GET /tv/$gameId<\w{8}>/$color<white|black>/sides controllers.Tv.sides(gameId, color)
GET /games controllers.Tv.games
GET /games/:chanKey controllers.Tv.gamesChannel(chanKey)
GET /games/:chanKey/replacement/$gameId<\w{8}> controllers.Tv.gameChannelReplacement(chanKey, gameId, exclude: List[String])
GET /api/tv/channels controllers.Tv.channels
GET /api/tv/feed controllers.Tv.feed
GET /api/tv/:chanKey controllers.Tv.apiGamesChannel(chanKey)
# Relation
POST /rel/follow/:userId controllers.Relation.follow(userId)
POST /rel/unfollow/:userId controllers.Relation.unfollow(userId)
GET /api/rel/following controllers.Relation.apiFollowing
POST /api/rel/follow/:userId controllers.Relation.apiFollow(userId)
POST /api/rel/unfollow/:userId controllers.Relation.apiUnfollow(userId)
POST /rel/block/:userId controllers.Relation.block(userId)
POST /rel/unblock/:userId controllers.Relation.unblock(userId)
GET /@/:username/following controllers.Relation.following(username, page: Int ?= 1)
GET /@/:username/followers controllers.Relation.followers(username, page: Int ?= 1)
GET /rel/blocks controllers.Relation.blocks(page: Int ?= 1)
# Insight
POST /insights/refresh/:username controllers.Insight.refresh(username)
POST /insights/data/:username controllers.Insight.json(username)
GET /insights/:username controllers.Insight.index(username)
GET /insights/:username/:metric/:dimension controllers.Insight.path(username, metric, dimension, filters = "")
GET /insights/:username/:metric/:dimension/*filters controllers.Insight.path(username, metric, dimension, filters)
# User subpages
GET /@/:username/tournaments/:path controllers.UserTournament.path(username, path, page: Int ?= 1)
# User blog
GET /@/:username/blog controllers.Ublog.index(username, page: Int ?= 1)
GET /@/:username/blog/:slug/:id controllers.Ublog.post(username, slug, id)
GET /@/:username/blog/drafts controllers.Ublog.drafts(username, page: Int ?= 1)
GET /@/:username/blog/new controllers.Ublog.form(username)
GET /@/:username/blog.atom controllers.Ublog.userAtom(username)
POST /ublog/new controllers.Ublog.create
GET /ublog/$id<\w{8}>/discuss controllers.Ublog.discuss(id)
GET /ublog/$id<\w{8}>/redirect controllers.Ublog.redirect(id)
GET /ublog/$id<\w{8}>/edit controllers.Ublog.edit(id)
POST /ublog/$id<\w{8}>/edit controllers.Ublog.update(id)
POST /ublog/$id<\w{8}>/del controllers.Ublog.delete(id)
POST /ublog/$id<\w{8}>/like controllers.Ublog.like(id, v: Boolean)
POST /ublog/:blogId/tier controllers.Ublog.setTier(blogId)
POST /upload/image/ublog/$id<\w{8}> controllers.Ublog.image(id)
# User
GET /api/stream/:username/mod controllers.User.mod(username)
POST /@/:username/note controllers.User.writeNote(username)
POST /note/delete/:id controllers.User.deleteNote(id)
GET /@/:username/mini controllers.User.showMini(username)
GET /@/:username/tv controllers.User.tv(username)
GET /@/:username/perf/:perfKey controllers.User.perfStat(username, perfKey)
GET /@/:username/all controllers.User.gamesAll(username, page: Int ?= 1)
GET /@/:username/download controllers.User.download(username)
GET /@/:username/:filterName controllers.User.games(username, filterName, page: Int ?= 1)
GET /@/:username controllers.User.show(username)
GET /player/myself controllers.User.myself
GET /player/opponents controllers.User.opponents
GET /player controllers.User.list
GET /player/top/:nb/:perfKey controllers.User.topNb(nb: Int, perfKey)
GET /player/top/week controllers.User.topWeek
GET /player/online controllers.User.online
GET /player/autocomplete controllers.User.autocomplete
GET /api/player controllers.User.apiList
GET /dasher controllers.Dasher.get
# Blog
GET /blog controllers.Blog.index(page: Int ?= 1)
GET /blog/all controllers.Blog.all
GET /blog/$year<2\d{3}> controllers.Blog.year(year: Int)
GET /blog/discuss/:id controllers.Blog.discuss(id)
GET /blog/topic controllers.Ublog.topics
GET /blog/topic/:topic controllers.Ublog.topic(topic, page: Int ?= 1)
GET /blog.atom controllers.Blog.atom
GET /blog.txt controllers.Blog.sitemapTxt
GET /blog/friends controllers.Ublog.friends(page: Int ?= 1)
GET /blog/liked controllers.Ublog.liked(page: Int ?= 1)
GET /blog/community controllers.Ublog.community(lang = "all", page: Int ?= 1)
GET /blog/community.atom controllers.Ublog.communityAtom(lang = "all")
GET /blog/community/$lang<[\w-]{2,6}>.atom controllers.Ublog.communityAtom(lang)
GET /blog/community/:lang controllers.Ublog.community(lang, page: Int ?= 1)
GET /blog/:id/:slug controllers.Blog.show(id, slug, ref: Option[String] ?= None)
GET /opening controllers.Opening.index(q: Option[String] ?= None)
POST /opening/config/:q controllers.Opening.config(q)
POST /opening/wiki/:key controllers.Opening.wikiWrite(key)
GET /opening/tree controllers.Opening.tree
GET /opening/:q controllers.Opening.query(q)
# Training - Coordinate
GET /training/coordinate controllers.Coordinate.home
POST /training/coordinate/score controllers.Coordinate.score
GET /$lang<\w\w>/training/coordinate controllers.Coordinate.homeLang(lang)
# Training - Puzzle
GET /training controllers.Puzzle.home
GET /training/daily controllers.Puzzle.daily
GET /training/frame controllers.Puzzle.frame
GET /training/help controllers.Puzzle.help
GET /training/export/gif/thumbnail/:id.gif controllers.Export.puzzleThumbnail(id, theme: Option[String], piece: Option[String])
GET /training/themes controllers.Puzzle.themes
GET /training/openings controllers.Puzzle.openings(order ?= "popular")
GET /training/of-player controllers.Puzzle.ofPlayer(name: Option[String] ?= None, page: Int ?= 1)
GET /training/dashboard/$days<\d+> controllers.Puzzle.dashboard(days: Int, path = "home", u: Option[String])
GET /training/dashboard/$days<\d+>/:path controllers.Puzzle.dashboard(days: Int, path, u: Option[String])
GET /training/replay/$days<\d+>/:theme controllers.Puzzle.replay(days: Int, theme)
GET /training/history controllers.Puzzle.history(page: Int ?= 1, u: Option[String])
GET /training/mobile/history controllers.Puzzle.mobileHistory(page: Int ?= 1)
GET /training/batch controllers.Puzzle.mobileBcBatchSelect
POST /training/batch controllers.Puzzle.mobileBcBatchSolve
GET /training/new controllers.Puzzle.mobileBcNew
GET /training/$numericalId<\d{6,}>/load controllers.Puzzle.mobileBcLoad(numericalId: Long)
POST /training/$numericalId<\d{6,}>/vote controllers.Puzzle.mobileBcVote(numericalId: Long)
GET /training/:angleOrId controllers.Puzzle.show(angleOrId)
GET /training/:angle/$color<white|black|random> controllers.Puzzle.angleAndColor(angle, color)
GET /training/:angle/$id<\w{5}> controllers.Puzzle.showWithAngle(angle, id)
POST /training/$numericalId<\d{6,}>/round2 controllers.Puzzle.mobileBcRound(numericalId: Long)
POST /training/$id<\w{5}>/vote controllers.Puzzle.vote(id)
POST /training/$id<\w{5}>/vote/:theme controllers.Puzzle.voteTheme(id, theme)
POST /training/complete/:theme/$id<\w{5}> controllers.Puzzle.complete(theme, id)
POST /training/difficulty/:theme controllers.Puzzle.setDifficulty(theme)
GET /$lang<\w\w>/training controllers.Puzzle.homeLang(lang)
GET /$lang<\w\w>/training/themes controllers.Puzzle.themesLang(lang)
GET /$lang<\w\w>/training/:angleOrId controllers.Puzzle.showLang(lang, angleOrId)
# Puzzle Streak
GET /streak controllers.Puzzle.streak
GET /$lang<\w\w>/streak controllers.Puzzle.streakLang(lang)
# Puzzle Storm
GET /storm controllers.Storm.home
POST /storm controllers.Storm.record
GET /storm/dashboard controllers.Storm.dashboard(page: Int ?= 1)
GET /storm/dashboard/:username controllers.Storm.dashboardOf(username, page: Int ?= 1)
GET /api/storm/dashboard/:username controllers.Storm.apiDashboardOf(username, days: Int ?= 30)
GET /$lang<\w\w>/storm controllers.Storm.homeLang(lang)
# Puzzle Racer
GET /racer controllers.Racer.home
POST /racer controllers.Racer.create
POST /api/racer controllers.Racer.apiCreate
GET /racer/:id controllers.Racer.show(id)
GET /racer/:id/rematch controllers.Racer.rematch(id)
POST /racer/lobby controllers.Racer.lobby
GET /$lang<\w\w>/racer controllers.Racer.homeLang(lang)
# User Analysis
GET /analysis/help controllers.UserAnalysis.help
GET /analysis/pgn/*pgn controllers.UserAnalysis.pgn(pgn)
GET /analysis/*something controllers.UserAnalysis.parseArg(something)
GET /analysis controllers.UserAnalysis.index
# Study
GET /study controllers.Study.allDefault(page: Int ?= 1)
GET /study/staff-picks controllers.Study.staffPicks
GET /study/all/:order controllers.Study.all(order, page: Int ?= 1)
GET /study/mine/:order controllers.Study.mine(order, page: Int ?= 1)
GET /study/member/:order controllers.Study.mineMember(order, page: Int ?= 1)
GET /study/public/:order controllers.Study.minePublic(order, page: Int ?= 1)
GET /study/private/:order controllers.Study.minePrivate(order, page: Int ?= 1)
GET /study/likes/:order controllers.Study.mineLikes(order, page: Int ?= 1)
GET /study/by/:username controllers.Study.byOwnerDefault(username, page: Int ?= 1)
GET /study/by/:username/export.pgn controllers.Study.exportPgn(username)
GET /study/by/:username/:order controllers.Study.byOwner(username, order, page: Int ?= 1)
GET /study/search controllers.Study.search(q ?= "", page: Int ?= 1)
GET /study/$id<\w{8}> controllers.Study.show(id)
POST /study controllers.Study.create
POST /study/as controllers.Study.createAs
GET /study/$id<\w{8}>.pgn controllers.Study.pgn(id)
GET /study/$id<\w{8}>/$chapterId<\w{8}>.pgn controllers.Study.chapterPgn(id, chapterId)
GET /study/$id<\w{8}>/$chapterId<\w{8}>.gif controllers.Study.chapterGif(id, chapterId, theme: Option[String], piece: Option[String])
POST /study/$id<\w{8}>/delete controllers.Study.delete(id)
GET /study/$id<\w{8}>/clone controllers.Study.cloneStudy(id)
POST /study/$id<\w{8}>/cloneApply controllers.Study.cloneApply(id)
GET /study/$id<\w{8}>/$chapterId<\w{8}> controllers.Study.chapter(id, chapterId)
GET /study/$id<\w{8}>/$chapterId<\w{8}>/meta controllers.Study.chapterMeta(id, chapterId)
GET /study/embed/$id<\w{8}>/$chapterId<\w{8}> controllers.Study.embed(id, chapterId)
POST /study/$id<\w{8}>/clear-chat controllers.Study.clearChat(id)
POST /study/$id<\w{8}>/import-pgn controllers.Study.importPgn(id)
GET /study/$id<\w{8}>/multi-board controllers.Study.multiBoard(id, page: Int ?= 1)
POST /study/$id<\w{8}>/admin controllers.Study.admin(id)
GET /study/topic controllers.Study.topics
POST /study/topic controllers.Study.setTopics
GET /study/topic/:topic/:order controllers.Study.byTopic(topic, order, page: Int ?= 1)
GET /study/topic/autocomplete controllers.Study.topicAutocomplete
GET /study/glyphs/:lang.json controllers.Study.glyphs(lang)
GET /$lang<\w\w>/study controllers.Study.homeLang(lang)
GET /api/study/$id<\w{8}>.pgn controllers.Study.apiPgn(id)
# Relay
GET /broadcast controllers.RelayTour.index(page: Int ?= 1)
GET /broadcast/new controllers.RelayTour.form
POST /broadcast/new controllers.RelayTour.create
GET /broadcast/calendar controllers.RelayTour.calendar
GET /broadcast/help controllers.RelayTour.help
GET /broadcast/:rs/$anyId<\w{8}> controllers.RelayTour.redirectOrApiTour(rs, anyId)
GET /api/broadcast/$tourId<\w{8}>.pgn controllers.RelayTour.pgn(tourId)
GET /broadcast/$tourId<\w{8}>/edit controllers.RelayTour.edit(tourId)
POST /broadcast/$tourId<\w{8}>/edit controllers.RelayTour.update(tourId)
GET /broadcast/$tourId<\w{8}>/new controllers.RelayRound.form(tourId)
POST /broadcast/$tourId<\w{8}>/new controllers.RelayRound.create(tourId)
GET /broadcast/:ts/:rs/$roundId<\w{8}> controllers.RelayRound.show(ts, rs, roundId)
GET /broadcast/:ts/:rs/$roundId<\w{8}>/$chapterId<\w{8}> controllers.RelayRound.chapter(ts, rs, roundId, chapterId)
GET /broadcast/round/$roundId<\w{8}>/edit controllers.RelayRound.edit(roundId)
POST /broadcast/round/$roundId<\w{8}>/edit controllers.RelayRound.update(roundId)
POST /broadcast/round/$roundId<\w{8}>/reset controllers.RelayRound.reset(roundId)
POST /broadcast/round/$roundId<\w{8}>/push controllers.RelayRound.push(roundId)
GET /broadcast/:ts/:rs/$roundId<\w{8}>.pgn controllers.RelayRound.pgn(ts, rs, roundId)
GET /api/broadcast/round/$roundId<\w{8}>.pgn controllers.RelayRound.apiPgn(roundId)
GET /api/stream/broadcast/round/$roundId<\w{8}>.pgn controllers.RelayRound.stream(roundId)
# Learn
GET /learn controllers.Learn.index
POST /learn/score controllers.Learn.score
POST /learn/reset controllers.Learn.reset
GET /$lang<\w\w>/learn controllers.Learn.indexLang(lang)
# Patron
GET /patron controllers.Plan.index
GET /patron/thanks controllers.Plan.thanks
GET /patron/list controllers.Plan.list
POST /patron/switch controllers.Plan.switch
POST /patron/cancel controllers.Plan.cancel
POST /patron/webhook controllers.Plan.webhook
POST /patron/stripe/checkout controllers.Plan.stripeCheckout
POST /patron/stripe/update-payment controllers.Plan.updatePayment
GET /patron/stripe/update-payment controllers.Plan.updatePaymentCallback
POST /patron/ipn controllers.Plan.payPalIpn
POST /patron/paypal/checkout controllers.Plan.payPalCheckout
POST /patron/paypal/capture/:id controllers.Plan.payPalCapture(id)
GET /features controllers.Plan.features
# Practice
GET /practice controllers.Practice.index
GET /practice/load/:studyId/:chapterId controllers.Practice.chapter(studyId, chapterId)
GET /practice/config controllers.Practice.config
POST /practice/config controllers.Practice.configSave
POST /practice/reset controllers.Practice.reset
GET /practice/:sectionId controllers.Practice.showSection(sectionId)
GET /practice/:sectionId/:studySlug controllers.Practice.showStudySlug(sectionId, studySlug)
GET /practice/:sectionId/:studySlug/:studyId controllers.Practice.show(sectionId, studySlug, studyId)
GET /practice/:sectionId/:studySlug/:studyId/:chapterId controllers.Practice.showChapter(sectionId, studySlug, studyId, chapterId)
POST /practice/complete/:chapterId/:moves controllers.Practice.complete(chapterId, moves: Int)
# Streamer
GET /streamer controllers.Streamer.index(page: Int ?= 1)
GET /api/streamer/featured controllers.Streamer.featured
GET /api/streamer/live controllers.Streamer.live
GET /streamer/live controllers.Main.movedPermanently(to = "/api/streamer/live")
GET /streamer/edit controllers.Streamer.edit
POST /streamer/new controllers.Streamer.create
POST /streamer/edit controllers.Streamer.editApply
POST /streamer/approval/request controllers.Streamer.approvalRequest
GET /streamer/picture/edit controllers.Streamer.picture
POST /upload/image/streamer controllers.Streamer.pictureApply
GET /streamer/:username controllers.Streamer.show(username)
GET /streamer/:username/redirect controllers.Streamer.redirect(username)
# Round
GET /$gameId<\w{8}> controllers.Round.watcher(gameId, color = "white")
GET /$gameId<\w{8}>/$color<white|black> controllers.Round.watcher(gameId, color)
GET /$fullId<\w{12}> controllers.Round.player(fullId)
GET /$gameId<\w{8}>/$color<white|black>/sides controllers.Round.sides(gameId, color)
GET /$gameId<\w{8}>/continue/:mode controllers.Round.continue(gameId, mode)
GET /$gameId<\w{8}>/note controllers.Round.readNote(gameId)
POST /$gameId<\w{8}>/note controllers.Round.writeNote(gameId)
GET /$gameId<\w{8}>/mini controllers.Round.mini(gameId, color = "white")
GET /$gameId<\w{8}>/$color<white|black>/mini controllers.Round.mini(gameId, color)
GET /$fullId<\w{12}>/mini controllers.Round.miniFullId(fullId)
GET /$gameId<\w{8}>/edit controllers.Editor.game(gameId)
GET /$gameId<\w{8}>/$color<white|black>/analysis controllers.UserAnalysis.game(gameId, color)
POST /$fullId<\w{12}>/forecasts controllers.UserAnalysis.forecasts(fullId)
POST /$fullId<\w{12}>/forecasts/:uci controllers.UserAnalysis.forecastsOnMyTurn(fullId, uci)
POST /$fullId<\w{12}>/resign controllers.Round.resign(fullId)
GET /embed/$gameId<\w{8}> controllers.Analyse.embed(gameId, color = "white")
GET /embed/$gameId<\w{8}>/$color<white|black> controllers.Analyse.embed(gameId, color)
GET /embed/game/$gameId<\w{8}> controllers.Analyse.embedReplayGame(gameId, color = "white")
GET /embed/game/$gameId<\w{8}>/$color<white|black> controllers.Analyse.embedReplayGame(gameId, color)
POST /$gameId<\w{8}>/delete controllers.Game.delete(gameId)
GET /round-next/$gameId<\w{8}> controllers.Round.next(gameId)
GET /whats-next/$fullId<\w{12}> controllers.Round.whatsNext(fullId)
GET /round/help controllers.Round.help
# Tournament
GET /tournament controllers.Tournament.home
GET /tournament/featured controllers.Tournament.featured
GET /tournament/new controllers.Tournament.form
POST /tournament/new controllers.Tournament.create
GET /tournament/team-battle/new/:teamId controllers.Tournament.teamBattleForm(teamId)
GET /tournament/team-battle/edit/:id controllers.Tournament.teamBattleEdit(id)
POST /tournament/team-battle/edit/:id controllers.Tournament.teamBattleUpdate(id)
GET /tournament/calendar controllers.Tournament.calendar
GET /tournament/history controllers.Tournament.history(freq = "unique", page: Int ?= 1)
GET /tournament/history/:freq controllers.Tournament.history(freq, page: Int ?= 1)
GET /tournament/$id<\w{8}> controllers.Tournament.show(id)
GET /tournament/$id<\w{8}>/standing/:page controllers.Tournament.standing(id, page: Int)
GET /tournament/$id<\w{8}>/page-of/:userId controllers.Tournament.pageOf(id, userId)
POST /tournament/$id<\w{8}>/join controllers.Tournament.join(id)
POST /tournament/$id<\w{8}>/withdraw controllers.Tournament.pause(id)
GET /tournament/$id<\w{8}>/player/:user controllers.Tournament.player(id, user)
GET /tournament/$id<\w{8}>/team/:team controllers.Tournament.teamInfo(id, team)
POST /tournament/$id<\w{8}>/terminate controllers.Tournament.terminate(id)
GET /tournament/$id<\w{8}>/edit controllers.Tournament.edit(id)
POST /tournament/$id<\w{8}>/edit controllers.Tournament.update(id)
GET /tournament/$id<\w{8}>/teams controllers.Tournament.battleTeams(id)
GET /tournament/help controllers.Tournament.help(system: Option[String] ?= None)
GET /tournament/leaderboard controllers.Tournament.leaderboard
GET /tournament/shields controllers.Tournament.shields
GET /tournament/shields/:categ controllers.Tournament.categShields(categ)
GET /$lang<\w\w>/tournament controllers.Tournament.homeLang(lang)
# Tournament CRUD
GET /tournament/manager controllers.TournamentCrud.index(page: Int ?= 1)
GET /tournament/manager/clone/$id<\w{8}> controllers.TournamentCrud.cloneT(id)
GET /tournament/manager/$id<\w{8}> controllers.TournamentCrud.edit(id)
POST /tournament/manager/$id<\w{8}> controllers.TournamentCrud.update(id)
GET /tournament/manager/new controllers.TournamentCrud.form
POST /tournament/manager controllers.TournamentCrud.create
# Swiss
GET /swiss controllers.Swiss.home
GET /swiss/new/:teamId controllers.Swiss.form(teamId)
POST /swiss/new/:teamId controllers.Swiss.create(teamId)
GET /swiss/$id<\w{8}> controllers.Swiss.show(id)
GET /swiss/$id<\w{8}>/round/:round controllers.Swiss.round(id, round: Int)
GET /swiss/$id<\w{8}>.trf controllers.Swiss.exportTrf(id)
POST /swiss/$id<\w{8}>/join controllers.Swiss.join(id)
POST /swiss/$id<\w{8}>/withdraw controllers.Swiss.withdraw(id)
GET /swiss/$id<\w{8}>/edit controllers.Swiss.edit(id)
POST /swiss/$id<\w{8}>/edit controllers.Swiss.update(id)
POST /swiss/$id<\w{8}>/terminate controllers.Swiss.terminate(id)
GET /swiss/$id<\w{8}>/standing/:page controllers.Swiss.standing(id, page: Int)
GET /swiss/$id<\w{8}>/page-of/:user controllers.Swiss.pageOf(id, user)
GET /swiss/$id<\w{8}>/player/:user controllers.Swiss.player(id, user)
POST /swiss/$id<\w{8}>/schedule-next-round controllers.Swiss.scheduleNextRound(id)
GET /$lang<\w\w>/swiss controllers.Swiss.homeLang(lang)
# Simul
GET /simul controllers.Simul.home
GET /simul/new controllers.Simul.form
POST /simul/new controllers.Simul.create
GET /simul/reload controllers.Simul.homeReload
GET /simul/$id<\w{8}> controllers.Simul.show(id)
GET /simul/$id<\w{8}>/edit controllers.Simul.edit(id)
POST /simul/$id<\w{8}>/edit controllers.Simul.update(id)
POST /simul/$id<\w{8}>/host-ping controllers.Simul.hostPing(id)
POST /simul/$id<\w{8}>/accept/:user controllers.Simul.accept(id, user)
POST /simul/$id<\w{8}>/reject/:user controllers.Simul.reject(id, user)
POST /simul/$id<\w{8}>/start controllers.Simul.start(id)
POST /simul/$id<\w{8}>/abort controllers.Simul.abort(id)
POST /simul/$id<\w{8}>/join/:variant controllers.Simul.join(id, variant)
POST /simul/$id<\w{8}>/withdraw controllers.Simul.withdraw(id)
GET /$lang<\w\w>/simul controllers.Simul.homeLang(lang)
# Team
GET /team controllers.Team.home(page: Int ?= 1)
GET /team/new controllers.Team.form
POST /team/new controllers.Team.create
GET /team/me controllers.Team.mine
GET /team/leader controllers.Team.leader
GET /team/all controllers.Team.all(page: Int ?= 1)
GET /team/requests controllers.Team.requests
GET /team/search controllers.Team.search(text ?= "", page: Int ?= 1)
GET /team/autocomplete controllers.Team.autocomplete
GET /team/:id controllers.Team.show(id, page: Int ?= 1, mod: Boolean ?= false)
POST /team/:id/join controllers.Team.join(id)
POST /team/:id/quit controllers.Team.quit(id)
GET /team/:id/request/new controllers.Team.requestForm(id)
POST /team/:id/request/new controllers.Team.requestCreate(id)
POST /team/:id/request/process controllers.Team.requestProcess(id)
GET /team/:id/declined-requests controllers.Team.declinedRequests(id, page: Int ?=1)
GET /team/:id/edit controllers.Team.edit(id)
POST /team/:id/edit controllers.Team.update(id)
GET /team/:id/kick controllers.Team.kickForm(id)
POST /team/:id/kick controllers.Team.kick(id)
POST /team/:id/kick/:user controllers.Team.kickUser(id, user)
GET /team/:id/leaders controllers.Team.leadersForm(id)
POST /team/:id/leaders controllers.Team.leaders(id)
GET /team/:id/members controllers.Team.members(id, page: Int ?= 1)
POST /team/:id/close controllers.Team.close(id)
POST /team/:id/disable controllers.Team.disable(id)
GET /team/:id/tournaments controllers.Team.tournaments(id)
GET /team/:id/pm-all controllers.Team.pmAll(id)
POST /team/:id/pm-all controllers.Team.pmAllSubmit(id)
POST /team/:id/subscribe controllers.Team.subscribe(id)
# Team API
GET /api/team/all controllers.Team.apiAll(page: Int ?= 1)
GET /api/team/search controllers.Team.apiSearch(text ?= "", page: Int ?= 1)
GET /api/team/of/:username controllers.Team.apiTeamsOf(username)
GET /api/team/:id controllers.Team.apiShow(id)
GET /api/team/:id/users controllers.Team.users(id)
GET /api/team/:id/arena controllers.Tournament.byTeam(id)
GET /api/team/:id/swiss controllers.Swiss.byTeam(id)
GET /api/team/:id/requests controllers.Team.apiRequests(id)
POST /api/team/:id/request/:userId/:decision controllers.Team.apiRequestProcess(id, userId, decision)
# Analyse
POST /$gameId<\w{8}>/request-analysis controllers.Analyse.requestAnalysis(gameId)
GET /game/export/$gameId<\w{8}> controllers.Game.exportOne(gameId)
GET /game/export/$gameId<\w{8}>.pgn controllers.Game.exportOne(gameId)
GET /game/export/png/$gameId<\w{8}>.png controllers.Export.legacyGameThumbnail(gameId, theme: Option[String], piece: Option[String])
GET /game/export/gif/thumbnail/$gameId<\w{8}>.gif controllers.Export.gameThumbnail(gameId, theme: Option[String], piece: Option[String])
GET /game/export/gif/$gameId<\w{8}>.gif controllers.Export.gif(gameId, color = "white", theme: Option[String], piece: Option[String])
GET /game/export/gif/$color<white|black>/$gameId<\w{8}>.gif controllers.Export.gif(gameId, color, theme: Option[String], piece: Option[String])
GET /export/fen.gif controllers.Export.fenThumbnail(fen, color ?= "white", lastMove: Option[String], variant: Option[String], theme: Option[String], piece: Option[String])
# Fishnet
POST /fishnet/acquire controllers.Fishnet.acquire(slow: Boolean ?= false)
POST /fishnet/analysis/$workId<\w{8}> controllers.Fishnet.analysis(workId, slow: Boolean ?= false, stop: Boolean ?= false)
POST /fishnet/abort/$workId<\w{8}> controllers.Fishnet.abort(workId)
GET /fishnet/key/$key<\w{8}> controllers.Fishnet.keyExists(key)
GET /fishnet/status controllers.Fishnet.status
# Pref
POST /pref/:name controllers.Pref.set(name)
GET /account/preferences/:categ controllers.Pref.form(categ)
POST /account/preferences controllers.Pref.formApply
# Setup
POST /setup/ai controllers.Setup.ai
POST /setup/friend controllers.Setup.friend(user: Option[String] ?= None)
POST /setup/hook/:sri/like/:gameId controllers.Setup.like(sri, gameId)
POST /setup/hook/:sri controllers.Setup.hook(sri)
GET /setup/filter controllers.Setup.filterForm
GET /setup/validate-fen controllers.Setup.validateFen
# Challenge
GET /challenge controllers.Challenge.all
GET /challenge/$id<\w{8}> controllers.Challenge.show(id, color: Option[String] ?= None)
POST /challenge/$id<\w{8}>/accept controllers.Challenge.accept(id, color: Option[String] ?= None)
POST /challenge/$id<\w{8}>/decline controllers.Challenge.decline(id)
POST /challenge/$id<\w{8}>/cancel controllers.Challenge.cancel(id)
POST /challenge/$id<\w{8}>/to-friend controllers.Challenge.toFriend(id)
POST /challenge/rematch-of/$id<\w{8}> controllers.Challenge.offerRematchForGame(id)
# Notify
GET /notify controllers.Notify.recent(page: Int ?= 1)
POST /notify/clear controllers.Notify.clear
# Video
GET /video controllers.Video.index
GET /video/tags controllers.Video.tags
GET /video/author/:author controllers.Video.author(author)
GET /video/:id controllers.Video.show(id)
# I18n
POST /translation/select controllers.I18n.select
# Authentication
GET /login controllers.Auth.login
POST /login controllers.Auth.authenticate
GET /$lang<\w\w>/login controllers.Auth.loginLang(lang)
GET /logout controllers.Auth.logoutGet
POST /logout controllers.Auth.logout
GET /signup controllers.Auth.signup
POST /signup controllers.Auth.signupPost
GET /$lang<\w\w>/signup controllers.Auth.signupLang(lang)
GET /signup/check-your-email controllers.Auth.checkYourEmail
POST /signup/fix-email controllers.Auth.fixEmail
GET /signup/confirm/:token controllers.Auth.signupConfirmEmail(token)
GET /password/reset controllers.Auth.passwordReset
POST /password/reset/send controllers.Auth.passwordResetApply
GET /password/reset/sent/:email controllers.Auth.passwordResetSent(email)
GET /password/reset/confirm/:token controllers.Auth.passwordResetConfirm(token)
POST /password/reset/confirm/:token controllers.Auth.passwordResetConfirmApply(token)
POST /auth/set-fp/:fp/:ms controllers.Auth.setFingerPrint(fp, ms: Int)
POST /auth/token controllers.Auth.makeLoginToken
GET /auth/token/:token controllers.Auth.loginWithToken(token)
POST /auth/token/:token controllers.Auth.loginWithTokenPost(token, referrer: Option[String])
GET /auth/magic-link controllers.Auth.magicLink
POST /auth/magic-link/send controllers.Auth.magicLinkApply
GET /auth/magic-link/sent/:email controllers.Auth.magicLinkSent(email)
GET /auth/magic-link/login/:token controllers.Auth.magicLinkLogin(token)
# Mod
POST /mod/:username/alt/:v controllers.Mod.alt(username, v: Boolean)
POST /mod/:username/engine/:v controllers.Mod.engine(username, v: Boolean)
POST /mod/:username/booster/:v controllers.Mod.booster(username, v: Boolean)
POST /mod/:username/troll/:v controllers.Mod.troll(username, v: Boolean)
POST /mod/:username/delete-pms-and-chats controllers.Mod.deletePmsAndChats(username)
POST /mod/:username/warn controllers.Mod.warn(username, subject)
POST /mod/:username/kid controllers.Mod.kid(username)
POST /mod/:username/disable-2fa controllers.Mod.disableTwoFactor(username)
POST /mod/:username/close controllers.Mod.closeAccount(username)
POST /mod/:username/reopen controllers.Mod.reopenAccount(username)
POST /mod/:username/title controllers.Mod.setTitle(username)
POST /mod/:username/inquiry controllers.Mod.spontaneousInquiry(username)
GET /mod/:username/communication controllers.Mod.communicationPublic(username)
GET /mod/:username/communication/private controllers.Mod.communicationPrivate(username)
POST /mod/:username/rankban/:v controllers.Mod.rankban(username, v: Boolean)
POST /mod/:username/reportban/:v controllers.Mod.reportban(username, v: Boolean)
POST /mod/:username/impersonate controllers.Mod.impersonate(username)
GET /mod/:username/games controllers.GameMod.index(username)
POST /mod/:username/games controllers.GameMod.post(username)
GET /mod/table controllers.Mod.table
POST /mod/:username/refreshUserAssess controllers.Mod.refreshUserAssess(username)
POST /mod/:username/email controllers.Mod.setEmail(username)
POST /mod/inquiry-to-zulip controllers.Mod.inquiryToZulip
POST /mod/:username/create-name-close-vote controllers.Mod.createNameCloseVote(username)
GET /mod/leaderboard controllers.Mod.gamify
GET /mod/leaderboard/:period controllers.Mod.gamifyPeriod(period)
GET /mod/activity controllers.Mod.activity
GET /mod/activity/:who/:period controllers.Mod.activityOf(who, period)
GET /mod/queues/:period controllers.Mod.queues(period)
GET /mod/search controllers.Mod.search
GET /mod/chat-user/:username controllers.Mod.chatUser(username)
GET /mod/:username/permissions controllers.Mod.permissions(username)
POST /mod/:username/permissions controllers.Mod.savePermissions(username)
POST /mod/:username/gdpr-erase controllers.Mod.gdprErase(username)
GET /mod/public-chat controllers.Mod.publicChat
POST /mod/public-chat/timeout controllers.Mod.publicChatTimeout
GET /mod/email-confirm controllers.Mod.emailConfirm
GET /mod/chat-panic controllers.Mod.chatPanic
POST /mod/chat-panic controllers.Mod.chatPanicPost
GET /mod/print/:fh controllers.Mod.print(fh)
POST /mod/print/ban/:v/:fh controllers.Mod.printBan(v: Boolean, fh)
GET /mod/ip/:ip controllers.Mod.singleIp(ip)
POST /mod/ip/ban/:v/:ip controllers.Mod.singleIpBan(v: Boolean, ip)
GET /mod/presets/:group controllers.Mod.presets(group)
POST /mod/presets/:group controllers.Mod.presetsUpdate(group)
GET /api/stream/mod controllers.Mod.eventStream
# Irwin
GET /irwin controllers.Irwin.dashboard
POST /irwin/report controllers.Irwin.saveReport
GET /api/stream/irwin controllers.Irwin.eventStream
# Kaladin
GET /kaladin controllers.Irwin.kaladin
# Forum
GET /forum controllers.ForumCateg.index
GET /forum/search controllers.ForumPost.search(text ?= "", page: Int ?= 1)
GET /forum/:slug controllers.ForumCateg.show(slug, page: Int ?= 1)
GET /forum/:categSlug/form controllers.ForumTopic.form(categSlug)
POST /forum/:categSlug/new controllers.ForumTopic.create(categSlug)
GET /forum/participants/:topicId controllers.ForumTopic.participants(topicId)
GET /forum/:categSlug/:slug controllers.ForumTopic.show(categSlug, slug, page: Int ?= 1)
POST /forum/:categSlug/:slug/close controllers.ForumTopic.close(categSlug, slug)
POST /forum/:categSlug/:slug/hide controllers.ForumTopic.hide(categSlug, slug)
POST /forum/:categSlug/:slug/sticky controllers.ForumTopic.sticky(categSlug, slug)
POST /forum/:categSlug/:slug/new controllers.ForumPost.create(categSlug, slug, page: Int ?= 1)
POST /forum/:categSlug/delete/:id controllers.ForumPost.delete(categSlug, id)
POST /forum/:categSlug/react/:id/:reaction/:v controllers.ForumPost.react(categSlug, id, reaction, v: Boolean)
POST /forum/post/:id controllers.ForumPost.edit(id)
GET /forum/redirect/post/:id controllers.ForumPost.redirect(id)
# Msg compat
POST /inbox/new controllers.Msg.compatCreate
# Msg
GET /inbox controllers.Msg.home
GET /inbox/search controllers.Msg.search(q)
GET /inbox/unread-count controllers.Msg.unreadCount
GET /inbox/:username controllers.Msg.convo(username, before: Option[Long] ?= None)
DELETE /inbox/:username controllers.Msg.convoDelete(username)
# Msg API/compat
POST /inbox/:username controllers.Msg.apiPost(username)
POST /inbox/:username/delete controllers.Msg.convoDelete(username)
# Coach
GET /coach controllers.Coach.all(page: Int ?= 1)
GET /coach/edit controllers.Coach.edit
POST /coach/edit controllers.Coach.editApply
GET /coach/picture/edit controllers.Coach.picture
POST /upload/image/coach controllers.Coach.pictureApply
POST /coach/approve-review/:id controllers.Coach.approveReview(id)
POST /coach/mod-review/:id controllers.Coach.modReview(id)
GET /coach/:username controllers.Coach.show(username)
POST /coach/:username/review controllers.Coach.review(username)
GET /coach/:lang/:country/:order controllers.Coach.search(lang, order, country, page: Int ?= 1)
GET /$lang<\w\w>/coach controllers.Coach.homeLang(lang)
# Paste
GET /paste controllers.Importer.importGame
POST /import controllers.Importer.sendGame
GET /import/master/$id<\w{8}>/:color controllers.Importer.masterGame(id, color)
# Edit
GET /editor.json controllers.Editor.data
GET /editor/*urlFen controllers.Editor.load(urlFen)
GET /editor controllers.Editor.index
-> /appeal appeal.Routes
-> /report report.Routes
-> /class clas.Routes
# Stats
GET /stat/rating/distribution/:perf controllers.User.ratingDistribution(perf, username: Option[String] ?= None)
# API
GET /api controllers.Api.index
POST /api/users controllers.Api.usersByIds
GET /api/user/puzzle-activity controllers.Puzzle.activity
GET /api/puzzle/daily controllers.Puzzle.apiDaily
GET /api/puzzle/activity controllers.Puzzle.activity
GET /api/puzzle/dashboard/$days<\d+> controllers.Puzzle.apiDashboard(days: Int)
GET /api/user/:name/tournament/created controllers.Api.tournamentsByOwner(name, status: List[Int])
GET /api/user/:name controllers.Api.user(name)
GET /api/user/:name/activity controllers.Api.activity(name)
GET /api/user/:name/note controllers.User.apiReadNote(name)
POST /api/user/:name/note controllers.User.apiWriteNote(name)
GET /api/user/:name/rating-history controllers.User.ratingHistory(name)
GET /api/user/:name/current-game controllers.User.tvExport(name)
GET /api/user/:name/perf/:perfKey controllers.Api.perfStat(name, perfKey)
GET /api/user/:name/mod-log controllers.Mod.apiUserLog(name)
GET /api/game/:id controllers.Api.game(id)
GET /api/tournament controllers.Api.currentTournaments
GET /api/tournament/$id<\w{8}> controllers.Api.tournament(id)
GET /api/tournament/$id<\w{8}>/games controllers.Api.tournamentGames(id)
GET /api/tournament/$id<\w{8}>/results controllers.Api.tournamentResults(id)
GET /api/tournament/$id<\w{8}>/teams controllers.Api.tournamentTeams(id)
POST /api/tournament controllers.Tournament.apiCreate
POST /api/tournament/$id<\w{8}> controllers.Tournament.apiUpdate(id)
POST /api/tournament/$id<\w{8}>/join controllers.Tournament.apiJoin(id)
POST /api/tournament/$id<\w{8}>/withdraw controllers.Tournament.apiWithdraw(id)
POST /api/tournament/$id<\w{8}>/terminate controllers.Tournament.apiTerminate(id)
POST /api/tournament/team-battle/:id controllers.Tournament.apiTeamBattleUpdate(id)
POST /api/swiss/new/:teamId controllers.Swiss.apiCreate(teamId)
POST /api/swiss/:id/edit controllers.Swiss.apiUpdate(id)
POST /api/swiss/:id/join controllers.Swiss.apiJoin(id)
POST /api/swiss/:id/terminate controllers.Swiss.apiTerminate(id)
GET /api/swiss/:id controllers.Swiss.apiShow(id)
GET /api/swiss/:id/games controllers.Api.swissGames(id)
GET /api/swiss/:id/results controllers.Api.swissResults(id)
GET /api/simul controllers.Simul.apiList
GET /api/status controllers.Api.status
GET /api/users/status controllers.Api.usersStatus
GET /api/crosstable/:u1/:u2 controllers.Api.crosstable(u1, u2)
POST /api/stream/games-by-users controllers.Api.gamesByUsersStream
POST /api/stream/games/:streamId controllers.Api.gamesByIdsStream(streamId)
POST /api/stream/games/:streamId/add controllers.Api.gamesByIdsStreamAddIds(streamId)
GET /api/stream/event controllers.Api.eventStream
GET /api/stream/game/:id controllers.Api.moveStream(id)
GET /api/account controllers.Account.apiMe
GET /api/account/playing controllers.Account.apiNowPlaying
GET /api/account/email controllers.Account.apiEmail
GET /api/account/kid controllers.Account.apiKid
POST /api/account/kid controllers.Account.apiKidPost
GET /api/account/preferences controllers.Pref.apiGet
GET /api/challenge controllers.Challenge.apiList
POST /api/challenge/ai controllers.Setup.apiAi
POST /api/challenge/open controllers.Challenge.openCreate
POST /api/challenge/:user controllers.Challenge.apiCreate(user)
POST /api/challenge/$id<\w{8}>/accept controllers.Challenge.apiAccept(id)
POST /api/challenge/$id<\w{8}>/decline controllers.Challenge.apiDecline(id)
POST /api/challenge/$id<\w{8}>/cancel controllers.Challenge.apiCancel(id)
POST /api/challenge/$id<\w{8}>/start-clocks controllers.Challenge.apiStartClocks(id)
POST /api/round/$id<\w{8}>/add-time/:seconds controllers.Round.apiAddTime(id, seconds: Int)
GET /api/cloud-eval controllers.Api.cloudEval
GET /api/broadcast controllers.RelayTour.apiIndex
POST /api/import controllers.Importer.apiSendGame
GET /api/bulk-pairing controllers.BulkPairing.list
POST /api/bulk-pairing controllers.BulkPairing.create
DELETE /api/bulk-pairing/:id controllers.BulkPairing.delete(id)
POST /api/bulk-pairing/:id/start-clocks controllers.BulkPairing.startClocks(id)
GET /api/games/user/:username controllers.Game.apiExportByUser(username)
GET /api/games/user/:username/imports controllers.Game.apiExportByUserImportedGames(username)
# External engine
GET /api/external-engine controllers.Analyse.externalEngineList
POST /api/external-engine controllers.Analyse.externalEngineCreate
GET /api/external-engine/:id controllers.Analyse.externalEngineShow(id)
PUT /api/external-engine/:id controllers.Analyse.externalEngineUpdate(id)
DELETE /api/external-engine/:id controllers.Analyse.externalEngineDelete(id)
# Mobile API only
GET /api/user/:name/games controllers.Api.userGames(name)
# Bot API
GET /api/bot/game/stream/:id controllers.PlayApi.botGameStream(id)
POST /api/bot/game/:id/move/:uci controllers.PlayApi.botMove(id, uci, offeringDraw: Option[Boolean] ?= None)
GET /api/bot/online controllers.PlayApi.botOnlineApi
POST /api/bot/*cmd controllers.PlayApi.botCommand(cmd)
GET /api/bot/*cmd controllers.PlayApi.botCommandGet(cmd)
GET /player/bots controllers.PlayApi.botOnline
# Board API
GET /api/board/game/stream/:id controllers.PlayApi.boardGameStream(id)
POST /api/board/game/:id/move/:uci controllers.PlayApi.boardMove(id, uci, offeringDraw: Option[Boolean] ?= None)
POST /api/board/seek controllers.Setup.boardApiHook
POST /api/board/*cmd controllers.PlayApi.boardCommandPost(cmd)
GET /api/board/*cmd controllers.PlayApi.boardCommandGet(cmd)
# Account
GET /account/passwd controllers.Account.passwd
POST /account/passwd controllers.Account.passwdApply
GET /account/email controllers.Account.email
POST /account/email controllers.Account.emailApply
GET /contact/email-confirm/help controllers.Account.emailConfirmHelp
GET /account/email/confirm/:token controllers.Account.emailConfirm(token)
GET /account/close controllers.Account.close
POST /account/closeConfirm controllers.Account.closeConfirm
GET /account/profile controllers.Account.profile
POST /account/profile controllers.Account.profileApply
GET /account/username controllers.Account.username
POST /account/username controllers.Account.usernameApply
GET /account/kid controllers.Account.kid
POST /account/kid controllers.Account.kidPost
GET /account/twofactor controllers.Account.twoFactor
POST /account/twofactor/setup controllers.Account.setupTwoFactor
POST /account/twofactor/disable controllers.Account.disableTwoFactor
GET /account/reopen controllers.Account.reopen
POST /account/reopen/send controllers.Account.reopenApply
GET /account/reopen/sent/:email controllers.Account.reopenSent(email)
GET /account/reopen/login/:token controllers.Account.reopenLogin(token)
GET /account/personal-data controllers.Account.data
# App BC
GET /account/security controllers.Account.security
POST /account/signout/:sessionId controllers.Account.signout(sessionId)
GET /account/now-playing controllers.Account.nowPlaying
GET /tutor controllers.Tutor.home()
GET /tutor/:username controllers.Tutor.user(username)
POST /tutor/:username/refresh controllers.Tutor.refresh(username)
GET /tutor/:username/:perf controllers.Tutor.perf(username, perf)
GET /tutor/:username/:perf/opening controllers.Tutor.openings(username, perf)
GET /tutor/:username/:perf/opening/:color/:opening controllers.Tutor.opening(username, perf, color, opening)
GET /tutor/:username/:perf/phase controllers.Tutor.phases(username, perf)
GET /tutor/:username/:perf/time controllers.Tutor.time(username, perf)
# OAuth
GET /oauth controllers.OAuth.authorize
POST /oauth controllers.OAuth.legacyTokenApply
GET /oauth/authorize controllers.OAuth.legacyAuthorize
POST /oauth/authorize controllers.OAuth.authorizeApply
POST /oauth/revoke-client controllers.OAuth.revokeClient
POST /api/token controllers.OAuth.tokenApply
DELETE /api/token controllers.OAuth.tokenRevoke
GET /account/oauth/token controllers.OAuthToken.index
GET /account/oauth/token/create controllers.OAuthToken.create
POST /account/oauth/token/create controllers.OAuthToken.createApply
POST /account/oauth/token/:id/delete controllers.OAuthToken.delete(id)
POST /api/token/admin-challenge controllers.OAuth.challengeTokens
POST /api/token/test controllers.OAuth.testTokens
# Events
GET /event/$id<\w{8}> controllers.Event.show(id)
GET /event/manager controllers.Event.manager
GET /event/manager/$id<\w{8}> controllers.Event.edit(id)
POST /event/manager/$id<\w{8}> controllers.Event.update(id)
GET /event/manager/clone/$id<\w{8}> controllers.Event.cloneE(id)
GET /event/manager/new controllers.Event.form
POST /event/manager controllers.Event.create
# Misc
GET /captcha/$id<\w{8}> controllers.Main.captchaCheck(id)
GET /developers controllers.Main.webmasters
GET /mobile controllers.Main.mobile
GET /$lang<\w\w>/mobile controllers.Main.mobileLang(lang)
GET /lag controllers.Main.lag
GET /get-fishnet controllers.Main.getFishnet
GET /costs controllers.Main.costs
GET /verify-title controllers.Main.verifyTitle
GET /InstantChess.com controllers.Main.instantChess
GET /daily-puzzle-slack controllers.Main.dailyPuzzleSlackApp
# Dev
GET /dev/cli controllers.Dev.cli
POST /dev/cli controllers.Dev.cliPost
POST /cli controllers.Dev.command
GET /dev/settings controllers.Dev.settings
POST /dev/settings/:id controllers.Dev.settingsPost(id)
# Push
POST /mobile/register/:platform/:deviceId controllers.Push.mobileRegister(platform, deviceId)
POST /mobile/unregister controllers.Push.mobileUnregister
POST /push/subscribe controllers.Push.webSubscribe
# Pages
GET /terms-of-service controllers.Page.tos
GET /$bookmark<privacy|thanks|about|ads|changelog|nft> controllers.Page.menuBookmark(bookmark)
GET /contact controllers.Main.contact
GET /faq controllers.Main.faq
GET /source controllers.Page.source
GET /qa/:id/:slug controllers.Main.legacyQaQuestion(id: Int, slug)
GET /how-to-cheat controllers.Page.loneBookmark(bookmark = "how-to-cheat")
GET /page/:bookmark controllers.Page.loneBookmark(bookmark)
# Variants
GET /variant controllers.Page.variantHome
GET /variant/:key controllers.Page.variant(key)
# Help
GET /help/contribute controllers.Page.help
GET /help/master controllers.Page.master
GET /help/keyboard-move controllers.Main.keyboardMoveHelp
# DGT
GET /dgt controllers.DgtCtrl.index
GET /dgt/play controllers.DgtCtrl.play
GET /dgt/config controllers.DgtCtrl.config
POST /dgt/config/token controllers.DgtCtrl.generateToken
# Accessibility
POST /toggle-blind-mode controllers.Main.toggleBlindMode
GET /prismic-preview controllers.Blog.preview(token)
POST /jslog/$id<\w{12}> controllers.Main.jslog(id)
POST /jsmon/:event controllers.Main.jsmon(event)
GET /assets/_$v<\w{6}>/*file controllers.Main.devAsset(v, path="public", file)
GET /assets/*file controllers.ExternalAssets.at(path="public", file)
GET /manifest.json controllers.Main.manifest
GET /robots.txt controllers.Main.robots
GET /$username<[\w-]{2,30}> controllers.User.redirect(username)
# Should be handled by nginx mostly
OPTIONS / controllers.Options.root
OPTIONS /*url controllers.Options.all(url)