예제 #1
0
        public RetrieveScoreBoardForGameOutput RetrieveScoreBoardForGame(RetrieveScoreBoardForGameInput input)
        {
            Game gameEntity = GameRepository.FirstOrDefault(r => r.Id == input.GameId);

            if (gameEntity == null || !GamePolicy.CanRetrieveEntityLight(gameEntity))
            {
                return(new RetrieveScoreBoardForGameOutput());
            }

            TeamGameTaskStatisticRepository.Includes.Add(r => r.Team);
            TeamGameTaskStatisticRepository.Includes.Add(r => r.GameTask);

            IList <TeamGameTaskStatistic> teamGameTaskStatistics = TeamGameTaskStatisticRepository.GetAll()
                                                                   .Where(r => r.GameTask.GameId == input.GameId)
                                                                   .ToList();

            IList <ScoreBoardDataDto> scoreBoardData = CalculateScoreBoardData(teamGameTaskStatistics);

            TeamGameTaskStatisticRepository.Includes.Clear();

            return(new RetrieveScoreBoardForGameOutput()
            {
                ScoreBoardData = scoreBoardData
            });
        }
예제 #2
0
        public RetrieveGameTaskResultsOutput RetrieveGameTaskResults(RetrieveGameTaskResultsInput input)
        {
            Game gameEntity = GameRepository.FirstOrDefault(r => r.Id == input.GameId);

            if (gameEntity == null || !GamePolicy.CanRetrieveEntityLight(gameEntity))
            {
                return(new RetrieveGameTaskResultsOutput()
                {
                    TeamGameTaskStatistics = new List <TeamGameTaskStatisticDto>()
                });
            }

            TeamGameTaskStatisticRepository.Includes.Add(r => r.Team);
            TeamGameTaskStatisticRepository.Includes.Add(r => r.GameTask);

            IList <TeamGameTaskStatisticDto> teamGameTaskStatistics = TeamGameTaskStatisticRepository.GetAll()
                                                                      .Where(r => r.GameTask.GameId == input.GameId)
                                                                      .ToList()
                                                                      .MapIList <TeamGameTaskStatistic, TeamGameTaskStatisticDto>();

            TeamGameTaskStatisticRepository.Includes.Clear();

            return(new RetrieveGameTaskResultsOutput()
            {
                TeamGameTaskStatistics = teamGameTaskStatistics
            });
        }
예제 #3
0
        public RetrieveGameLightTasksOutput RetrieveGameLightTasks(RetrieveGameLightTasksInput input)
        {
            GameRepository.Includes.Add(r => r.GameTasks);
            GameRepository.Includes.Add(r => r.GameTasks.Select(e => e.GameTaskType));
            GameRepository.Includes.Add(r => r.GameTasks.Select(e => e.Conditions));
            GameRepository.Includes.Add(r => r.GameTasks.Select(e => e.Tips));
            GameRepository.Includes.Add(r => r.GameTasks.Select(e => e.Conditions.Select(k => k.ConditionType)));

            Game gameEntity = GameRepository.Get(input.GameId);

            if (gameEntity == null || !GamePolicy.CanRetrieveEntityLight(gameEntity))
            {
                return(new RetrieveGameLightTasksOutput());
            }

            IList <GameTaskLightDto> gameTasks = gameEntity.GameTasks
                                                 .Where(r => r.IsActive)
                                                 .OrderBy(r => r.Order)
                                                 .ToList().MapIList <GameTask, GameTaskLightDto>().ToList();

            UserRepository.Includes.Add(r => r.PlayerCareers);

            long?currentUserTeamId = UserRepository.Get(Session.UserId ?? 0).CurrentPlayerTeamId;

            if (currentUserTeamId == null)
            {
                return(new RetrieveGameLightTasksOutput()
                {
                    Game = gameEntity.MapTo <GameLightDto>(),
                    GameTasks = gameTasks,
                });
            }

            TeamGameTaskStatisticRepository.Includes.Add(r => r.GameTask);

            IList <long> completedGameTaskIds = TeamGameTaskStatisticRepository.GetAll()
                                                .Where(r => r.GameTask.GameId == input.GameId && r.TeamId == currentUserTeamId)
                                                .Select(r => r.GameTaskId)
                                                .ToList();

            long?inProgressGameTaskId = gameTasks.Where(r => !completedGameTaskIds.Contains(r.Id)).Count() > 0 ?
                                        (long?)gameTasks.Where(r => !completedGameTaskIds.Contains(r.Id)).OrderBy(r => r.Order).First().Id : null;

            IList <GameTaskLightDto> availableGameTasks = gameTasks
                                                          .Where(r => completedGameTaskIds.Contains(r.Id) || r.Id == inProgressGameTaskId)
                                                          .OrderBy(r => r.Order)
                                                          .ToList();

            TeamGameTaskStatisticRepository.Includes.Clear();
            UserRepository.Includes.Clear();
            GameRepository.Includes.Clear();

            return(new RetrieveGameLightTasksOutput()
            {
                Game = gameEntity.MapTo <GameLightDto>(),
                GameTasks = availableGameTasks,
                CompletedGameTaskIds = completedGameTaskIds,
                InProgressGameTaskId = inProgressGameTaskId
            });
        }
