public IActionResult PostCreateMove([FromBody] Validators.Move move) { Result result = this.CreateMove(move); if (result.ResultFunc == this.Ok) { PusherServer.Pusher pusher = Pusher.Pusher.Create(); pusher.TriggerAsync(channelName: this.PRIVATE_GAME_CHANNELNAME + ((GameData)result.Data).id, eventName: "create_move", data: result.Data, options: new TriggerOptions() { SocketId = move.socket_id }); } return(result.ResultFunc(result.Data)); }
public Result CreateMove(Validators.Move move) { if (ModelState.IsValid == false) { return(new Result { ResultFunc = this.BadRequest, Data = "Incorrect post data." }); } //Check if game exists. Game game = this.db.Games.Where(x => x.id == move.game_id).Include(x => x.User1).Include(x => x.User2).Include(x => x.Moves).SingleOrDefault(); if (game == null) { return(new Result { ResultFunc = this.BadRequest, Data = "Game does not exist." }); } //Check if the user is a player of this game. User user = (User)HttpContext.Items["user"]; if (game.User1 != user && game.User2 != user) { return(new Result { ResultFunc = this.BadRequest, Data = "This is not your game." }); } //Check if the game has started. if (game.status != GameStatus.started) { switch (game.status) { case GameStatus.waiting_invite: case GameStatus.waiting_join: return(new Result { ResultFunc = this.BadRequest, Data = "This game hasn't started yet." }); case GameStatus.canceled: case GameStatus.finished: return(new Result { ResultFunc = this.BadRequest, Data = "This game has finished." }); } } //Check if it's his turn. if (user != this.DecideTurn(game)) { return(new Result { ResultFunc = this.BadRequest, Data = "It's not your turn." }); } //Check if turn is valid(Position not already chosen). if (CheckPosition(game, move.position) == false) { return(new Result { ResultFunc = this.BadRequest, Data = "Position already chosen." }); } int move_count = this.db.Moves.Where(x => x.game_id == game.id).ToList().Count; //If move_count == 8 then this means this is the last set. So the game has been finished and it's a tie. //If it's not a tie, this is possible when the last move(count == 8). Then the winner will be set at winning move check. if (move_count == 8) { game.status = GameStatus.finished; game.finished_at = DateTime.Now; } this.db.Add(new Move { user_id = user.id, game_id = game.id, position = move.position, move_count = move_count }); this.db.SaveChanges(); //Check if it's a winning move. User winner; if ((winner = this.CheckGameForWin(game)) != null) { game.status = GameStatus.finished; game.finished_at = DateTime.Now; game.UserWinner = winner; this.db.SaveChanges(); } return(new Result { ResultFunc = this.Ok, Data = this.FilterGameResults(game) }); }