new daily puzzle
parent
1c169ac981
commit
c2d242ff0a
|
@ -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)
|
||||
|
|
|
@ -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 =>
|
||||
|
|
|
@ -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],
|
||||
|
|
|
@ -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()
|
||||
)(
|
||||
|
|
|
@ -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)
|
|
@ -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]
|
||||
|
||||
|
|
|
@ -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 = () => {
|
||||
|
|
|
@ -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 })
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue