private async Task Add_Missing_EncounterPlayerRolesv2()
        {
            var encounterIds = await _encounterRepository.GetAllEncounterIdsDescending();

            foreach (var encId in encounterIds)
            {
                Debug.WriteLine($"Checking encounter #{encId}");
                var encPlayersAndRoles = await _encounterRepository.CountEncounterPlayersAndRoles(encId);

                if (encPlayersAndRoles.Players != encPlayersAndRoles.PlayersWithRoles)
                {
                    Debug.WriteLine($"Encounter #{encId} has {encPlayersAndRoles.Players} players but only {encPlayersAndRoles.PlayersWithRoles} roles");

                    // Wipe out all of the EncounterPlayerRole records and update it, then check again
                    if (encPlayersAndRoles.PlayersWithRoles > 0)
                    {
                        var removeResult = await _encounterRepository.RemoveRoleRecordsForEncounter(encId);

                        if (removeResult == false)
                        {
                            Debug.WriteLine($"Something went wrong while removing roles for encounter {encId}");
                        }
                    }

                    var rolesFromRecords = _encounterRepository.GetPlayerRoles(encId);
                    if (rolesFromRecords.Any())
                    {
                        var playerRoleList = rolesFromRecords.Select(role => new EncounterPlayerRole()
                        {
                            Class       = role.Class,
                            EncounterId = encId,
                            PlayerId    = role.Id,
                            Role        = role.Role,
                            Name        = role.Name
                        }).ToList();
                        var result = _encounterRepository.AddPlayerEncounterRoles(playerRoleList);
                    }

                    //Debug.WriteLine($"Added {rolesFromRecords.Count} roles. Now, checking again...");

                    //encPlayersAndRoles = await _encounterRepository.CountEncounterPlayersAndRoles(encId);

                    //Debug.WriteLine($"Encounter #{encId} now has {encPlayersAndRoles.Players} players and {encPlayersAndRoles.PlayersWithRoles} roles");
                }
            }
        }
        private void Add_Missing_EncounterPlayerRoles()
        {
            var encounters = _encounterRepository.GetEncountersMissingPlayerRecords(10000);

            if (!encounters.Any())
            {
                return;
            }

            _logger.Debug($"EncounterPlayerRole update: Found {encounters.Count} encounters that need updating!");

            Stopwatch sw = new Stopwatch();

            sw.Start();
            var encounterPlayerRolesToAdd = new List <EncounterPlayerRole>();

            foreach (var id in encounters)
            {
                var rolesFromRecords = _encounterRepository.GetPlayerRoles(id);
                if (rolesFromRecords.Any())
                {
                    var playerRoleList = rolesFromRecords.Select(role => new EncounterPlayerRole()
                    {
                        Class       = role.Class,
                        EncounterId = id,
                        PlayerId    = role.Id,
                        Role        = role.Role,
                        Name        = role.Name
                    }).ToList();
                    encounterPlayerRolesToAdd.AddRange(playerRoleList);
                }
                else
                {
                    // Didn't get any roles. Why? No records in each of the tables?
                    var encRecordCount = _encounterRepository.CountBasicRecordsForEncounter(id);
                    if (encRecordCount.DamageCount == 0 &&
                        encRecordCount.HealingCount == 0 &&
                        encRecordCount.ShieldCount == 0)
                    {
                        // Encounter is empty. Remove it
                        _logger.Debug($"Marking {id} for deletion as it has no basic records.");
                        _encounterRepository.MarkEncountersForDeletion(new List <int>()
                        {
                            id
                        }, User.Identity.GetUserId());
                    }
                    else
                    {
                        // Records exist, but we couldn't determine roles, so make sure that the damage records
                        // cover the correct duration of the encounter. If the encounter was a wipe, remove it.
                        var thisEncounter = _encounterRepository.Get(id);
                        if (thisEncounter != null && !thisEncounter.SuccessfulKill)
                        {
                            _logger.Debug($"Marking {id} for deletion as it was a wipe with no available role detection.");
                            _encounterRepository.MarkEncountersForDeletion(new List <int>()
                            {
                                id
                            }, User.Identity.GetUserId());
                        }
                    }
                }
            }

            if (!encounterPlayerRolesToAdd.Any())
            {
                _logger.Debug("Didn't find any records to add from these encounters, stopping now!");
                sw.Stop();
                return;
            }

            var result = _encounterRepository.AddPlayerEncounterRoles(encounterPlayerRolesToAdd);

            _logger.Debug(result.Success
                ? $"Successfully added {encounterPlayerRolesToAdd.Count} EncounterPlayerRole records"
                : $"An error occurred while adding EncounterPlayerRole records: {result.Message}");
            sw.Stop();

            TempData.Add("flash", new FlashSuccessViewModel(
                             $"AddMissingEncounterPlayerRoles() complete! Added {encounterPlayerRolesToAdd.Count} in {sw.Elapsed}"));
        }
