forked from lichess-org/lila
-
Notifications
You must be signed in to change notification settings - Fork 0
/
FormFactory.scala
99 lines (83 loc) · 3.1 KB
/
FormFactory.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
package lila.setup
import lila.rating.RatingRange
import lila.db.api._
import lila.lobby.Color
import lila.user.UserContext
import play.api.data._
import play.api.data.Forms._
import tube.{ userConfigTube, anonConfigTube }
private[setup] final class FormFactory(casualOnly: Boolean) {
import Mappings._
def filterFilled(implicit ctx: UserContext): Fu[(Form[FilterConfig], FilterConfig)] =
filterConfig map { f => filter(ctx).fill(f) -> f }
def filter(ctx: UserContext) = Form(
mapping(
"variant" -> list(variantWithVariants),
"mode" -> list(rawMode(withRated = true)),
"speed" -> list(speed),
"ratingRange" -> ratingRange
)(FilterConfig.<<)(_.>>)
)
def filterConfig(implicit ctx: UserContext): Fu[FilterConfig] = savedConfig map (_.filter)
def aiFilled(fen: Option[String])(implicit ctx: UserContext): Fu[Form[AiConfig]] =
aiConfig map { config =>
ai(ctx) fill fen.fold(config) { f =>
config.copy(fen = f.some, variant = chess.variant.FromPosition)
}
}
def ai(ctx: UserContext) = Form(
mapping(
"variant" -> aiVariants,
"timeMode" -> timeMode,
"time" -> time,
"increment" -> increment,
"days" -> days,
"level" -> level,
"color" -> color,
"fen" -> fen
)(AiConfig.<<)(_.>>)
.verifying("Invalid FEN", _.validFen)
)
def aiConfig(implicit ctx: UserContext): Fu[AiConfig] = savedConfig map (_.ai)
def friendFilled(fen: Option[String])(implicit ctx: UserContext): Fu[Form[FriendConfig]] =
friendConfig map { config =>
friend(ctx) fill fen.fold(config) { f =>
config.copy(fen = f.some, variant = chess.variant.FromPosition)
}
}
def friend(ctx: UserContext) = Form(
mapping(
"variant" -> variantWithFenAndVariants,
"timeMode" -> timeMode,
"time" -> time,
"increment" -> increment,
"days" -> days,
"mode" -> mode(withRated = ctx.isAuth && !casualOnly),
"color" -> color,
"fen" -> fen
)(FriendConfig.<<)(_.>>)
.verifying("Invalid clock", _.validClock)
.verifying("Invalid FEN", _.validFen)
)
def friendConfig(implicit ctx: UserContext): Fu[FriendConfig] = savedConfig map (_.friend)
def hookFilled(timeModeString: Option[String])(implicit ctx: UserContext): Fu[Form[HookConfig]] =
hookConfig map (_ withTimeModeString timeModeString) map hook(ctx).fill
def hook(ctx: UserContext) = Form(
mapping(
"variant" -> variantWithVariants,
"timeMode" -> timeMode,
"time" -> time,
"increment" -> increment,
"days" -> days,
"mode" -> mode(ctx.isAuth && !casualOnly),
"membersOnly" -> boolean,
"ratingRange" -> optional(ratingRange),
"color" -> nonEmptyText.verifying(Color.names contains _)
)(HookConfig.<<)(_.>>)
.verifying("Invalid clock", _.validClock)
.verifying("Can't create rated unlimited in lobby", _.noRatedUnlimited)
)
def hookConfig(implicit ctx: UserContext): Fu[HookConfig] = savedConfig map (_.hook)
def savedConfig(implicit ctx: UserContext): Fu[UserConfig] =
ctx.me.fold(AnonConfigRepo config ctx.req)(UserConfigRepo.config)
}