예제 #1
0
        public IHttpActionResult Join(int id, GameModel model)
        {
            // MAKE SURE YOU ARE NOT THE CREATOR OF THE GAME!
            var currentUserId = this.User.Identity.GetUserId();

            var game = this.data.Games
                       .All()
                       .Where(g => g.State == GameState.WaitingForOpponent && g.RedPlayerId != currentUserId)
                       .FirstOrDefault();

            if (game == null)
            {
                return(NotFound());
            }

            var bluePlayer = this.data.Users.Find(currentUserId);

            game.BluePlayerId = currentUserId;
            game.BluePlayer   = bluePlayer;
            game.State        = GameState.TurnBlue;
            this.data.SaveChanges();

            this.Guess(game.Id, new GuessModel {
                Number = model.Number
            });
            var joinGameResultModel = new JoinGameModel(game.Name);

            // Send notification to the creator of the game about new player Joining his game
            string notificationMessage = bluePlayer.UserName + " joined your game " + game.Name;

            SendNotification(game.Id, currentUserId, "GameJoined", notificationMessage);

            return(Ok(joinGameResultModel));
        }
예제 #2
0
        public async Task JoinGame(JoinGameModel model)
        {
            var game = _games.Where(g => g.Id == model.GameId).FirstOrDefault();

            if (game == null)
            {
                throw new Exception("Game does not exist");
            }

            if (game.IsPasswordProtected() && (game.Password != model.GamePassword))
            {
                throw new Exception("Game password is invalid");
            }

            if (!game.IsWaitingForSecondPlayer())
            {
                throw new Exception("Game is in progress or over");
            }

            if (game.Players[0].UserId == GetUserIdByCurrentConnectionId())
            {
                throw new Exception("You cannot join your own game");
            }

            game.SetSecondPlayer(model.UserName, GetUserIdByCurrentConnectionId());

            game.Start();

            var allPlayersConnections = GetAllConnectionsByUsersIds(game.GetPlayersUsersIds());

            await SendMessageToClientsAsync("GameStart", allPlayersConnections, new GameStartMessage());

            await SendGamesAwaitingForSecondPlayerToAllClientsAsync();
        }
예제 #3
0
        public static void JoinGame(int userId, JoinGameModel gameModel)
        {
            ValidateGamePassword(gameModel.Password);
            ValidateUserNumber(gameModel.Number);

            var context = new BullsAndCowsEntities();

            using (context)
            {
                var game = GetGame(gameModel.Id, context);

                ValidateOpenGameStatus(game.GameStatus);

                if (game.Password != gameModel.Password)
                {
                    throw new ServerErrorException("Incorrect game password", "INV_GAME_AUTH");
                }

                var blueUser = GetUser(userId, context);
                game.BlueUser       = blueUser;
                game.BlueUserNumber = gameModel.Number;
                var fullGameStatus = context.GameStatuses.First(st => st.Status == GameStatusFull);
                game.GameStatus = fullGameStatus;

                MessageType gameJoinedMessageType = context.MessageTypes.First(mt => mt.Type == MessageTypeGameJoined);

                var msgText = string.Format(MessageTextJoinedGame, blueUser.Nickname, game.Title);

                SendMessage(msgText, game.RedUser, game, gameJoinedMessageType, context);

                context.SaveChanges();
            }
        }
        public bool JoinGame([FromBody] JoinGameModel model)
        {
            var game = _gameService.GetGame(model.GameId);

            game.AddPlayer(model.PlayerId);
            return(game.IsRunning);
        }
예제 #5
0
        public HttpResponseMessage JoinGame(string sessionKey, [FromBody] JoinGameModel gameModel)
        {
            var response = this.PerformOperation(() =>
            {
                var userId = UsersRepository.LoginUser(sessionKey);
                GamesRepository.JoinGame(userId, gameModel);
            });

            return(response);
        }
예제 #6
0
        public JsonResult JoinGame(JoinGameModel joinGameModel)
        {
            try
            {
                int gameId;
                int.TryParse(joinGameModel.GameId, out gameId);
                Game = Platform.GetGameInstanceById(gameId);

                lock (Game)
                {
                    if (Platform.IsUserLogged())
                    {
                        joinGameModel.Nick = User.Identity.Name;
                    }

                    joinGameModel.Validate();
                    Platform.GameAuthentication.CheckGamePassword(gameId, joinGameModel.Password);

                    if (!Platform.GameAuthentication.HasPermission(gameId))
                    {
                        Player player   = new Player(joinGameModel.Nick, Permission.TYPE.Normal);
                        int    playerId = Game.AddPlayer(player);
                        SaveGame(gameId);

                        Platform.GameAuthentication.AddPermission(gameId, playerId, joinGameModel.Nick, Crypto.HashPassword(joinGameModel.Password), Permission.TYPE.Normal);
                    }

                    return(Json(new Result(new { gameId = gameId }).AsSuccess()));
                }
            }
            catch (FormatException)
            {
                return(Json(new Result(Resources.Errors.InvalidGameId).AsFailure()));
            }
            catch (Error.ValidationException validation)
            {
                return(Json(validation.Result));
            }
            catch (Error.AppError ex)
            {
                return(Json(new Result(ex.Message).AsFailure()));
            }
        }
        public IHttpActionResult Join(JoinGameModel gameForJoin)
        {
            var currentUserId = this.userIdProvider.GetUserId();

            var game = this.data.Games
                       .All()
                       .Where(g => g.Id.ToString() == gameForJoin.GameId && g.FirstPlayerId != currentUserId)
                       .FirstOrDefault();

            if (game == null)
            {
                return(NotFound());
            }

            game.SecondPlayerId = currentUserId;
            game.State          = GameState.TurnX;
            this.data.SaveChanges();

            return(Ok(game.Id));
        }
예제 #8
0
        public async Task <IGame> Leave([FromBody] JoinGameModel model)
        {
            var player = await _playerService.GetPlayer(model.PlayerId);

            if (player == null)
            {
                throw new PlayerDoesNotExistException(model.PlayerId);
            }

            var game = await _gameService.GetGame(model.GameCode);

            var gameId = game.Id;

            var mustCancelRound = !game.CanLeaveWithoutRoundCancellation;
            var mustCancelGame  = game.Host.Id == model.PlayerId;

            var updatedGame = await _gameService.LeaveGame(game, player);

            await _gameNotifier.SendPlayerJoined(updatedGame);

            if (model.WasKicked)
            {
                await _gameNotifier.SendPlayerKicked(game.Id, player);
            }

            if (mustCancelGame)
            {
                await _gameNotifier.SendGameCancelled(gameId);
            }
            else if (mustCancelRound)
            {
                await _gameNotifier.SendRoundCancelled(updatedGame);
            }

            return(updatedGame);
        }
예제 #9
0
        public async Task <ActionResult <IGame> > Join([FromBody] JoinGameModel model)
        {
            var player = await _playerService.GetPlayer(model.PlayerId);

            if (player == null)
            {
                throw new ApiException("Player does not exist");
            }

            var game = await _gameService.GetGame(model.GameCode);

            try
            {
                var updatedGame = await _gameService.JoinGame(game, player);

                await _gameNotifier.SendPlayerJoined(updatedGame);

                return(Ok(updatedGame));
            }
            catch (PlayerWithSameNameAlreadyExistsException)
            {
                return(Conflict("Player with same name already exists in this game, please change your name to join."));
            }
        }
        public IHttpActionResult Join(JoinGameModel gameForJoin)
        {
            var currentUserId = this.userIdProvider.GetUserId();

            var game = this.data.Games
                .All()
                .Where(g => g.Id.ToString() == gameForJoin.GameId && g.FirstPlayerId != currentUserId)
                .FirstOrDefault();

            if (game == null)
            {
                return NotFound();
            }

            game.SecondPlayerId = currentUserId;
            game.State = GameState.TurnX;
            this.data.SaveChanges();

            return Ok(game.Id);
        }
예제 #11
0
 public async Task <GameResultModel> JoinGame([FromBody] JoinGameModel model)
 {
     return(_mapper.Map <Game, GameResultModel>(await _gameAppService.Join(model.Nickname, model.GameId)));
 }