public override async Task GameStatus(GameStatusRequest request, IServerStreamWriter <GameStatusResponse> responseStream, ServerCallContext context)
        {
            var apiRequest = new GameApi.Proto.GameStatusRequest()
            {
                MatchId       = request.MatchId,
                Username      = request.Username,
                TwitterLogged = request.TwitterLogged
            };

            using var stream = _multiplayerGameManagerClient.GameStatus(apiRequest);

            while (await stream.ResponseStream.MoveNext(context.CancellationToken))
            {
                var response = stream.ResponseStream.Current;
                await responseStream.WriteAsync(new GameStatusResponse
                {
                    Challenger     = response.Challenger,
                    ChallengerPick = response.ChallengerPick,
                    User           = response.User,
                    UserPick       = response.UserPick,
                    Result         = (Result)(int)response.Result,
                    IsFinished     = response.IsFinished,
                    IsCancelled    = response.IsCancelled,
                    IsMaster       = response.IsMaster
                });
            }
        }
Esempio n. 2
0
        public async Task <ResultDto> GameStatus(string matchId, string username, bool isTwitterUser, Action <ResultDto> gameListener)
        {
            var request = new GameStatusRequest()
            {
                MatchId       = matchId,
                Username      = username,
                TwitterLogged = isTwitterUser
            };

            var channel = GrpcChannel.ForAddress(_serverUrl);
            var client  = new MultiplayerGameManager.MultiplayerGameManagerClient(channel);

            using var stream = client.GameStatus(request, GetRequestMetadata());
            ResultDto resultDto = null;

            while (await stream.ResponseStream.MoveNext(CancellationToken.None))
            {
                var response = stream.ResponseStream.Current;
                resultDto = new ResultDto
                {
                    Challenger      = response.Challenger,
                    ChallengerPick  = response.ChallengerPick,
                    User            = response.User,
                    UserPick        = response.UserPick,
                    Result          = (int)response.Result,
                    IsValid         = true,
                    IsFinished      = response.IsFinished,
                    IsGameInitiator = response.IsMaster
                };

                gameListener(resultDto);
            }

            return(resultDto);
        }
Esempio n. 3
0
        public GameStatusResponse CheckGameStatus(GameStatusRequest request)
        {
            // Validate request, you will never know again, again and again
            if (request.GameId == Guid.Empty)
            {
                return(new GameStatusResponse
                {
                    IsSuccessful = false,
                    Error = new ResponseError
                    {
                        ErrorCode = HttpStatusCode.BadRequest,
                        Description = HttpStatusCode.BadRequest.ToString()
                    }
                });
            }

            // Validate Game exists
            var game = this.games.FirstOrDefault(item => item.Id == request.GameId);

            return(new GameStatusResponse
            {
                IsSuccessful = true,
                Status = game.IsFinished ? CheckResult(game.FirstPlayer.Move, game.SecondPlayer.Move) : game.Status
            });
        }
Esempio n. 4
0
        public void GameStatusRequest_Correct_ObjectCreated()
        {
            // Arrange
            var gameStatusRequest = new GameStatusRequest
            {
                GameId = this.gameGuid
            };

            // Act
            // Assert
            Assert.Equal(this.gameGuid, gameStatusRequest.GameId);
        }
        public void GetGameStatus_CorrectId_ReturnOk()
        {
            // Arrange
            var gameStatusRequest = new GameStatusRequest
            {
                GameId = Guid.NewGuid()
            };

            // Act
            var gameStatusResponse = this.gameService.CheckGameStatus(gameStatusRequest);

            // Assert
            Assert.False(gameStatusResponse.IsSuccessful);
            Assert.Equal(HttpStatusCode.BadRequest, gameStatusResponse.Error.ErrorCode);
        }
        public IActionResult Move(GameStatusRequest gameStatusRequest)
        {
            var direction = new List <string> {
                "down", "left", "right", "up"
            };
            var rng = new Random();

            var response = new MoveResponse
            {
                Move  = direction[rng.Next(direction.Count)],
                Shout = "I am moving!"
            };

            return(Ok(response));
        }