예제 #4
0
        public TryToPassConditionOutput TryToPassCondition(TryToPassConditionInput input)
        {
            bool result = false;

            #region Retrieving current player career

            UserRepository.Includes.Add(r => r.PlayerCareers);
            UserRepository.Includes.Add(r => r.PlayerCareers.Select(e => e.Team.PlayerCareers));

            PlayerCareer currCareer = UserRepository.Get(Session.UserId ?? 0)
                                      .PlayerCareers.Where(r => r.CareerDateEnd == null).SingleOrDefault();

            UserRepository.Includes.Clear();

            #endregion

            if (currCareer != null)
            {
                #region Retrieving current condition

                ConditionRepository.Includes.Add(r => r.GameTask.Game);
                ConditionRepository.Includes.Add(r => r.ConditionType);

                Condition currentCondition = ConditionRepository.Get(input.ConditionId);
                if (currentCondition == null || currentCondition.GameTask == null || currentCondition.GameTask.Game == null ||
                    !GamePolicy.CanRetrieveEntityLight(currentCondition.GameTask.Game))
                {
                    //throw new CityQuestPolicyException(CityQuestConsts.CQPolicyExceptionRetrieveDenied, "\"Game\"");
                    return(new TryToPassConditionOutput()
                    {
                        Result = result
                    });
                }

                ConditionRepository.Includes.Clear();

                #endregion

                IList <long> teamPlayerCareerIds        = currCareer.Team.PlayerCareers.Select(e => e.Id).ToList();
                bool         alreadyPassedThisCondition = TeamGameTaskStatisticRepository.GetAll()
                                                          .Where(r => r.TeamId == currCareer.TeamId && r.GameTaskId == currentCondition.GameTaskId).Count() != 0 ||
                                                          PlayerGameTaskStatisticRepository.GetAll()
                                                          .Where(r => teamPlayerCareerIds.Contains(r.PlayerCareerId) && r.GameTaskId == currentCondition.GameTaskId).Count() != 0;
                if (!alreadyPassedThisCondition)
                {
                    result = HandleAttempt(currentCondition, currCareer, input.Value);
                }
            }

            return(new TryToPassConditionOutput()
            {
                Result = result
            });
        }
예제 #5
0
        private bool HandleAttemptForTimeCondition(Condition condition, PlayerCareer playerCareer)
        {
            bool     attemptResult   = false;
            DateTime attemptDateTime = (DateTime.Now).RoundDateTime();

#warning TODO: handle Condition_Time
            if (true)
            {
                attemptResult = true;

                SuccessfulPlayerAttempt newSuccessfullAttempt = new SuccessfulPlayerAttempt()
                {
                    AttemptDateTime = attemptDateTime,
                    ConditionId     = condition.Id,
                    InputedValue    = String.Empty,
                    PlayerCareerId  = playerCareer.Id
                };
                SuccessfullPlayerAttemptRepository.Insert(newSuccessfullAttempt);

                IList <long> userCompleterIds = new List <long>();

                #region Creating Statistic entities

                List <DateTime> previousTaskEndDTs = TeamGameTaskStatisticRepository.GetAll()
                                                     .Where(r => r.TeamId == playerCareer.TeamId)
                                                     .Select(r => r.GameTaskEndDateTime)
                                                     .Distinct().ToList();
                DateTime gameTaskStartTime = previousTaskEndDTs.Count > 0 ? previousTaskEndDTs.Max() : condition.GameTask.Game.StartDate;

                IList <PlayerGameTaskStatistic> newPlayerGameTaskStatistics = new List <PlayerGameTaskStatistic>();
                foreach (var item in playerCareer.Team.PlayerCareers)
                {
                    newPlayerGameTaskStatistics.Add(new PlayerGameTaskStatistic(condition.GameTaskId,
                                                                                item.Id, gameTaskStartTime, attemptDateTime, (condition.Points ?? 0)));
                    userCompleterIds.Add(item.UserId);
                }
                PlayerGameTaskStatisticRepository.AddRange(newPlayerGameTaskStatistics);

                TeamGameTaskStatistic newTeamGameTaskStatistic = new TeamGameTaskStatistic(condition.GameTaskId,
                                                                                           playerCareer.TeamId, gameTaskStartTime, attemptDateTime, (condition.Points ?? 0));
                TeamGameTaskStatisticRepository.Insert(newTeamGameTaskStatistic);

                #endregion

                UowManager.Current.Completed += (sender, e) =>
                {
                    StatisticsChangesNotifier.RaiseOnGameTaskCompleted(new GameTaskCompletedMessage(condition.GameTaskId, userCompleterIds));
                };
            }
            return(attemptResult);
        }
