lila/app/controllers/Simul.scala

226 lines
6.8 KiB
Scala
Raw Normal View History

2015-03-30 16:40:26 -06:00
package controllers
import play.api.mvc._
import views._
2015-03-30 16:40:26 -06:00
import lila.api.Context
import lila.app._
import lila.chat.Chat
2015-03-30 16:40:26 -06:00
import lila.common.HTTPRequest
import lila.simul.{ Simul => Sim }
final class Simul(env: Env) extends LilaController(env) {
2015-03-30 16:40:26 -06:00
2019-07-08 11:59:39 -06:00
private def forms = lila.simul.SimulForm
2015-03-30 16:40:26 -06:00
2019-01-15 21:06:49 -07:00
private def simulNotFound(implicit ctx: Context) = NotFound(html.simul.bits.notFound())
2015-03-30 16:40:26 -06:00
val home = Open { implicit ctx =>
2018-03-27 18:11:49 -06:00
pageHit
fetchSimuls(ctx.me) flatMap { case (((pending, created), started), finished) =>
2020-09-21 01:28:28 -06:00
Ok(html.simul.home(pending, created, started, finished)).fuccess
2019-10-17 09:28:51 -06:00
}
}
val apiList = Action.async {
fetchSimuls(none) flatMap { case (((pending, created), started), finished) =>
2021-02-24 08:12:38 -07:00
env.simul.jsonView.apiAll(pending, created, started, finished) map JsonOk
2015-04-03 07:33:31 -06:00
}
}
val homeReload = Open { implicit ctx =>
fetchSimuls(ctx.me) map { case (((pending, created), started), finished) =>
2020-09-21 01:28:28 -06:00
Ok(html.simul.homeInner(pending, created, started, finished))
2015-04-03 07:33:31 -06:00
}
}
2020-04-06 17:02:44 -06:00
private def fetchSimuls(me: Option[lila.user.User]) =
me.?? { u =>
env.simul.repo.findPending(u.id)
} zip
2020-05-05 22:11:15 -06:00
env.simul.allCreatedFeaturable.get {} zip
2020-04-06 17:02:44 -06:00
env.simul.repo.allStarted zip
2020-04-19 12:55:51 -06:00
env.simul.repo.allFinishedFeaturable(20)
2015-04-03 07:33:31 -06:00
2020-05-05 22:11:15 -06:00
def show(id: String) =
Open { implicit ctx =>
env.simul.repo find id flatMap {
_.fold(simulNotFound.fuccess) { sim =>
for {
team <- sim.team ?? env.team.api.team
version <- env.simul.version(sim.id)
json <- env.simul.jsonView(
sim,
team.map { t =>
lila.simul.SimulTeam(
t.id,
t.name,
ctx.userId exists {
env.team.api.syncBelongsTo(t.id, _)
}
)
}
)
2020-08-12 02:58:07 -06:00
chat <-
canHaveChat(sim) ?? env.chat.api.userChat.cached.findMine(Chat.Id(sim.id), ctx.me).map(some)
2020-05-05 22:11:15 -06:00
_ <- chat ?? { c =>
env.user.lightUserApi.preloadMany(c.chat.userIds)
}
stream <- env.streamer.liveStreamApi one sim.hostId
} yield html.simul.show(sim, version, json, chat, stream, team)
}
} map NoCache
}
2015-04-03 07:33:31 -06:00
2020-08-12 02:58:07 -06:00
private[controllers] def canHaveChat(simul: Sim)(implicit ctx: Context): Boolean =
2019-12-13 07:30:20 -07:00
!ctx.kid && // no public chats for kids
2019-05-02 20:42:45 -06:00
ctx.me.fold(true) { // anon can see public chats
2019-12-04 16:39:16 -07:00
env.chat.panic.allowed
2020-08-12 02:58:07 -06:00
} && simul.team.fold(true) { teamId =>
2020-09-21 01:28:28 -06:00
ctx.userId exists {
env.team.api.syncBelongsTo(teamId, _) || isGranted(_.ChatTimeout)
2020-09-21 01:28:28 -06:00
}
2019-05-02 20:42:45 -06:00
}
2017-10-28 15:40:52 -06:00
2020-05-05 22:11:15 -06:00
def hostPing(simulId: String) =
Open { implicit ctx =>
AsHost(simulId) { simul =>
env.simul.api hostPing simul inject jsonOkResult
2020-05-05 22:11:15 -06:00
}
2019-10-16 05:07:28 -06:00
}
2020-05-05 22:11:15 -06:00
def start(simulId: String) =
Open { implicit ctx =>
AsHost(simulId) { simul =>
env.simul.api start simul.id inject jsonOkResult
}
2015-04-03 07:33:31 -06:00
}
2020-05-05 22:11:15 -06:00
def abort(simulId: String) =
2020-11-25 01:04:31 -07:00
Auth { implicit ctx => me =>
2020-05-05 22:11:15 -06:00
AsHost(simulId) { simul =>
env.simul.api abort simul.id inject {
2020-11-25 01:04:31 -07:00
if (!simul.isHost(me)) env.mod.logApi.terminateTournament(me.id, simul.fullName)
if (HTTPRequest isXhr ctx.req) jsonOkResult
else Redirect(routes.Simul.home)
}
2020-05-05 22:11:15 -06:00
}
}
2020-05-05 22:11:15 -06:00
def accept(simulId: String, userId: String) =
Open { implicit ctx =>
AsHost(simulId) { simul =>
2020-08-16 06:42:29 -06:00
env.simul.api.accept(simul.id, userId, v = true) inject jsonOkResult
2020-05-05 22:11:15 -06:00
}
2015-04-03 07:33:31 -06:00
}
2020-05-05 22:11:15 -06:00
def reject(simulId: String, userId: String) =
Open { implicit ctx =>
AsHost(simulId) { simul =>
2020-08-16 06:42:29 -06:00
env.simul.api.accept(simul.id, userId, v = false) inject jsonOkResult
2020-05-05 22:11:15 -06:00
}
}
def setText(simulId: String) =
OpenBody { implicit ctx =>
AsHost(simulId) { simul =>
implicit val req = ctx.body
2020-07-22 04:52:52 -06:00
forms.setText
.bindFromRequest()
.fold(
_ => BadRequest.fuccess,
text => env.simul.api.setText(simul.id, text) inject jsonOkResult
)
2020-05-05 22:11:15 -06:00
}
}
2020-05-05 22:11:15 -06:00
def form =
Auth { implicit ctx => me =>
NoLameOrBot {
env.team.api.lightsByLeader(me.id) map { teams =>
Ok(html.simul.form.create(forms.create(me, teams), teams))
2020-05-05 22:11:15 -06:00
}
}
2015-04-03 07:33:31 -06:00
}
2015-03-30 16:40:26 -06:00
2020-05-05 22:11:15 -06:00
def create =
AuthBody { implicit ctx => implicit me =>
NoLameOrBot {
implicit val req = ctx.body
env.team.api.lightsByLeader(me.id) flatMap { teams =>
forms
.create(me, teams)
.bindFromRequest()
.fold(
err =>
env.team.api.lightsByLeader(me.id) map { teams =>
BadRequest(html.simul.form.create(err, teams))
},
setup =>
env.simul.api.create(setup, me) map { simul =>
Redirect(routes.Simul.show(simul.id))
}
)
}
2019-07-08 11:59:39 -06:00
}
2017-01-26 05:19:27 -07:00
}
2015-04-03 07:33:31 -06:00
2020-05-05 22:11:15 -06:00
def join(id: String, variant: String) =
Auth { implicit ctx => implicit me =>
NoLameOrBot {
env.simul.api.addApplicant(id, me, variant) inject {
2021-02-24 08:12:38 -07:00
if (HTTPRequest isXhr ctx.req) jsonOkResult
2020-05-05 22:11:15 -06:00
else Redirect(routes.Simul.show(id))
}
}
2017-01-26 05:19:27 -07:00
}
2015-04-03 15:04:59 -06:00
2020-05-05 22:11:15 -06:00
def withdraw(id: String) =
Auth { implicit ctx => me =>
env.simul.api.removeApplicant(id, me) inject {
2021-02-24 08:12:38 -07:00
if (HTTPRequest isXhr ctx.req) jsonOkResult
2015-04-07 17:37:42 -06:00
else Redirect(routes.Simul.show(id))
}
2017-01-26 05:19:27 -07:00
}
2015-04-03 15:04:59 -06:00
2020-08-03 10:52:03 -06:00
def edit(id: String) =
Auth { implicit ctx => me =>
WithEditableSimul(id, me) { simul =>
env.team.api.lightsByLeader(me.id) map { teams =>
Ok(html.simul.form.edit(forms.edit(me, teams, simul), teams, simul))
2020-08-03 10:52:03 -06:00
}
}
}
def update(id: String) =
AuthBody { implicit ctx => me =>
WithEditableSimul(id, me) { simul =>
implicit val req = ctx.body
env.team.api.lightsByLeader(me.id) flatMap { teams =>
forms
.edit(me, teams, simul)
.bindFromRequest()
.fold(
err => BadRequest(html.simul.form.edit(err, teams, simul)).fuccess,
data => env.simul.api.update(simul, data, me) inject Redirect(routes.Simul.show(id))
)
}
2020-08-03 10:52:03 -06:00
}
}
2019-12-09 13:11:45 -07:00
private def AsHost(simulId: Sim.ID)(f: Sim => Fu[Result])(implicit ctx: Context): Fu[Result] =
2019-12-04 21:46:58 -07:00
env.simul.repo.find(simulId) flatMap {
2020-08-03 10:52:03 -06:00
case None => notFound
case Some(simul) if ctx.userId.has(simul.hostId) || isGranted(_.ManageSimul) => f(simul)
case _ => fuccess(Unauthorized)
}
private def WithEditableSimul(id: String, me: lila.user.User)(
f: Sim => Fu[Result]
)(implicit ctx: Context): Fu[Result] =
AsHost(id) { sim =>
if (sim.isStarted) Redirect(routes.Simul.show(sim.id)).fuccess
else f(sim)
2015-04-03 07:33:31 -06:00
}
2015-03-30 16:40:26 -06:00
}