private async Task GetCourseDetail(string courseId) { try { var result = await NPAPI.GetCourseDetail(courseId); ApplyCourseDetail(result); } catch (NPAPI.SessionExpiredException) { //Send GA Event App.Current.GATracker.SendEvent("Session", "Session Expired", null, 0); //Try background login try { await NPAPI.BackgroundLogin(); await GetCourseDetail(courseId); } catch { Frame.Navigate(typeof(LoginPage)); } } catch (Exception e) { detailTextBlock.Text = e.Message; } }
public static async Task <Credits> Parse(string html) { var blockMatch = new Regex("請先完成[^教]+教學評量。", RegexOptions.IgnoreCase | RegexOptions.Multiline).Match(html); if (blockMatch.Success) { throw new System.Exception(blockMatch.Value); } var credits = new Credits(); var tableRegex = new Regex("<img src=\\./image/or_ball\\.gif>([^<]+)</h3>\n<table border=1 BGCOLOR=#CCFFFF>(?:(?!<\\/table>).|\n)*", RegexOptions.Multiline | RegexOptions.IgnoreCase); var tablematches = tableRegex.Matches(html); var semesters = new List <Semester>(); foreach (Match match in tablematches) { semesters.Add(ParseTable(match)); } credits.Semesters = semesters; var tasks = new List <Task>(); foreach (Semester semester in semesters) { tasks.AddRange(semester.Credits.Select(async credit => { var courseDetail = await NPAPI.GetCourseDetail(credit.CourseId); //Set course detail credit.Detail = courseDetail; if (credit.Grade >= 60) { //Sum credits for each detailed type if (credits.TotalDetailTypeCredits.ContainsKey(credit.Detail.Type)) { credits.TotalDetailTypeCredits[credit.Detail.Type] += credit.Credits; } else { credits.TotalDetailTypeCredits.Add(credit.Detail.Type, credit.Credits); } //Sum credits for each type if (credits.TotalTypeCredits.ContainsKey(credit.Type)) { credits.TotalTypeCredits[credit.Type] += credit.Credits; } else { credits.TotalTypeCredits.Add(credit.Type, credit.Credits); } //Sum semester credits credits.TotalCreditsGot += credit.Credits; } })); } //Run all tasks in parallel await Task.WhenAll(tasks.ToArray()); return(credits); }