From ec60369cc0c4de7eade5b57870e895fab2f4daeb Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Sat, 5 May 2012 13:27:51 +0200 Subject: [PATCH] Complete chess captcha implementation --- app/Captcha.scala | 13 ++++++++----- app/controllers/CaptchaC.scala | 6 ++---- app/controllers/LilaController.scala | 2 ++ chess/src/main/scala/Game.scala | 4 ++++ cli/src/main/scala/Main.scala | 1 + conf/routes | 3 ++- todo | 1 - 7 files changed, 19 insertions(+), 11 deletions(-) diff --git a/app/Captcha.scala b/app/Captcha.scala index 6d716a060c..33c8e6d077 100644 --- a/app/Captcha.scala +++ b/app/Captcha.scala @@ -14,16 +14,16 @@ final class Captcha(gameRepo: GameRepo) { gameRepo.findOneCheckmate map { gameOption ⇒ for { game ← gameOption toValid "No checkmate available" - chess = game.toChess - rewinded ← rewind(chess) - } yield (game.id, fen(rewinded), !chess.player) + rewinded ← rewind(game.toChess) + } yield (game.id, fen(rewinded), rewinded.player) } def solve(id: String): IO[Valid[NonEmptyList[String]]] = gameRepo game id map { gameOption ⇒ for { game ← gameOption toValid "No such game" - moves ← mateMoves(game.toChess).toNel toValid "No solution found" + rewinded ← rewind(game.toChess) + moves ← mateMoves(rewinded).toNel toValid "No solution found" } yield moves } @@ -38,7 +38,10 @@ final class Captcha(gameRepo: GameRepo) { lastMove ← game.board.history.lastMove toValid "No last move" (orig, dest) = lastMove rewindedBoard ← game.board.move(dest, orig) toValid "Can't rewind board" - } yield game withBoard rewindedBoard + g2 = game withBoard rewindedBoard + g3 = g2 withPlayer !game.player + g4 = g3 withTurns (game.turns - 1) + } yield g4 private def fen(game: Game): String = Forsyth >> game takeWhile (_ != ' ') } diff --git a/app/controllers/CaptchaC.scala b/app/controllers/CaptchaC.scala index acd1850d48..6aa8d9f4e0 100644 --- a/app/controllers/CaptchaC.scala +++ b/app/controllers/CaptchaC.scala @@ -19,11 +19,9 @@ object CaptchaC extends LilaController { } def solve(gameId: String) = Action { - env.captcha.solve(gameId).unsafePerformIO.fold( + env.captcha.solve(gameId).unsafePerformIO.pp.fold( err ⇒ BadRequest(err.shows), - moves ⇒ JsonOk(Map( - "moves" -> moves - )) + moves ⇒ JsonOk(moves.list) ) } } diff --git a/app/controllers/LilaController.scala b/app/controllers/LilaController.scala index e0212be3c6..43b93f7ee5 100644 --- a/app/controllers/LilaController.scala +++ b/app/controllers/LilaController.scala @@ -16,6 +16,8 @@ trait LilaController extends Controller with ContentTypes with RequestGetter { def JsonOk(map: Map[String, Any]) = Ok(Json generate map) as JSON + def JsonOk(list: List[String]) = Ok(Json generate list) as JSON + def JsonIOk(map: IO[Map[String, Any]]) = JsonOk(map.unsafePerformIO) def ValidOk(valid: Valid[Unit]) = valid.fold( diff --git a/chess/src/main/scala/Game.scala b/chess/src/main/scala/Game.scala index 05058b5d8c..b28c27b2a4 100644 --- a/chess/src/main/scala/Game.scala +++ b/chess/src/main/scala/Game.scala @@ -52,4 +52,8 @@ case class Game( def withBoard(b: Board) = copy(board = b) def updateBoard(f: Board => Board) = withBoard(f(board)) + + def withPlayer(c: Color) = copy(player = c) + + def withTurns(t: Int) = copy(turns = t) } diff --git a/cli/src/main/scala/Main.scala b/cli/src/main/scala/Main.scala index 64bf35d008..b5ec0ec409 100644 --- a/cli/src/main/scala/Main.scala +++ b/cli/src/main/scala/Main.scala @@ -20,6 +20,7 @@ object Main { val command: Command = args.toList match { case "info" :: Nil ⇒ Info(env) + case "average-elo" :: Nil ⇒ AverageElo(env) case "index" :: Nil ⇒ IndexDb(env.gameRepo) case "finish" :: Nil ⇒ new Command { def apply() = env.gameFinishCommand.apply() diff --git a/conf/routes b/conf/routes index 4f08502854..54b0380650 100644 --- a/conf/routes +++ b/conf/routes @@ -20,8 +20,9 @@ POST /api/rematch-accept/:gameId/:color/:newGameId lila.controllers.AppApiC.re POST /api/adjust/:username lila.controllers.AppApiC.adjust(username: String) GET /api/activity/:gameId/:color lila.controllers.AppApiC.activity(gameId: String, color: String) GET /api/game-version/:gameId lila.controllers.AppApiC.gameVersion(gameId: String) + GET /api/captcha/create lila.controllers.CaptchaC.create -GET /api/captcha/solve lila.controllers.CaptchaC.solve(gameId: String) +GET /api/captcha/solve/:gameId lila.controllers.CaptchaC.solve(gameId: String) # Lobby Public API GET /lobby/cancel/:ownerId lila.controllers.LobbyC.cancel(ownerId: String) diff --git a/todo b/todo index 9594da8abb..644fb7a0c3 100644 --- a/todo +++ b/todo @@ -9,5 +9,4 @@ registered user disconnection delay better spam protection than anon + http bad visibility of online indicators during game force resign -0x1 cannot post in chat post
in chat