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 }); }
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); }
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 }