コード例 #1
0
        public void Excecute(ClientObject client, ServerObject server, RoomObject room, string packet = "")
        {
            room.Game.StopAnswerTimer();
            Console.WriteLine("Check answer");
            var request  = JsonConvert.DeserializeObject <CheckAnswerRequest>(packet);
            var response = new CheckAnswerResponse();

            response.Status = DB.CheckAnswer(request.Question);
            Console.WriteLine($"Answer status: {response.Status }");
            int points = 0;

            if (response.Status == ResponseStatus.Ok)
            {
                points        = request.Question.Points;
                room.Selector = client;
                //очищаем клиентов ответивших не верно
                room.Game.RemoveQuestionFromTable(request.Question.Id);
                room.Respondents.Clear();

                NotifyPlayersAboutUpdateRoom(client, room, UpdateRoomType.UpdateTable);
                room.Game.StopAnswerButtonClickTimer();
            }
            else
            {
                points = request.Question.Points * -1;
                room.Game.listClickButton.Add(client);
                room.Respondents.Add(client);
                //если все ответили не верно, назначаем селектором первого игрока
                if (room.Clients.Count == room.Respondents.Count)
                {
                    room.Game.RemoveQuestionFromTable(request.Question.Id);
                    if (room.Clients.Count != 0)
                    {
                        room.Selector = room.Clients.First();
                    }
                    room.Respondents.Clear();
                    NotifyPlayersAboutUpdateRoom(client, room, UpdateRoomType.UpdateTable);
                    room.Game.StopAnswerButtonClickTimer();
                }
                else
                {
                    room.Game.StartAnswerButtonClickTimer();
                }

                if (room.Respondents.Count != 0)
                {
                    //обновляем статус кнопки ответа для всех игроков
                    ChangeAnswerButtonPropertyForPlayers(room);
                }
            }

            client.UpdatePoints(points);
            string packetResponse = JsonConvert.SerializeObject(response);

            room.SendMessageToDefiniteClient(packetResponse, client);
            //отправляем уведомление об обновлении счета игрока
            NotifyPlayersAboutUpdateRoom(client, room, UpdateRoomType.UpdatePlayers);
        }
コード例 #2
0
        public override void Execute(string packet)
        {
            CheckAnswerResponse checkAnswerResponse = JsonConvert.DeserializeObject <CheckAnswerResponse>(packet);
            // (ClientObject.view as GameViewModel).UpdatePoints(checkAnswerResponse.Player);
            GameViewModel gvm = (ClientObject.view as GameViewModel);


            switch (checkAnswerResponse.Status)
            {
            case ResponseStatus.Ok:
                //gvm.BlockAnswerButton(true);

                //(ClientObject.view as GameViewModel).UpdatePoints(checkAnswerResponse.Player);
                //(ClientObject.view as GameViewModel).Status = "Был введён неверный пароль";
                break;

            case ResponseStatus.Bad:
                // (ClientObject.view as GameViewModel).Status = "Пользователь с таким логином уже играет";
                break;
            }
        }
コード例 #3
0
        public IActionResult CheckAnswer([FromBody] string answer)
        {
            var now = DateTime.Now;
            var sessionCookieData =
                Request.Cookies.Get <SessionCookieData>(Strings.SessionDataCookieName, _dataProtectionProvider);

            if (sessionCookieData == null)
            {
                return(BadRequest(new CheckAnswerResponse(13, "No session cookie found.")));
            }

            var game = _gameRepository.GetById(sessionCookieData.GameId);
            var lastResponseCheck = sessionCookieData.LastResponseCheck;

            sessionCookieData.LastResponseCheck = now;

            // Check rate limit, wait 5 seconds before rechecking
            if (now - lastResponseCheck < TimeSpan.FromSeconds(5))
            {
                Response.Cookies.Set(Strings.SessionDataCookieName, sessionCookieData, _dataProtectionProvider);
                return(BadRequest(new ErrorResponse(144, "Exceeding check rate limit.")));
            }

            if (game == null)
            {
                Response.Cookies.Set(Strings.SessionDataCookieName, sessionCookieData, _dataProtectionProvider);
                return(BadRequest(new ErrorResponse(39, "Unknown game id.")));
            }

            var gameSession = _gameSessionRepository.GetById(sessionCookieData.Id);

            if (gameSession.State == GameState.Passed || gameSession.State == GameState.Stopped)
            {
                return(BadRequest(new ErrorResponse(3, "Already passed or stopped this game session.")));
            }

            gameSession.Responses.Add(now, answer);
            var response = new CheckAnswerResponse(2, $"Incorrect, penalty time ({game.PenaltySeconds}s) applied.");

            if (game.CheckResponse(answer))
            {
                response.Code               = 42;
                response.Message            = "Correct";
                gameSession.FinishTime      = now;
                gameSession.State           = GameState.Passed;
                sessionCookieData.GameState = GameState.Passed;
            }
            else
            {
                sessionCookieData.TotalPenaltySeconds += game.PenaltySeconds;
                gameSession.TotalPenaltySeconds        = sessionCookieData.TotalPenaltySeconds;
            }

            _gameSessionRepository.Update(gameSession);

            response.TotalPenaltySecondsApplied = sessionCookieData.TotalPenaltySeconds;
            response.RemainingSeconds           =
                game.GetRemainingSeconds(sessionCookieData.StartTime, now, sessionCookieData.TotalPenaltySeconds);
            Response.Cookies.Set(Strings.SessionDataCookieName, sessionCookieData, _dataProtectionProvider);
            return(Ok(response));
        }