write joda DateTimes as JSON numbers

scapegoat
Thibault Duplessis 2019-12-07 18:43:22 -06:00
parent fd0469b624
commit d78b426838
35 changed files with 104 additions and 84 deletions

View File

@ -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(

View File

@ -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

View File

@ -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(

View File

@ -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

View File

@ -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 }

View File

@ -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._

View File

@ -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 }

View File

@ -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 }

View File

@ -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 {

View File

@ -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)
}
}

View File

@ -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(" ", "")
}

View File

@ -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 {

View File

@ -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._

View File

@ -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

View File

@ -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) {

View File

@ -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

View File

@ -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 {

View File

@ -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 {

View File

@ -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

View File

@ -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) {

View File

@ -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(

View File

@ -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 {

View File

@ -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

View File

@ -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) {

View File

@ -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(

View File

@ -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])

View File

@ -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

View File

@ -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 =

View File

@ -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._

View File

@ -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) {

View File

@ -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

View File

@ -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)

View File

@ -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) {

View File

@ -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")

View File

@ -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"