forked from lichess-org/lila
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Entry.scala
65 lines (55 loc) · 2.34 KB
/
Entry.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
package lila.timeline
import org.joda.time.DateTime
import play.api.libs.json._
import reactivemongo.bson._
import lila.hub.actorApi.timeline._
import lila.hub.actorApi.timeline.atomFormat._
case class Entry(
_id: BSONObjectID,
users: List[String],
typ: String,
chan: Option[String],
data: JsObject,
date: DateTime) {
import Entry._
def similarTo(other: Entry) = typ == other.typ && data == other.data
lazy val decode: Option[Atom] = (typ match {
case "follow" => Json.fromJson[Follow](data)
case "team-join" => Json.fromJson[TeamJoin](data)
case "team-create" => Json.fromJson[TeamCreate](data)
case "forum-post" => Json.fromJson[ForumPost](data)
case "note-create" => Json.fromJson[NoteCreate](data)
case "tour-join" => Json.fromJson[TourJoin](data)
case "qa-question" => Json.fromJson[QaQuestion](data)
case "qa-answer" => Json.fromJson[QaAnswer](data)
case "qa-comment" => Json.fromJson[QaComment](data)
case "game-end" => Json.fromJson[GameEnd](data)
case "simul-create" => Json.fromJson[SimulCreate](data)
case "simul-join" => Json.fromJson[SimulJoin](data)
}).asOpt
def okForKid = decode ?? (_.okForKid)
}
object Entry {
private[timeline] def make(users: List[String], data: Atom): Option[Entry] = (data match {
case d: Follow => "follow" -> Json.toJson(d)
case d: TeamJoin => "team-join" -> Json.toJson(d)
case d: TeamCreate => "team-create" -> Json.toJson(d)
case d: ForumPost => "forum-post" -> Json.toJson(d)
case d: NoteCreate => "note-create" -> Json.toJson(d)
case d: TourJoin => "tour-join" -> Json.toJson(d)
case d: QaQuestion => "qa-question" -> Json.toJson(d)
case d: QaAnswer => "qa-answer" -> Json.toJson(d)
case d: QaComment => "qa-comment" -> Json.toJson(d)
case d: GameEnd => "game-end" -> Json.toJson(d)
case d: SimulCreate => "simul-create" -> Json.toJson(d)
case d: SimulJoin => "simul-join" -> Json.toJson(d)
}) match {
case (typ, json) => json.asOpt[JsObject] map {
new Entry(BSONObjectID.generate, users, typ, data.channel.some, _, DateTime.now)
}
}
import play.modules.reactivemongo.json.ImplicitBSONHandlers._
import lila.db.BSON.BSONJodaDateTimeHandler
import reactivemongo.bson.Macros
implicit val EntryBSONHandler = Macros.handler[Entry]
}