Esempio n. 7
0
        public ActionResult <Game> Get(Guid gameId)
        {
            var gameStatusRequest = new GameStatusRequest
            {
                GameId = gameId
            };

            var gameStatusResponse = this.gameService.CheckGameStatus(gameStatusRequest);

            if (gameStatusResponse?.IsSuccessful == false)
            {
                return(this.BadRequest(gameStatusResponse));
            }

            return(this.Ok(gameStatusResponse));
        }
        public override async Task GameStatus(GameStatusRequest request, IServerStreamWriter <GameStatusResponse> responseStream, ServerCallContext context)
        {
            var username = GetUsername(request.Username, request.TwitterLogged);
            var dto      = await _repository.GetMatch(request.MatchId);

            while (!context.CancellationToken.IsCancellationRequested && (dto == null || (dto.PlayerName == UnknownUser && dto.Challenger.Name == UnknownUser)))
            {
                await Task.Delay(_multiplayerSettings.GameStatusUpdateDelay);

                dto = await _repository.GetMatch(request.MatchId);
            }

            var isMaster   = dto.PlayerName == username;
            var gameStatus = isMaster ? CreateGameStatusForMaster(dto) : CreateGameStatusForOpponent(dto);
            await responseStream.WriteAsync(gameStatus);

            _logger.LogDebug($"{username} -> Updated {gameStatus.User} vs {gameStatus.Challenger} /{gameStatus.UserPick}-{gameStatus.ChallengerPick}/");
            while (!context.CancellationToken.IsCancellationRequested && gameStatus.Result == Result.Pending)
            {
                await Task.Delay(_multiplayerSettings.GameStatusUpdateDelay);

                dto = await _repository.GetMatch(request.MatchId);

                if (dto == null)
                {
                    _logger.LogDebug($"{username} -> dto is null");
                    await responseStream.WriteAsync(_cancelledMatch);

                    return;
                }

                var matchExpired = DateTime.UtcNow.AddSeconds(-_multiplayerSettings.GameStatusMaxWait) > dto.WhenUtc;
                if (isMaster && matchExpired)
                {
                    _logger.LogDebug($"{username} -> match expired");
                    await _repository.DeleteMatch(request.MatchId);

                    await responseStream.WriteAsync(_cancelledMatch);

                    return;
                }

                gameStatus = isMaster ? CreateGameStatusForMaster(dto) : CreateGameStatusForOpponent(dto);
                _logger.LogDebug($"{username} -> Updated {gameStatus.User} vs {gameStatus.Challenger} /{gameStatus.UserPick}-{gameStatus.ChallengerPick}/");
                await responseStream.WriteAsync(gameStatus);
            }
        }
        public void GetGameStatus_InvalidId_ReturnBadRequest()
        {
            // Arrange

            var createGameResponse = this.gameService.CreateGameProfile();
            var gameStatusRequest  = new GameStatusRequest
            {
                GameId = createGameResponse.GameId
            };

            // Act
            var gameStatusResponse = this.gameService.CheckGameStatus(gameStatusRequest);

            // Assert
            Assert.True(gameStatusResponse.IsSuccessful);
            Assert.Equal(GameStatus.Created, gameStatusResponse.Status);
        }
 public IActionResult End(GameStatusRequest gameStatusRequest)
 {
     return(Ok());
 }
        static void Main(string[] args)
        {
            Console.WriteLine("Welcome to Rock, Paper, Scissors Game!");
            Console.WriteLine("You are playing this game with Computer.");
            Console.WriteLine("PLayer , what is your name? : ");
            var player1Name = Console.ReadLine();
            var player2Name = "Computer";

            GameService gameService = new GameService();
            var         gameProfile = gameService.CreateGameProfile(); //Create Game Profile

            // Registration of 1nd player in Team
            JoinTeam player1 = new JoinTeam
            {
                Player = new Model.Player
                {
                    Id   = new Guid(),
                    Name = player1Name
                }
            };

            gameService.JoinTeam(player1);

            // Registration of 2nd player in Team
            JoinTeam player2 = new JoinTeam
            {
                Player = new Model.Player
                {
                    Id   = new Guid(),
                    Name = player2Name
                }
            };

            gameService.JoinTeam(player2);


            Console.WriteLine("Welcome {0} and {1}", player1Name, player2Name);
            Console.WriteLine("{0}, Please pick Rock, Paper, or Scissors. Press 1 for Rock, 2 for Paper, 3 for Scissors", player1Name);
            int input = Convert.ToInt32(Console.ReadLine());

            PlayGameRequest playGameRequest = new PlayGameRequest
            {
                PlayerName = player1Name,
                NextMove   = (Enums.MoveType)input
            };
            var gameResponse = gameService.StartMove(playGameRequest);

            Random          random            = new Random();
            int             secondInput       = random.Next(1, 3);
            PlayGameRequest secondGameRequest = new PlayGameRequest
            {
                PlayerName = player2Name,
                NextMove   = (Enums.MoveType)secondInput
            };
            var secondGameResponse = gameService.StartMove(secondGameRequest);

            //Moves done and calculate Result
            if (gameResponse.IsSuccessful && secondGameResponse.IsSuccessful)
            {
                GameStatusRequest gameStatusRequest = new GameStatusRequest
                {
                    GameId = gameProfile.GameId
                };
                var result = gameService.CheckGameStatus(gameStatusRequest);
                if (result.IsSuccessful)
                {
                    Console.WriteLine("==================================");
                    if (result.Status == Enums.GameStatus.PlayerOneWon)
                    {
                        Console.WriteLine("Player : " + player1Name + " is the winner");
                    }
                    else if (result.Status == Enums.GameStatus.PlayerTwoWon)
                    {
                        Console.WriteLine("Player : " + player2Name + " is the winner");
                    }
                    else
                    {
                        Console.WriteLine("Player : " + result.Status);
                    }
                }
            }
            Console.WriteLine("Press any key to exit.");
        }