Пример #3
0
        public void Execute(IJobExecutionContext context)
        {
            var task = _taskRepository.Get("EncounterPlayerRoleRecords");

            if (task == null)
            {
                _logger.Debug("Can't update EncounterPlayerRoleRecords - no matching task definition exists in the database.");
                return;
            }

            // Check if enough time has passed for us to run this task again
            if (task.LastRun.AddMinutes(task.ScheduleMinutes) > DateTime.Now)
            {
                _logger.Debug("Not enough time has passed for this scheduled task, so it won't be executed now");
                return;
            }

            // Update the task lastrun time first, so if it takes a minute to run, we don't run it on another server at the same time
            _taskRepository.UpdateTask(task.Id, DateTime.Now);

            var encounters = _encounterRepository.GetEncountersMissingPlayerRecords(100);

            if (!encounters.Any())
            {
                return;
            }

            _logger.Debug(string.Format("EncounterPlayerRole update: Found {0} encounters that need updating!", encounters.Count));

            var encounterPlayerRolesToAdd = new List <EncounterPlayerRole>();

            foreach (var id in encounters)
            {
                var rolesFromRecords = _encounterRepository.GetPlayerRoles(id);
                if (rolesFromRecords.Any())
                {
                    var playerRoleList = rolesFromRecords.Select(role => new EncounterPlayerRole()
                    {
                        Class       = role.Class,
                        EncounterId = id,
                        PlayerId    = role.Id,
                        Role        = role.Role,
                        Name        = role.Name
                    }).ToList();
                    encounterPlayerRolesToAdd.AddRange(playerRoleList);
                }
                else
                {
                    // Didn't get any roles. Why? No records in each of the tables?
                    var encRecordCount = _encounterRepository.CountBasicRecordsForEncounter(id);
                    if (encRecordCount.DamageCount == 0 &&
                        encRecordCount.HealingCount == 0 &&
                        encRecordCount.ShieldCount == 0)
                    {
                        // Encounter is empty. Remove it
                        _logger.Debug(string.Format("Marking {0} for deletion as it has no basic records.", id));
                        _encounterRepository.MarkEncountersForDeletion(new List <int>()
                        {
                            id
                        }, "scheduledTask");
                    }
                    else
                    {
                        // Records exist, but we couldn't determine roles, so make sure that the damage records
                        // cover the correct duration of the encounter. If the encounter was a wipe, remove it.
                        var thisEncounter = _encounterRepository.Get(id);
                        if (thisEncounter != null && !thisEncounter.SuccessfulKill)
                        {
                            _logger.Debug(string.Format("Marking {0} for deletion as it was a wipe with no available role detection.", id));
                            _encounterRepository.MarkEncountersForDeletion(new List <int>()
                            {
                                id
                            }, "scheduledTask");
                        }
                    }
                }
            }

            if (!encounterPlayerRolesToAdd.Any())
            {
                _logger.Debug("Didn't find any records to add from these encounters, stopping now!");
                return;
            }

            var result = _encounterRepository.AddPlayerEncounterRoles(encounterPlayerRolesToAdd);

            _logger.Debug(result.Success
                ? string.Format("Successfully added {0} EncounterPlayerRole records",
                                encounterPlayerRolesToAdd.Count)
                : string.Format("An error occurred while adding EncounterPlayerRole records: {0}", result.Message));
        }