forked from lichess-org/lila
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathExport.scala
74 lines (64 loc) · 2.39 KB
/
Export.scala
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
package controllers
import play.api.mvc.Action
import lila.app._
import lila.common.HTTPRequest
import lila.game.{ Game => GameModel, GameRepo }
import play.api.http.ContentTypes
import play.api.libs.iteratee.{ Iteratee, Enumerator }
import play.api.mvc.Result
import views._
object Export extends LilaController {
private def env = Env.game
def pgn(id: String) = Open { implicit ctx =>
OnlyHumans {
OptionFuResult(GameRepo game id) { game =>
(game.pgnImport.ifTrue(~get("as") == "imported") match {
case Some(i) => fuccess(i.pgn)
case None => for {
initialFen <- GameRepo initialFen game
pgn = Env.api.pgnDump(game, initialFen)
analysis ← !get("as").contains("raw") ?? (Env.analyse.analyser get game.id)
} yield Env.analyse.annotator(pgn, analysis, game.opening, game.winnerColor, game.status, game.clock).toString
}) map { content =>
Ok(content).withHeaders(
CONTENT_TYPE -> ContentTypes.TEXT,
CONTENT_DISPOSITION -> ("attachment; filename=" + (Env.api.pgnDump filename game)))
}
}
}
}
def pdf(id: String) = Open { implicit ctx =>
OnlyHumans {
OptionResult(GameRepo game id) { game =>
Ok.chunked(Enumerator.outputStream(env.pdfExport(game.id))).withHeaders(
CONTENT_TYPE -> "application/pdf",
CACHE_CONTROL -> "max-age=7200")
}
}
}
def png(id: String) = Open { implicit ctx =>
OnlyHumansAndFacebook {
OptionResult(GameRepo game id) { game =>
Ok.chunked(Enumerator.outputStream(env.pngExport(game))).withHeaders(
CONTENT_TYPE -> "image/png",
CACHE_CONTROL -> "max-age=7200")
}
}
}
def puzzlePng(id: Int) = Open { implicit ctx =>
OnlyHumansAndFacebook {
OptionResult(Env.puzzle.api.puzzle find id) { puzzle =>
Ok.chunked(Enumerator.outputStream(Env.puzzle.pngExport(puzzle))).withHeaders(
CONTENT_TYPE -> "image/png",
CACHE_CONTROL -> "max-age=7200")
}
}
}
private def OnlyHumans(result: => Fu[Result])(implicit ctx: lila.api.Context) =
if (HTTPRequest isBot ctx.req) fuccess(NotFound)
else result
private def OnlyHumansAndFacebook(result: => Fu[Result])(implicit ctx: lila.api.Context) =
if (HTTPRequest isFacebookBot ctx.req) result
else if (HTTPRequest isBot ctx.req) fuccess(NotFound)
else result
}