new daily puzzle

pull/7691/head
Thibault Duplessis 2020-12-06 20:16:11 +01:00
parent 1c169ac981
commit c2d242ff0a
8 changed files with 26 additions and 25 deletions

View File

@ -126,7 +126,7 @@ final class Env(
lazy val gamePaginator = wire[mashup.GameFilterMenu.PaginatorBuilder]
lazy val pageCache = wire[http.PageCache]
private val tryDailyPuzzle: lila.puzzle.Daily.Try = () =>
private val tryDailyPuzzle: lila.puzzle.DailyPuzzle.Try = () =>
Future {
puzzle.daily.get
}.flatMap(identity)

View File

@ -13,7 +13,7 @@ final private[app] class Renderer extends Actor {
case lila.tv.actorApi.RenderFeaturedJs(game) =>
sender() ! V.game.mini.noCtx(Pov naturalOrientation game, tv = true).render
case lila.puzzle.RenderDaily(puzzle, fen, lastMove) =>
case lila.puzzle.DailyPuzzle.Render(puzzle, fen, lastMove) =>
sender() ! V.puzzle.bits.daily(puzzle, fen, lastMove).render
case streams: lila.streamer.LiveStreams.WithTitles =>

View File

@ -22,7 +22,7 @@ final class Preload(
tourWinners: lila.tournament.WinnersApi,
timelineApi: lila.timeline.EntryApi,
liveStreamApi: lila.streamer.LiveStreamApi,
dailyPuzzle: lila.puzzle.Daily.Try,
dailyPuzzle: lila.puzzle.DailyPuzzle.Try,
lobbyApi: lila.api.LobbyApi,
lobbySocket: lila.lobby.LobbySocket,
playbanApi: lila.playban.PlaybanApi,
@ -120,7 +120,7 @@ object Preload {
featured: Option[Game],
leaderboard: List[User.LightPerf],
tournamentWinners: List[Winner],
puzzle: Option[lila.puzzle.DailyPuzzle],
puzzle: Option[lila.puzzle.DailyPuzzle.Html],
streams: LiveStreams.WithTitles,
lastPost: List[lila.blog.MiniPost],
playban: Option[TempBan],

View File

@ -12,7 +12,7 @@ object embed {
import EmbedConfig.implicits._
def apply(daily: DailyPuzzle)(implicit config: EmbedConfig) =
def apply(daily: DailyPuzzle.Html)(implicit config: EmbedConfig) =
views.html.base.embed(
title = "lichess.org chess puzzle",
cssModule = "tv.embed"
@ -25,7 +25,7 @@ object embed {
jsModule("puzzle.embed")
)
def dailyLink(daily: DailyPuzzle)(implicit lang: Lang) = a(
def dailyLink(daily: DailyPuzzle.Html)(implicit lang: Lang) = a(
href := routes.Puzzle.daily(),
title := trans.puzzle.clickToSolve.txt()
)(

View File

@ -8,7 +8,7 @@ import scala.concurrent.duration._
import lila.db.dsl._
import lila.memo.CacheApi._
final private[puzzle] class Daily(
final private[puzzle] class DailyPuzzle(
colls: PuzzleColls,
renderer: lila.hub.actors.Renderer,
cacheApi: lila.memo.CacheApi
@ -17,14 +17,14 @@ final private[puzzle] class Daily(
import BsonHandlers._
private val cache =
cacheApi.unit[Option[DailyPuzzle]] {
cacheApi.unit[Option[DailyPuzzle.Html]] {
_.refreshAfterWrite(30 minutes)
.buildAsyncFuture(_ => find)
}
def get: Fu[Option[DailyPuzzle]] = cache.getUnit
def get: Fu[Option[DailyPuzzle.Html]] = cache.getUnit
private def find: Fu[Option[DailyPuzzle]] =
private def find: Fu[Option[DailyPuzzle.Html]] =
(findCurrent orElse findNew) recover { case e: Exception =>
logger.error("find daily", e)
none
@ -33,10 +33,10 @@ final private[puzzle] class Daily(
case None => fuccess(none)
}
private def makeDaily(puzzle: Puzzle): Fu[Option[DailyPuzzle]] = {
private def makeDaily(puzzle: Puzzle): Fu[Option[DailyPuzzle.Html]] = {
import makeTimeout.short
renderer.actor ? RenderDaily(puzzle, puzzle.fenAfterInitialMove, puzzle.line.head.uci) map {
case html: String => DailyPuzzle(html, puzzle.color, puzzle.id).some
renderer.actor ? DailyPuzzle.Render(puzzle, puzzle.fenAfterInitialMove, puzzle.line.head.uci) map {
case html: String => DailyPuzzle.Html(html, puzzle.color, puzzle.id).some
}
} recover { case e: Exception =>
logger.warn("make daily", e)
@ -66,10 +66,10 @@ final private[puzzle] class Daily(
}
}
object Daily {
type Try = () => Fu[Option[DailyPuzzle]]
object DailyPuzzle {
type Try = () => Fu[Option[DailyPuzzle.Html]]
case class Html(html: String, color: chess.Color, id: Puzzle.Id)
case class Render(puzzle: Puzzle, fen: chess.format.FEN, lastMove: String)
}
case class DailyPuzzle(html: String, color: chess.Color, id: Puzzle.Id)
case class RenderDaily(puzzle: Puzzle, fen: chess.format.FEN, lastMove: String)

View File

@ -67,7 +67,7 @@ final class Env(
lazy val forms = PuzzleForm
lazy val daily = wire[Daily]
lazy val daily = wire[DailyPuzzle]
lazy val activity = wire[PuzzleActivity]

View File

@ -1,11 +1,12 @@
import { storedJsonProp } from 'common/storage';
import { ThemeKey } from './interfaces';
interface SessionRound {
id: string;
result?: boolean;
}
interface Store {
theme: string;
theme: ThemeKey;
rounds: SessionRound[];
at: number;
}
@ -15,7 +16,7 @@ export default class PuzzleSession {
maxSize = 100;
maxAge = 1000 * 3600;
constructor(readonly theme: string) {
constructor(readonly theme: ThemeKey) {
}
default = () => ({
@ -25,7 +26,7 @@ export default class PuzzleSession {
});
store = storedJsonProp<Store>('puzzle.session', this.default);
clear = () => this.update(s => ({ ...s, rounds: [] }));
get = () => {

View File

@ -2,8 +2,8 @@ import * as xhr from 'common/xhr';
import { PuzzleResult, ThemeKey } from './interfaces';
import {defined} from 'common';
export function complete(puzzleId: string, theme: ThemeKey | undefined, win: boolean): Promise<PuzzleResult | undefined> {
return xhr.json(`/training/complete/${theme || "any"}/${puzzleId}`, {
export function complete(puzzleId: string, theme: ThemeKey, win: boolean): Promise<PuzzleResult | undefined> {
return xhr.json(`/training/complete/${theme}/${puzzleId}`, {
method: 'POST',
body: xhr.form({ win: win ? 1 : 0 })
});