study invite setting WIP
parent
3519d36e04
commit
83098176d0
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
),
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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 =>
|
Loading…
Reference in New Issue