예제 #6
0
        private void HandleCalculatingGameStatistics(long gameId, DateTime gameStartTime, DateTime gameEndTime)
        {
            #region Checking\Deleting old game statistics
            // No way to have game statistics here if business process was not wrong
            // but ppl like to make incorrect DB changes using scripts (without CityQuest ui)
            // thats why would be better to check this here and delete.

            IList <PlayerGameStatistic> oldPlayerGameStatistics = PlayerGameStatisticRepository.GetAll().Where(r => r.GameId == gameId).ToList();

            if (oldPlayerGameStatistics.Count > 0)
            {
                //Log this WARNING
                PlayerGameStatisticRepository.RemoveRange(oldPlayerGameStatistics);
            }

            IList <TeamGameStatistic> oldTeamGameStatistics = TeamGameStatisticRepository.GetAll().Where(r => r.GameId == gameId).ToList();

            if (oldPlayerGameStatistics.Count > 0)
            {
                //Log this WARNING
                TeamGameStatisticRepository.RemoveRange(oldTeamGameStatistics);
            }

            #endregion

            #region Calculating game statistic for players

            PlayerGameTaskStatisticRepository.Includes.Add(r => r.GameTask);

            List <PlayerGameTaskStatistic> playerGameTaskStatistics = PlayerGameTaskStatisticRepository.GetAll()
                                                                      .Where(r => r.GameTask.GameId == gameId).ToList();

            IList <PlayerGameStatistic> newPlayerGameStatistics = new List <PlayerGameStatistic>();
            foreach (long playerCareerId in playerGameTaskStatistics.Select(r => r.PlayerCareerId).Distinct().ToList())
            {
#warning TODO: Calculate parameters here
                newPlayerGameStatistics.Add(new PlayerGameStatistic(gameId, playerCareerId, gameStartTime, gameEndTime,
                                                                    playerGameTaskStatistics.Select(r => r.ReceivedPoints ?? 0).Sum()));
            }
            PlayerGameStatisticRepository.AddRange(newPlayerGameStatistics);

            UowManager.Current.Completed += (sender, e) =>
            {
                StatisticsChangesNotifier.RaiseOnPlayerGameStatisticChanged(
                    new PlayerGameStatisticChangedMessage(gameId, playerGameTaskStatistics.Select(r => r.PlayerCareerId).Distinct().ToList()));
            };

            PlayerGameTaskStatisticRepository.Includes.Clear();

            #endregion

            #region Calculating game statistic for teams

            TeamGameTaskStatisticRepository.Includes.Add(r => r.GameTask);

            List <TeamGameTaskStatistic> teamGameTaskStatistics = TeamGameTaskStatisticRepository.GetAll()
                                                                  .Where(r => r.GameTask.GameId == gameId).ToList();

            IList <TeamGameStatistic> newTeamGameStatistics = new List <TeamGameStatistic>();
            foreach (long teamId in teamGameTaskStatistics.Select(r => r.TeamId).Distinct().ToList())
            {
#warning TODO: Calculate parameters here
                newTeamGameStatistics.Add(new TeamGameStatistic(gameId, teamId, gameStartTime, gameEndTime,
                                                                teamGameTaskStatistics.Select(r => r.ReceivedPoints ?? 0).Sum()));
            }
            TeamGameStatisticRepository.AddRange(newTeamGameStatistics);

            UowManager.Current.Completed += (sender, e) =>
            {
                StatisticsChangesNotifier.RaiseOnTeamGameStatisticChanged(
                    new TeamGameStatisticChangedMessage(gameId, teamGameTaskStatistics.Select(r => r.TeamId).Distinct().ToList()));
            };

            TeamGameTaskStatisticRepository.Includes.Clear();

            #endregion
        }