study invite setting WIP

studyInviteSetting
Thibault Duplessis 2017-05-06 12:30:58 +02:00
parent 3519d36e04
commit 83098176d0
8 changed files with 47 additions and 21 deletions

View File

@ -148,6 +148,12 @@ trait SetupHelper { self: I18nHelper =>
(Pref.Message.ALWAYS, trans.always.str())
)
def translatedStudyInviteChoices(implicit ctx: Context) = List(
(Pref.StudyInvite.NEVER, trans.never.str()),
(Pref.StudyInvite.FRIEND, trans.onlyFriends.str()),
(Pref.StudyInvite.ALWAYS, trans.always.str())
)
def translatedBlindfoldChoices(implicit ctx: Context) = List(
Pref.Blindfold.NO -> trans.no.str(),
Pref.Blindfold.YES -> trans.yes.str()

View File

@ -116,6 +116,10 @@
<h2>@trans.letOtherPlayersMessageYou()</h2>
@base.form.radios(form("message"), translatedMessageChoices)
</li>
<li>
<h2>Let other player invite you to study</h2>
@base.form.radios(form("studyInvite"), translatedStudyInviteChoices)
</li>
<li>
<h2>@trans.shareYourInsightsData()</h2>
@base.form.radios(form("insightShare"), lila.pref.Pref.InsightShare.choices)

View File

@ -33,6 +33,7 @@ object DataForm {
"follow" -> number.verifying(Set(0, 1) contains _),
"challenge" -> number.verifying(Pref.Challenge.choices.toMap contains _),
"message" -> number.verifying(Pref.Message.choices.toMap contains _),
"studyInvite" -> number.verifying(Pref.StudyInvite.choices.toMap contains _),
"insightShare" -> number.verifying(Set(0, 1, 2) contains _)
)(PrefData.apply)(PrefData.unapply))
@ -68,6 +69,7 @@ object DataForm {
follow: Int,
challenge: Int,
message: Int,
studyInvite: Int,
insightShare: Int
) {
@ -86,6 +88,7 @@ object DataForm {
blindfold = display.blindfold,
challenge = challenge,
message = message,
studyInvite = studyInvite,
premove = behavior.premove == 1,
animation = display.animation,
submitMove = behavior.submitMove,
@ -128,6 +131,7 @@ object DataForm {
follow = pref.follow.fold(1, 0),
challenge = pref.challenge,
message = pref.message,
studyInvite = pref.studyInvite,
insightShare = pref.insightShare
)
}

View File

@ -30,6 +30,7 @@ case class Pref(
replay: Int,
challenge: Int,
message: Int,
studyInvite: Int,
coordColor: Int,
submitMove: Int,
confirmResign: Int,
@ -56,21 +57,10 @@ case class Pref(
def hasSeenVerifyTitle = tags contains Tag.verifyTitle
def get(name: String): Option[String] = name match {
case "bg" => transp.fold("transp", dark.fold("dark", "light")).some
case "bgImg" => bgImg
case "theme" => theme.some
case "pieceSet" => pieceSet.some
case "theme3d" => theme3d.some
case "pieceSet3d" => pieceSet3d.some
case "is3d" => is3d.toString.some
case "soundSet" => soundSet.some
case _ => none
}
def set(name: String, value: String): Option[Pref] = name match {
case "bg" =>
if (value == "transp") copy(dark = true, transp = true).some
else Pref.bgs get value map { b => copy(dark = b, transp = false) }
else copy(dark = value == "dark", transp = false).some
case "bgImg" => copy(bgImg = value.some).some
case "theme" => Theme.allByName get value map { t => copy(theme = t.name) }
case "pieceSet" => PieceSet.allByName get value map { p => copy(pieceSet = p.name) }
@ -315,6 +305,18 @@ object Pref {
)
}
object StudyInvite {
val NEVER = 1
val FRIEND = 2
val ALWAYS = 3
val choices = Seq(
NEVER -> "Never",
FRIEND -> "Only friends",
ALWAYS -> "Always"
)
}
def create(id: String) = default.copy(_id = id)
lazy val default = Pref(
@ -345,6 +347,7 @@ object Pref {
clockTenths = ClockTenths.LOWTIME,
challenge = Challenge.ALWAYS,
message = Message.ALWAYS,
studyInvite = StudyInvite.ALWAYS,
coordColor = Color.RANDOM,
submitMove = SubmitMove.CORRESPONDENCE_ONLY,
confirmResign = ConfirmResign.YES,
@ -380,6 +383,4 @@ object Pref {
import ornicar.scalalib.Zero
implicit def PrefZero: Zero[Pref] = Zero.instance(default)
private val bgs = Map("light" -> false, "dark" -> true)
}

View File

@ -54,6 +54,7 @@ final class PrefApi(
replay = r.getD("replay", Pref.default.replay),
challenge = r.getD("challenge", Pref.default.challenge),
message = r.getD("message", Pref.default.message),
studyInvite = r.getD("studyInvite", Pref.default.studyInvite),
coordColor = r.getD("coordColor", Pref.default.coordColor),
submitMove = r.getD("submitMove", Pref.default.submitMove),
confirmResign = r.getD("confirmResign", Pref.default.confirmResign),
@ -93,6 +94,7 @@ final class PrefApi(
"replay" -> o.replay,
"challenge" -> o.challenge,
"message" -> o.message,
"studyInvite" -> o.studyInvite,
"coordColor" -> o.coordColor,
"submitMove" -> o.submitMove,
"confirmResign" -> o.confirmResign,

View File

@ -91,8 +91,7 @@ final class Env(
sequencers = sequencerMap,
chapterMaker = chapterMaker,
studyMaker = studyMaker,
notifier = new StudyNotifier(
netBaseUrl = NetBaseUrl,
inviter = new StudyInvite(
notifyApi = lila.notify.Env.current.api,
relationApi = lila.relation.Env.current.api
),

View File

@ -17,7 +17,7 @@ final class StudyApi(
sequencers: ActorRef,
studyMaker: StudyMaker,
chapterMaker: ChapterMaker,
notifier: StudyNotifier,
inviter: StudyInvite,
tagsFixer: ChapterTagsFixer,
lightUser: lila.common.LightUser.GetterSync,
scheduler: akka.actor.Scheduler,
@ -238,7 +238,7 @@ final class StudyApi(
UserRepo.named(username).flatMap {
_.filterNot(study.members.contains) ?? { user =>
studyRepo.addMember(study, StudyMember make user) >>-
notifier.invite(study, user, socket)
inviter.notify(study, user, socket)
}
} >>- reloadMembers(study) >>- indexStudy(study)
}

View File

@ -9,13 +9,23 @@ import lila.relation.RelationApi
import lila.user.{ User, UserRepo }
import makeTimeout.short
private final class StudyNotifier(
netBaseUrl: String,
private final class StudyInvite(
notifyApi: NotifyApi,
relationApi: RelationApi
) {
def invite(study: Study, invited: User, socket: ActorRef) =
private val maxMembers = 30
def notify(byUserId: User.ID, study: Study, invitedUsername: String, socket: ActorRef): Funit =
study.isOwner(byUserId) ?? {
if (study.nbMembers >= maxMembers) fufail(s"Max study members reached: $maxMembers")
else for {
invited <- UserRepo.named(username) flatten "No such user"
_ <- if (study.members contains invited) fufail("Already a member") else funit
relation <- relationApi.fetchRelation(invited.id, byUserId)
isPresent <- socket ? HasUserId(invited.id) mapTo manifest[Boolean]
(study.isOwner(byUserId) && study.nbMembers < 30) ?? {
canNotify(study.ownerId, invited) flatMap {
_ ?? {
socket ? HasUserId(invited.id) mapTo manifest[Boolean] map { isPresent =>