private void NotifyIfNewAchievements(IList<BuildStatus> changedBuildStatuses)
{
if (!changedBuildStatuses.Any(i => i.IsWorkingOrBroken())) return;
var visiblePeopleWithNewChanges = from changedBuildStatus in changedBuildStatuses
join person in _settings.VisiblePeople on changedBuildStatus.RequestedBy equals person.RawName
where changedBuildStatus.IsWorkingOrBroken()
select new
{
Person = person,
Build = changedBuildStatus
};
foreach (var personWithNewChange in visiblePeopleWithNewChanges)
{
var newAchievements = personWithNewChange.Person.CalculateNewAchievements(_settings, personWithNewChange.Build);
List<AchievementLookup> achievements = newAchievements.ToList();
if (achievements.Any())
{
personWithNewChange.Person.AddAchievements(achievements);
InvokeNewAchievement(personWithNewChange.Person, achievements);
}
}
// this is required because achievements often write to settings e.g. cumulative build time
_settings.Save();
}