lila/modules/study/src/main/StudyInvite.scala

51 lines
2.1 KiB
Scala
Raw Normal View History

2016-05-03 14:52:30 -06:00
package lila.study
import akka.actor._
import akka.pattern.ask
2018-12-08 04:45:19 -07:00
import lila.hub.actorApi.socket.HasUserId
2016-05-31 06:38:28 -06:00
import lila.notify.{ InvitedToStudy, NotifyApi, Notification }
import lila.pref.Pref
2017-10-21 14:01:50 -06:00
import lila.relation.{ Block, Follow }
import lila.user.{ User, UserRepo }
2016-05-03 14:52:30 -06:00
import makeTimeout.short
2017-05-06 04:30:58 -06:00
private final class StudyInvite(
studyRepo: StudyRepo,
notifyApi: NotifyApi,
getPref: User => Fu[Pref],
getRelation: (User.ID, User.ID) => Fu[Option[lila.relation.Relation]]
) {
2016-05-03 14:52:30 -06:00
2017-05-06 04:30:58 -06:00
private val maxMembers = 30
2018-12-07 05:18:57 -07:00
def apply(byUserId: User.ID, study: Study, invitedUsername: String, socket: StudySocket): Funit = for {
_ <- !study.isOwner(byUserId) ?? fufail[Unit]("Only study owner can invite")
_ <- (study.nbMembers >= maxMembers) ?? fufail[Unit](s"Max study members reached: $maxMembers")
inviter <- UserRepo.named(byUserId) flatten "No such inviter"
2018-04-09 17:07:26 -06:00
invited <- UserRepo.named(invitedUsername).map(_.filterNot(_.id == User.lichessId)) flatten "No such invited"
_ <- study.members.contains(invited) ?? fufail[Unit]("Already a member")
relation <- getRelation(invited.id, byUserId)
_ <- relation.has(Block) ?? fufail[Unit]("This user does not want to join")
isPresent <- socket.ask[Boolean](HasUserId(invited.id, _))
_ <- if (isPresent) funit else getPref(invited).map(_.studyInvite).flatMap {
case Pref.StudyInvite.ALWAYS => funit
case Pref.StudyInvite.NEVER => fufail("This user doesn't accept study invitations")
case Pref.StudyInvite.FRIEND =>
if (relation.has(Follow)) funit
else fufail("This user only accept study invitations from friends")
}
_ <- studyRepo.addMember(study, StudyMember make invited)
shouldNotify = !isPresent && (!inviter.troll || relation.has(Follow))
_ <- shouldNotify ?? {
val notificationContent = InvitedToStudy(
InvitedToStudy.InvitedBy(inviter.id),
InvitedToStudy.StudyName(study.name.value),
InvitedToStudy.StudyId(study.id.value)
)
val notification = Notification.make(Notification.Notifies(invited.id), notificationContent)
notifyApi.addNotification(notification)
2016-05-31 06:38:28 -06:00
}
} yield ()
2016-05-03 14:52:30 -06:00
}