-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSimul.scala
134 lines (114 loc) · 3.56 KB
/
Simul.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
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
package controllers
import play.api.data.Form
import play.api.libs.json._
import play.api.mvc._
import lila.api.Context
import lila.app._
import lila.common.HTTPRequest
import lila.game.{ Pov, GameRepo }
import lila.simul.{ Simul => Sim }
import lila.user.UserRepo
import views._
object Simul extends LilaController {
private def env = Env.simul
private def simulNotFound(implicit ctx: Context) = NotFound(html.simul.notFound())
val home = Open { implicit ctx =>
fetchSimuls map {
case ((created, started), finished) =>
Ok(html.simul.home(created, started, finished))
}
}
val homeReload = Open { implicit ctx =>
fetchSimuls map {
case ((created, started), finished) =>
Ok(html.simul.homeInner(created, started, finished))
}
}
private def fetchSimuls =
env.allCreated(true) zip env.repo.allStarted zip env.repo.allFinished(10)
def show(id: String) = Open { implicit ctx =>
env.repo find id flatMap {
_.fold(simulNotFound.fuccess) { sim =>
env.version(sim.id) zip
env.jsonView(sim) zip
chatOf(sim) map {
case ((version, data), chat) => html.simul.show(sim, version, data, chat)
}
}
} map NoCache
}
def start(simulId: String) = Open { implicit ctx =>
AsHost(simulId) { simul =>
env.api start simul.id
Ok(Json.obj("ok" -> true)) as JSON
}
}
def abort(simulId: String) = Open { implicit ctx =>
AsHost(simulId) { simul =>
env.api abort simul.id
Ok(Json.obj("ok" -> true)) as JSON
}
}
def accept(simulId: String, userId: String) = Open { implicit ctx =>
AsHost(simulId) { simul =>
env.api.accept(simul.id, userId, true)
Ok(Json.obj("ok" -> true)) as JSON
}
}
def reject(simulId: String, userId: String) = Open { implicit ctx =>
AsHost(simulId) { simul =>
env.api.accept(simul.id, userId, false)
Ok(Json.obj("ok" -> true)) as JSON
}
}
def form = Auth { implicit ctx =>
me =>
NoEngine {
Ok(html.simul.form(env.forms.create, env.forms)).fuccess
}
}
def create = AuthBody { implicit ctx =>
implicit me =>
NoEngine {
implicit val req = ctx.body
env.forms.create.bindFromRequest.fold(
err => BadRequest(html.simul.form(err, env.forms)).fuccess,
setup => env.api.create(setup, me) map { simul =>
Redirect(routes.Simul.show(simul.id))
})
}
}
def join(id: String, variant: String) = Auth { implicit ctx =>
implicit me =>
NoEngine {
fuccess {
env.api.addApplicant(id, me, variant)
if (HTTPRequest isXhr ctx.req) Ok(Json.obj("ok" -> true)) as JSON
else Redirect(routes.Simul.show(id))
}
}
}
def withdraw(id: String) = Auth { implicit ctx =>
me =>
fuccess {
env.api.removeApplicant(id, me)
if (HTTPRequest isXhr ctx.req) Ok(Json.obj("ok" -> true)) as JSON
else Redirect(routes.Simul.show(id))
}
}
def websocket(id: String, apiVersion: Int) = SocketOption { implicit ctx =>
get("sri") ?? { uid =>
env.socketHandler.join(id, uid, ctx.me)
}
}
private def chatOf(sim: Sim)(implicit ctx: Context) =
ctx.isAuth ?? {
Env.chat.api.userChat find sim.id map (_.forUser(ctx.me).some)
}
private def AsHost(simulId: Sim.ID)(f: Sim => Result)(implicit ctx: Context): Fu[Result] =
env.repo.find(simulId) flatMap {
case None => notFound
case Some(simul) if ctx.userId.exists(simul.hostId ==) => fuccess(f(simul))
case _ => fuccess(Unauthorized)
}
}