126 lines
3.8 KiB
Scala
126 lines
3.8 KiB
Scala
package lila.notify
|
|
|
|
import lila.common.LightUser
|
|
import play.api.libs.json._
|
|
import lila.i18n.{ I18nKeys => trans }
|
|
|
|
import lila.common.Json.jodaWrites
|
|
import play.api.i18n.Lang
|
|
import lila.i18n.JsDump
|
|
|
|
final class JSONHandlers(getLightUser: LightUser.GetterSync) {
|
|
|
|
implicit val notificationWrites: Writes[Notification] = new Writes[Notification] {
|
|
|
|
private def writeBody(notificationContent: NotificationContent) = {
|
|
notificationContent match {
|
|
case MentionedInThread(mentionedBy, topic, _, category, postId) =>
|
|
Json.obj(
|
|
"mentionedBy" -> getLightUser(mentionedBy.value),
|
|
"topic" -> topic.value,
|
|
"category" -> category.value,
|
|
"postId" -> postId.value
|
|
)
|
|
case InvitedToStudy(invitedBy, studyName, studyId) =>
|
|
Json.obj(
|
|
"invitedBy" -> getLightUser(invitedBy.value),
|
|
"studyName" -> studyName.value,
|
|
"studyId" -> studyId.value
|
|
)
|
|
case PrivateMessage(senderId, text) =>
|
|
Json.obj(
|
|
"user" -> getLightUser(senderId.value),
|
|
"text" -> text.value
|
|
)
|
|
case TeamJoined(id, name) =>
|
|
Json.obj(
|
|
"id" -> id.value,
|
|
"name" -> name.value
|
|
)
|
|
case ReportedBanned | CoachReview => Json.obj()
|
|
case TitledTournamentInvitation(id, text) =>
|
|
Json.obj(
|
|
"id" -> id,
|
|
"text" -> text
|
|
)
|
|
case GameEnd(gameId, opponentId, win) =>
|
|
Json.obj(
|
|
"id" -> gameId.value,
|
|
"opponent" -> opponentId.map(_.value).flatMap(getLightUser),
|
|
"win" -> win.map(_.value)
|
|
)
|
|
case _: PlanStart => Json.obj()
|
|
case _: PlanExpire => Json.obj()
|
|
case RatingRefund(perf, points) =>
|
|
Json.obj(
|
|
"perf" -> perf,
|
|
"points" -> points
|
|
)
|
|
case CorresAlarm(gameId, opponent) =>
|
|
Json.obj(
|
|
"id" -> gameId,
|
|
"op" -> opponent
|
|
)
|
|
case IrwinDone(userId) =>
|
|
Json.obj(
|
|
"user" -> getLightUser(userId)
|
|
)
|
|
case GenericLink(url, title, text, icon) =>
|
|
Json.obj(
|
|
"url" -> url,
|
|
"title" -> title,
|
|
"text" -> text,
|
|
"icon" -> icon
|
|
)
|
|
}
|
|
}
|
|
|
|
def writes(notification: Notification) =
|
|
Json.obj(
|
|
"content" -> writeBody(notification.content),
|
|
"type" -> notification.content.key,
|
|
"read" -> notification.read.value,
|
|
"date" -> notification.createdAt
|
|
)
|
|
}
|
|
|
|
import lila.common.paginator.PaginatorJson._
|
|
implicit val unreadWrites = Writes[Notification.UnreadCount] { v =>
|
|
JsNumber(v.value)
|
|
}
|
|
implicit val andUnreadWrites: OWrites[Notification.AndUnread] = Json.writes[Notification.AndUnread]
|
|
|
|
implicit val newNotificationWrites: Writes[NewNotification] = (newNotification: NewNotification) =>
|
|
Json.obj(
|
|
"notification" -> newNotification.notification,
|
|
"unread" -> newNotification.unreadNotifications
|
|
)
|
|
|
|
private val i18nKeys: List[lila.i18n.MessageKey] = List(
|
|
trans.mentionedYouInX,
|
|
trans.xMentionedYouInY,
|
|
trans.invitedYouToX,
|
|
trans.xInvitedYouToY,
|
|
trans.youAreNowPartOfTeam,
|
|
trans.youHaveJoinedTeamX,
|
|
trans.thankYou,
|
|
trans.someoneYouReportedWasBanned,
|
|
trans.victory,
|
|
trans.defeat,
|
|
trans.draw,
|
|
trans.congratsYouWon,
|
|
trans.gameVsX,
|
|
trans.resVsX,
|
|
trans.newPendingReview,
|
|
trans.someoneReviewedYourCoachProfile,
|
|
trans.lostAgainstTOSViolator,
|
|
trans.refundXpointsTimeControlY,
|
|
trans.timeAlmostUp
|
|
).map(_.key)
|
|
|
|
def apply(notify: Notification.AndUnread)(implicit lang: Lang) =
|
|
andUnreadWrites.writes(notify) ++ Json.obj(
|
|
"i18n" -> JsDump.keysToObject(i18nKeys, lang)
|
|
)
|
|
}
|