public void OnDependenciesResolved() { sessionManager = new SessionMannager(config.MaxConcurrentWebSessions, config.MaxWebRequestsPerMinutePerSession); dependency.Register(sessionManager); dataParser = dependency.Create <WebDataParser>(); }
public async Task Run(ILogEnd log, SessionMannager sessionManager, int tawUnitId) { var newVersion = new Random().Next(); // all person to unit relations without this unit version will be deleted log = log.ProfileStart($"unit {tawUnitId}"); var url = Unit.GetUnitRoasterPage(tawUnitId); var response = await sessionManager.GetUrlAsync(url, log.Profile("getting html")); var html = response.HtmlDocument; var roasterDiv = html.GetElementbyId("ctl00_bcr_UpdatePanel1").SelectSingleNode("./div/ul"); using (log.ScopeStart("parsing html")) await ParseUnitContents(log, roasterDiv, null); using (var log2 = log.ScopeStart("processing people")) { var tasks = new List <Task>(personNameToPersonLines.Count); foreach (var kvp in personNameToPersonLines) { var personName = kvp.Key; var personLines = kvp.Value; var task = Task.Run(async() => { using (var log3 = log2.ProfileStart(personName)) { using (var data = Db.NewContext) { foreach (var personLine in personLines) { await personLine.FinishParsing(log3, data); } var personUnitIds = personLines.Select(p => p.PersonToUnitId).ToArray(); var utcNow = DateTime.UtcNow; // if some person to unit is still valid, and not one of those we just updated, mark it as not valid anymore data .People .First(p => p.Name == personName) .Units .Where(u => u.Removed > utcNow) // still valid, not removed .Where(u => !personUnitIds.Contains(u.PersonUnitId)) // except those we found & updated .ForEach(u => u.Removed = utcNow); // remove it try { await data.SaveChangesAsync(); } catch (Exception e) { log3.Fatal(e); } } } }); tasks.Add(task); } ; await Task.WhenAll(tasks.ToArray()); } }
public async Task UpdateUnitContents(ILogEnd log, SessionMannager sessionManager, int tawUnitId) { await new UpdateUnitContentsHandler(this).Run(log, sessionManager, tawUnitId); }