write joda DateTimes as JSON numbers
parent
fd0469b624
commit
d78b426838
|
@ -3,13 +3,13 @@ package controllers
|
|||
import akka.stream.scaladsl._
|
||||
import ornicar.scalalib.Zero
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
import play.api.mvc._
|
||||
import scala.concurrent.duration._
|
||||
|
||||
import lila.api.{ Context, GameApiV2 }
|
||||
import lila.app._
|
||||
import lila.common.config.{ MaxPerPage, MaxPerSecond }
|
||||
import lila.common.Json.jodaWrites
|
||||
import lila.common.{ HTTPRequest, IpAddress }
|
||||
|
||||
final class Api(
|
||||
|
|
|
@ -12,7 +12,7 @@ import lila.api.{ Context, BodyContext }
|
|||
import lila.app._
|
||||
import lila.app.mashup.{ GameFilterMenu, GameFilter }
|
||||
import lila.common.paginator.Paginator
|
||||
import lila.common.PimpedJson._
|
||||
import lila.common.Json._
|
||||
import lila.common.{ IpAddress, HTTPRequest }
|
||||
import lila.game.{ Pov, Game => GameModel }
|
||||
import lila.rating.PerfType
|
||||
|
|
36
build.sbt
36
build.sbt
|
@ -57,7 +57,7 @@ lazy val moduleCPDeps = moduleRefs map { new sbt.ClasspathDependency(_, None) }
|
|||
lazy val api = module("api", moduleCPDeps)
|
||||
.settings(
|
||||
libraryDependencies ++= provided(
|
||||
play.api, play.joda, play.json, hasher,
|
||||
play.api, play.json, hasher,
|
||||
kamon.core, kamon.influxdb, lettuce
|
||||
) ++ reactivemongo.bundle,
|
||||
aggregate in Runtime := false,
|
||||
|
@ -67,7 +67,7 @@ lazy val api = module("api", moduleCPDeps)
|
|||
lazy val puzzle = module("puzzle", Seq(
|
||||
common, memo, hub, history, db, user, rating, pref, tree, game
|
||||
)).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val quote = module("quote", Seq()).settings(
|
||||
|
@ -136,7 +136,7 @@ lazy val search = module("search", Seq(common, hub)).settings(
|
|||
)
|
||||
|
||||
lazy val chat = module("chat", Seq(common, db, user, security, i18n, socket)).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda, scalatags) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api, scalatags) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val room = module("room", Seq(common, socket, chat)).settings(
|
||||
|
@ -144,7 +144,7 @@ lazy val room = module("room", Seq(common, socket, chat)).settings(
|
|||
)
|
||||
|
||||
lazy val timeline = module("timeline", Seq(common, db, game, user, hub, security, relation)).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val event = module("event", Seq(common, db, memo, i18n)).settings(
|
||||
|
@ -157,15 +157,15 @@ lazy val mod = module("mod", Seq(common, db, user, hub, security, tournament, si
|
|||
)
|
||||
|
||||
lazy val user = module("user", Seq(common, memo, db, hub, rating, socket)).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda, hasher) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api, hasher) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val game = module("game", Seq(common, memo, db, hub, user, chat)).settings(
|
||||
libraryDependencies ++= provided(compression, play.api, play.joda) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(compression, play.api) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val gameSearch = module("gameSearch", Seq(common, hub, search, game)).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val tv = module("tv", Seq(common, db, hub, socket, game, round, user)).settings(
|
||||
|
@ -173,7 +173,7 @@ lazy val tv = module("tv", Seq(common, db, hub, socket, game, round, user)).sett
|
|||
)
|
||||
|
||||
lazy val bot = module("bot", Seq(common, db, hub, game, user, challenge, chat)).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val analyse = module("analyse", Seq(common, hub, game, user, notifyModule, evalCache)).settings(
|
||||
|
@ -184,7 +184,7 @@ lazy val round = module("round", Seq(
|
|||
common, db, memo, hub, socket, game, user,
|
||||
i18n, fishnet, pref, chat, history, playban, room
|
||||
)).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda, scalatags, hasher, kamon.core, lettuce) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api, scalatags, hasher, kamon.core, lettuce) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val pool = module("pool", Seq(common, game, user, playban)).settings(
|
||||
|
@ -216,13 +216,13 @@ lazy val insight = module(
|
|||
"insight",
|
||||
Seq(common, game, user, analyse, relation, pref, socket, round, security)
|
||||
).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda, scalatags) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api, scalatags) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val tournament = module("tournament", Seq(
|
||||
common, hub, socket, game, round, security, chat, memo, quote, history, notifyModule, i18n, room
|
||||
)).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda, scalatags, lettuce) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api, scalatags, lettuce) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val simul = module("simul", Seq(
|
||||
|
@ -258,11 +258,11 @@ lazy val challenge = module("challenge", Seq(common, db, hub, setup, game, relat
|
|||
lazy val study = module("study", Seq(
|
||||
common, db, hub, socket, game, round, importer, notifyModule, relation, evalCache, explorer, i18n, room
|
||||
)).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda, scalatags, lettuce) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api, scalatags, lettuce) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val relay = module("relay", Seq(common, study)).settings(
|
||||
libraryDependencies ++= Seq(scalaUri) ++ provided(play.api, play.joda, markdown) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= Seq(scalaUri) ++ provided(play.api, markdown) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val studySearch = module("studySearch", Seq(common, hub, study, search)).settings(
|
||||
|
@ -270,7 +270,7 @@ lazy val studySearch = module("studySearch", Seq(common, hub, study, search)).se
|
|||
)
|
||||
|
||||
lazy val learn = module("learn", Seq(common, db, user)).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val evalCache = module("evalCache", Seq(common, db, user, security, socket, tree)).settings(
|
||||
|
@ -282,7 +282,7 @@ lazy val practice = module("practice", Seq(common, db, memo, user, study)).setti
|
|||
)
|
||||
|
||||
lazy val playban = module("playban", Seq(common, db, game, message, chat)).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val push = module("push", Seq(common, db, user, game, challenge, message)).settings(
|
||||
|
@ -306,7 +306,7 @@ lazy val pref = module("pref", Seq(common, db, user)).settings(
|
|||
)
|
||||
|
||||
lazy val message = module("message", Seq(common, db, user, hub, relation, security, shutup, notifyModule)).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val forum = module("forum", Seq(common, db, user, security, hub, mod, notifyModule)).settings(
|
||||
|
@ -314,7 +314,7 @@ lazy val forum = module("forum", Seq(common, db, user, security, hub, mod, notif
|
|||
)
|
||||
|
||||
lazy val forumSearch = module("forumSearch", Seq(common, hub, forum, search)).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val team = module("team", Seq(common, memo, db, user, forum, security, hub, notifyModule)).settings(
|
||||
|
@ -350,7 +350,7 @@ lazy val explorer = module("explorer", Seq(common, db, game, importer)).settings
|
|||
)
|
||||
|
||||
lazy val notifyModule = module("notify", Seq(common, db, game, user, hub, relation)).settings(
|
||||
libraryDependencies ++= provided(play.api, play.joda) ++ reactivemongo.bundle
|
||||
libraryDependencies ++= provided(play.api) ++ reactivemongo.bundle
|
||||
)
|
||||
|
||||
lazy val tree = module("tree", Seq(common)).settings(
|
||||
|
|
|
@ -4,7 +4,7 @@ import org.joda.time.{ DateTime, Interval }
|
|||
import play.api.libs.json._
|
||||
|
||||
import lila.common.Iso
|
||||
import lila.common.PimpedJson._
|
||||
import lila.common.Json._
|
||||
import lila.game.JsonView.colorWrites
|
||||
import lila.game.{ Pov, LightPov }
|
||||
import lila.rating.PerfType
|
||||
|
|
|
@ -3,13 +3,13 @@ package lila.api
|
|||
import chess.format.FEN
|
||||
import org.joda.time.DateTime
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
import reactivemongo.api.ReadPreference
|
||||
import reactivemongo.api.bson._
|
||||
import reactivemongo.api.ReadPreference
|
||||
import scala.concurrent.duration._
|
||||
|
||||
import lila.analyse.{ JsonView => analysisJson, AnalysisRepo, Analysis }
|
||||
import lila.common.config._
|
||||
import lila.common.Json.jodaWrites
|
||||
import lila.common.paginator.{ Paginator, PaginatorJson }
|
||||
import lila.db.dsl._
|
||||
import lila.db.paginator.{ Adapter, CachedAdapter }
|
||||
|
|
|
@ -3,13 +3,13 @@ package lila.api
|
|||
import akka.stream.scaladsl._
|
||||
import org.joda.time.DateTime
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
import scala.concurrent.duration._
|
||||
|
||||
import chess.format.FEN
|
||||
import chess.format.pgn.Tag
|
||||
import lila.analyse.{ JsonView => analysisJson, Analysis }
|
||||
import lila.common.config.MaxPerSecond
|
||||
import lila.common.Json.jodaWrites
|
||||
import lila.common.{ LightUser, HTTPRequest }
|
||||
import lila.db.dsl._
|
||||
import lila.game.JsonView._
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
package lila.api
|
||||
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
|
||||
import chess.format.Forsyth
|
||||
import lila.common.Json.jodaWrites
|
||||
import lila.common.LightUser
|
||||
import lila.common.paginator.Paginator
|
||||
import lila.game.{ Game, PerfPicker }
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
package lila.bot
|
||||
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
import chess.format.FEN
|
||||
import play.api.libs.json._
|
||||
|
||||
import lila.common.Json.jodaWrites
|
||||
import lila.game.JsonView._
|
||||
import lila.game.{ Game, Pov, GameRepo }
|
||||
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
package lila.chat
|
||||
|
||||
import lila.common.LightUser
|
||||
import lila.common.PimpedJson._
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
|
||||
import lila.common.LightUser
|
||||
import lila.common.Json._
|
||||
|
||||
object JsonView {
|
||||
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package lila.common
|
||||
|
||||
import play.api.libs.json._
|
||||
import org.joda.time.DateTime
|
||||
import play.api.libs.json.{ Json => PlayJson, _ }
|
||||
|
||||
object PimpedJson {
|
||||
object Json {
|
||||
|
||||
def anyValWriter[O, A: Writes](f: O => A) = Writes[O] { o =>
|
||||
Json toJson f(o)
|
||||
PlayJson toJson f(o)
|
||||
}
|
||||
|
||||
def intAnyValWriter[O](f: O => Int): Writes[O] = anyValWriter[O, Int](f)
|
||||
|
@ -27,4 +28,8 @@ object PimpedJson {
|
|||
)
|
||||
|
||||
implicit val centisReads = Reads.of[Int] map chess.Centis.apply
|
||||
|
||||
implicit val jodaWrites = Writes[DateTime] { time =>
|
||||
JsNumber(time.getSeconds)
|
||||
}
|
||||
}
|
|
@ -136,5 +136,7 @@ object BSON extends Handlers {
|
|||
case BSONElement(k, v) => s"$k: ${debug(v)}"
|
||||
}).mkString("{", ", ", "}")
|
||||
|
||||
def print(v: BSONValue): Unit = println(debug(v))
|
||||
|
||||
def hashDoc(doc: Bdoc): String = debugDoc(doc).replace(" ", "")
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ import play.api.libs.json._
|
|||
|
||||
import chess.format.{ Uci, FEN }
|
||||
import EvalCacheEntry._
|
||||
import lila.common.PimpedJson._
|
||||
import lila.common.Json._
|
||||
import lila.tree.Eval._
|
||||
|
||||
object JsonHandlers {
|
||||
|
|
|
@ -2,10 +2,10 @@ package lila.forumSearch
|
|||
|
||||
import akka.stream.scaladsl._
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
import reactivemongo.akkastream.{ AkkaStreamCursor, cursorProducer }
|
||||
import reactivemongo.api._
|
||||
|
||||
import lila.common.Json.jodaWrites
|
||||
import lila.forum.{ Post, PostView, PostLiteView, PostApi, PostRepo }
|
||||
import lila.search._
|
||||
|
||||
|
|
|
@ -2,11 +2,11 @@ package lila.game
|
|||
|
||||
import akka.stream.scaladsl._
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
|
||||
import actorApi.{ StartGame, FinishGame }
|
||||
import chess.format.FEN
|
||||
import lila.common.Bus
|
||||
import lila.common.Json.jodaWrites
|
||||
import lila.game.Game
|
||||
import lila.user.User
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
package lila.game
|
||||
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
|
||||
import chess.format.{ FEN, Forsyth }
|
||||
import chess.variant.Crazyhouse
|
||||
import chess.{ Color, Clock }
|
||||
import lila.common.Json.jodaWrites
|
||||
|
||||
final class JsonView(rematches: Rematches) {
|
||||
|
||||
|
|
|
@ -2,8 +2,8 @@ package lila.gameSearch
|
|||
|
||||
import chess.{ Mode, Status }
|
||||
import org.joda.time.DateTime
|
||||
import play.api.libs.json.JodaWrites._
|
||||
|
||||
import lila.common.Json.jodaWrites
|
||||
import lila.rating.RatingRange
|
||||
import lila.search.Range
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
package lila.insight
|
||||
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
|
||||
import lila.common.Json.jodaWrites
|
||||
|
||||
final class JsonView {
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
package lila.learn
|
||||
|
||||
import lila.common.PimpedJson._
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
|
||||
import lila.common.Json._
|
||||
|
||||
object JSONHandlers {
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
package lila.message
|
||||
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
import play.api.mvc.Result
|
||||
import play.api.mvc.Results._
|
||||
|
||||
import lila.common.Json.jodaWrites
|
||||
import lila.common.LightUser
|
||||
import lila.common.paginator._
|
||||
import lila.user.User
|
||||
|
|
|
@ -2,7 +2,8 @@ package lila.notify
|
|||
|
||||
import lila.common.LightUser
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
|
||||
import lila.common.Json.jodaWrites
|
||||
|
||||
final class JSONHandlers(getLightUser: LightUser.GetterSync) {
|
||||
|
||||
|
|
|
@ -2,9 +2,9 @@ package lila.playban
|
|||
|
||||
import org.joda.time.DateTime
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
import scala.math.{ log10, sqrt }
|
||||
|
||||
import lila.common.Json.jodaWrites
|
||||
import lila.game.Game
|
||||
|
||||
case class UserRecord(
|
||||
|
|
|
@ -2,7 +2,7 @@ package lila.practice
|
|||
|
||||
import play.api.libs.json._
|
||||
|
||||
import lila.common.PimpedJson._
|
||||
import lila.common.Json._
|
||||
import lila.study.JsonView._
|
||||
|
||||
object JsonView {
|
||||
|
|
|
@ -3,12 +3,12 @@ package lila.puzzle
|
|||
import akka.stream.scaladsl._
|
||||
import org.joda.time.DateTime
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
import reactivemongo.akkastream.{ AkkaStreamCursor, cursorProducer }
|
||||
import reactivemongo.api.ReadPreference
|
||||
import scala.concurrent.duration._
|
||||
|
||||
import lila.common.config.MaxPerSecond
|
||||
import lila.common.Json.jodaWrites
|
||||
import lila.db.AsyncColl
|
||||
import lila.db.dsl._
|
||||
import lila.user.User
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
package lila.relay
|
||||
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
|
||||
import lila.common.Json.jodaWrites
|
||||
|
||||
final class JsonView(markup: RelayMarkup) {
|
||||
|
||||
|
|
|
@ -2,10 +2,10 @@ package lila.round
|
|||
|
||||
import org.joda.time.DateTime
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
|
||||
import chess.format.Uci
|
||||
import chess.Move
|
||||
import lila.common.Json.jodaWrites
|
||||
import lila.game.Game
|
||||
|
||||
case class Forecast(
|
||||
|
|
|
@ -9,7 +9,7 @@ object Socket extends Socket {
|
|||
case class Sri(value: String) extends AnyVal with StringValue
|
||||
|
||||
val sriIso = lila.common.Iso.string[Sri](Sri.apply, _.value)
|
||||
implicit val sriFormat = lila.common.PimpedJson.stringIsoFormat(sriIso)
|
||||
implicit val sriFormat = lila.common.Json.stringIsoFormat(sriIso)
|
||||
|
||||
case class Sris(sris: Set[Sri])
|
||||
|
||||
|
@ -19,7 +19,7 @@ object Socket extends Socket {
|
|||
}
|
||||
|
||||
val socketVersionIso = lila.common.Iso.int[SocketVersion](SocketVersion.apply, _.value)
|
||||
implicit val socketVersionFormat = lila.common.PimpedJson.intIsoFormat(socketVersionIso)
|
||||
implicit val socketVersionFormat = lila.common.Json.intIsoFormat(socketVersionIso)
|
||||
implicit val socketVersionZero = Zero.instance[SocketVersion](SocketVersion(0))
|
||||
|
||||
case class GetVersion(promise: Promise[SocketVersion])
|
||||
|
|
|
@ -3,10 +3,9 @@ package lila.study
|
|||
import chess.format.{ Uci, UciCharPair, FEN }
|
||||
import chess.Pos
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
|
||||
import lila.common.LightUser
|
||||
import lila.common.PimpedJson._
|
||||
import lila.common.Json._
|
||||
import lila.socket.Socket.Sri
|
||||
import lila.tree.Node.Shape
|
||||
import lila.user.User
|
||||
|
|
|
@ -337,7 +337,7 @@ object StudySocket {
|
|||
}
|
||||
|
||||
object Data {
|
||||
import lila.common.PimpedJson._
|
||||
import lila.common.Json._
|
||||
import play.api.libs.functional.syntax._
|
||||
|
||||
def reading[A](o: JsValue)(f: A => Unit)(implicit reader: Reads[A]): Unit =
|
||||
|
|
|
@ -2,10 +2,10 @@ package lila.timeline
|
|||
|
||||
import org.joda.time.DateTime
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
import reactivemongo.api.bson._
|
||||
import scala.util.{ Try, Success, Failure }
|
||||
|
||||
import lila.common.Json.jodaWrites
|
||||
import lila.db.dsl._
|
||||
import lila.hub.actorApi.timeline._
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
package lila.tournament
|
||||
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
|
||||
import lila.user.LightUserApi
|
||||
import lila.rating.PerfType
|
||||
import lila.common.Json.jodaWrites
|
||||
|
||||
final class ApiJsonView(lightUserApi: LightUserApi) {
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package lila.tournament
|
||||
|
||||
import akka.stream.Materializer
|
||||
import akka.stream.scaladsl._
|
||||
import org.joda.time.DateTime
|
||||
import reactivemongo.akkastream.{ AkkaStreamCursor, cursorProducer }
|
||||
import reactivemongo.api.bson._
|
||||
|
@ -10,7 +12,7 @@ import lila.db.dsl._
|
|||
import lila.game.Game
|
||||
import lila.user.User
|
||||
|
||||
final class PairingRepo(coll: Coll) {
|
||||
final class PairingRepo(coll: Coll)(implicit mat: Materializer) {
|
||||
|
||||
def selectTour(tourId: Tournament.ID) = $doc("tid" -> tourId)
|
||||
def selectUser(userId: User.ID) = $doc("u" -> userId)
|
||||
|
@ -25,24 +27,33 @@ final class PairingRepo(coll: Coll) {
|
|||
|
||||
def byId(id: Tournament.ID): Fu[Option[Pairing]] = coll.ext.find($id(id)).uno[Pairing]
|
||||
|
||||
def recentByTour(tourId: Tournament.ID, nb: Int): Fu[Pairings] =
|
||||
coll.ext.find(selectTour(tourId)).sort(recentSort).list[Pairing](nb)
|
||||
|
||||
def lastOpponents(tourId: Tournament.ID, userIds: Iterable[User.ID], nb: Int): Fu[Pairing.LastOpponents] = coll.find(
|
||||
selectTour(tourId) ++ $doc("u" $in userIds),
|
||||
$doc("_id" -> false, "u" -> true).some
|
||||
).sort(recentSort).cursor[Bdoc]().fold(Map.empty[User.ID, User.ID], nb) { (acc, doc) =>
|
||||
~doc.getAsOpt[List[User.ID]]("u") match {
|
||||
case List(u1, u2) =>
|
||||
val acc1 = if (acc.contains(u1)) acc else acc.updated(u1, u2)
|
||||
if (acc.contains(u2)) acc1 else acc1.updated(u2, u1)
|
||||
}
|
||||
} map Pairing.LastOpponents.apply
|
||||
private[tournament] def lastOpponents(tourId: Tournament.ID, userIds: Iterable[User.ID], max: Int): Fu[Pairing.LastOpponents] =
|
||||
userIds.nonEmpty.?? {
|
||||
coll.find(
|
||||
selectTour(tourId) ++ $doc("u" $in userIds),
|
||||
$doc("_id" -> false, "u" -> true).some
|
||||
)
|
||||
.sort(recentSort)
|
||||
.batchSize(20)
|
||||
.cursor[Bdoc]()
|
||||
.documentSource()
|
||||
.take(max)
|
||||
.mapConcat(_.getAsOpt[List[User.ID]]("u").toList)
|
||||
.scan(Map.empty[User.ID, User.ID]) {
|
||||
case (acc, List(u1, u2)) =>
|
||||
val acc1 = if (acc.contains(u1)) acc else acc.updated(u1, u2)
|
||||
if (acc.contains(u2)) acc1 else acc1.updated(u2, u1)
|
||||
}
|
||||
.takeWhile(_.size < userIds.size)
|
||||
.toMat(Sink.lastOption)(Keep.right)
|
||||
.run
|
||||
.dmap(~_)
|
||||
} dmap Pairing.LastOpponents.apply
|
||||
|
||||
def opponentsOf(tourId: Tournament.ID, userId: User.ID): Fu[Set[User.ID]] = coll.find(
|
||||
selectTourUser(tourId, userId),
|
||||
$doc("_id" -> false, "u" -> true).some
|
||||
).list[Bdoc]().map {
|
||||
).list[Bdoc]().dmap {
|
||||
_.view.flatMap { doc =>
|
||||
~doc.getAsOpt[List[User.ID]]("u").find(userId!=)
|
||||
}.toSet
|
||||
|
@ -51,14 +62,14 @@ final class PairingRepo(coll: Coll) {
|
|||
def recentIdsByTourAndUserId(tourId: Tournament.ID, userId: User.ID, nb: Int): Fu[List[Tournament.ID]] = coll.find(
|
||||
selectTourUser(tourId, userId),
|
||||
$doc("_id" -> true).some
|
||||
).sort(recentSort).list[Bdoc](nb).map {
|
||||
).sort(recentSort).list[Bdoc](nb).dmap {
|
||||
_.flatMap(_.getAsOpt[Game.ID]("_id"))
|
||||
}
|
||||
|
||||
def playingByTourAndUserId(tourId: Tournament.ID, userId: User.ID): Fu[Option[Game.ID]] = coll.find(
|
||||
selectTourUser(tourId, userId) ++ selectPlaying,
|
||||
$doc("_id" -> true).some
|
||||
).sort(recentSort).uno[Bdoc].map {
|
||||
).sort(recentSort).uno[Bdoc].dmap {
|
||||
_.flatMap(_.getAsOpt[Game.ID]("_id"))
|
||||
}
|
||||
|
||||
|
@ -77,7 +88,7 @@ final class PairingRepo(coll: Coll) {
|
|||
coll.countSel(selectTour(tourId))
|
||||
|
||||
private[tournament] def countByTourIdAndUserIds(tourId: Tournament.ID): Fu[Map[User.ID, Int]] = {
|
||||
coll.aggregateList(maxDocs = 10_000) { framework =>
|
||||
coll.aggregateList(maxDocs = 10000) { framework =>
|
||||
import framework._
|
||||
Match(selectTour(tourId)) -> List(
|
||||
Project($doc("u" -> true, "_id" -> false)),
|
||||
|
@ -86,12 +97,12 @@ final class PairingRepo(coll: Coll) {
|
|||
Sort(Descending("nb"))
|
||||
)
|
||||
}.map {
|
||||
_.view.flatMap { doc =>
|
||||
doc.getAsOpt[User.ID]("_id") flatMap { uid =>
|
||||
doc.int("nb") map { uid -> _ }
|
||||
}
|
||||
}.toMap
|
||||
}
|
||||
_.view.flatMap { doc =>
|
||||
doc.getAsOpt[User.ID]("_id") flatMap { uid =>
|
||||
doc.int("nb") map { uid -> _ }
|
||||
}
|
||||
}.toMap
|
||||
}
|
||||
}
|
||||
|
||||
def removePlaying(tourId: Tournament.ID) = coll.delete.one(selectTour(tourId) ++ selectPlaying).void
|
||||
|
|
|
@ -21,7 +21,7 @@ private[tournament] final class PairingSystem(
|
|||
ranking: Ranking
|
||||
): Fu[Pairings] = {
|
||||
for {
|
||||
lastOpponents <- pairingRepo.lastOpponents(tour.id, users.all, Math.min(120, users.size * 4))
|
||||
lastOpponents <- pairingRepo.lastOpponents(tour.id, users.all, Math.min(300, users.size * 4))
|
||||
onlyTwoActivePlayers <- (tour.nbPlayers <= 20) ?? playerRepo.countActive(tour.id).map(2==)
|
||||
data = Data(tour, lastOpponents, ranking, onlyTwoActivePlayers)
|
||||
preps <- if (data.isFirstRound) evenOrAll(data, users)
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
package lila.user
|
||||
|
||||
import lila.rating.{ Perf, PerfType }
|
||||
import play.api.libs.json._
|
||||
import play.api.libs.json.JodaWrites._
|
||||
|
||||
import lila.common.Json.jodaWrites
|
||||
import lila.rating.{ Perf, PerfType }
|
||||
import User.{ PlayTime, LightPerf }
|
||||
|
||||
final class JsonView(isOnline: lila.socket.IsOnline) {
|
||||
|
|
|
@ -6,7 +6,7 @@ object Title {
|
|||
|
||||
implicit val titleIso = lila.common.Iso.string[Title](Title.apply, _.value)
|
||||
implicit val titleBsonHandler = lila.db.dsl.stringIsoHandler(Title.titleIso)
|
||||
implicit val titleJsonWrites = lila.common.PimpedJson.stringIsoWriter(Title.titleIso)
|
||||
implicit val titleJsonWrites = lila.common.Json.stringIsoWriter(Title.titleIso)
|
||||
|
||||
val LM = Title("LM")
|
||||
val BOT = Title("BOT")
|
||||
|
|
|
@ -51,7 +51,6 @@ object Dependencies {
|
|||
val libVersion = "2.8.0"
|
||||
val api = "com.typesafe.play" %% "play" % version
|
||||
val json = "com.typesafe.play" %% "play-json" % libVersion
|
||||
val joda = "com.typesafe.play" %% "play-json-joda" % libVersion
|
||||
}
|
||||
object kamon {
|
||||
val core = "io.kamon" %% "kamon-core" % "2.0.2"
|
||||
|
|
Loading…
Reference in New Issue