public static async Task <DailyData> LoadTideData(DateTime today, Location location) { var cachedData = FileCache.GetDailyData(today, location); if (cachedData != null) { return(cachedData); } List <DailyData> data = new List <DailyData>(); using (var client = new System.Net.WebClient()) { var startDate = today; var values = new System.Collections.Specialized.NameValueCollection(); values["site"] = String.Format("Maryland&station_number={0}", ((Int32)location)); values["month"] = String.Format("{0}&year={1}", today.Month, today.Year); values["start_date"] = startDate.Day.ToString(); values["maximum_days"] = "14"; // get response var response = client.UploadValues("http://www.saltwatertides.com/cgi-local/maryland.cgi", values); HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument(); html.LoadHtml(Encoding.Default.GetString(response)); var root = html.DocumentNode; var content = root.Descendants("PRE"); System.IO.StringReader reader = new StringReader(content.First().InnerText); var line = string.Empty; while (line != null) { line = reader.ReadLine(); if (String.IsNullOrWhiteSpace(line)) { continue; } if (line.StartsWith("Day")) { continue; } if (line.Contains("Sunset")) { continue; } int day = 0; if (!int.TryParse(line.Substring(4, 2), out day)) { throw new ApplicationException("Cannot parse day"); } DailyData.TideType type = DailyData.TideType.Low; if (!Enum.TryParse <DailyData.TideType>(line.Substring(11, 4), out type)) { throw new ApplicationException("Cannot parse tide type"); } DateTime timeOfTide = new DateTime(); if (!DateTime.TryParse(line.Substring(17, 8), out timeOfTide)) { throw new ApplicationException("Cannot parse time of tide"); } DateTime?timeOfSun = null; if (line.Length > 42) { DateTime sun; if (!DateTime.TryParse(line.Substring(35, 8), out sun)) { throw new ApplicationException("Cannot parse time of sun"); } timeOfSun = sun; } DailyData dailyData; //First Record if (!data.Any(x => x.DayOfMonth == day)) { data.Add(new DailyData(day, startDate)); } dailyData = data.First(x => x.DayOfMonth == day); if (type == DailyData.TideType.Low) { if (dailyData.FirstLowTide.HasValue) { dailyData.SecondLowTide = timeOfTide; } else { dailyData.FirstLowTide = timeOfTide; } } else { if (dailyData.FirstHighTide.HasValue) { dailyData.SecondHighTide = timeOfTide; } else { dailyData.FirstHighTide = timeOfTide; } } if (timeOfSun.HasValue) { if (!dailyData.SunRise.HasValue) { dailyData.SunRise = timeOfSun; } else { dailyData.SunSet = timeOfSun; } } } Data = data; } if (data.Any()) { foreach (var d in data) { FileCache.StoreDailyData(d, d.Date, location); } } return(data.First()); }
public static async Task<DailyData> LoadTideData(DateTime today, Location location) { var cachedData = Cache.GetDailyData(today, location); if (cachedData != null) return cachedData; List<DailyData> data = new List<DailyData>(); //var responseJson = await httpClient.GetStringAsync(url); using (var client = HttpClientFactory.Create()) { var startDate = today; IList<KeyValuePair<string, string>> nameValueCollection = new List<KeyValuePair<string, string>>(); nameValueCollection.Add(new KeyValuePair<string, string>("site", String.Format("Maryland&station_number={0}", ((Int32)location)))); nameValueCollection.Add(new KeyValuePair<string, string>("month", String.Format("{0}&year={1}", today.Month, today.Year))); nameValueCollection.Add(new KeyValuePair<string, string>("start_date", startDate.Day.ToString())); nameValueCollection.Add(new KeyValuePair<string, string>("maximum_days", "2")); // get response var response = await client.PostAsync("https://www.saltwatertides.com/cgi-local/maryland.cgi", new FormUrlEncodedContent(nameValueCollection)); var contents = await response.Content.ReadAsStringAsync(); HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument(); html.LoadHtml(contents); var root = html.DocumentNode; var content = root.Descendants("PRE"); System.IO.StringReader reader = new StringReader(content.First().InnerText); var line = string.Empty; while (line != null) { line = reader.ReadLine(); if (String.IsNullOrWhiteSpace(line)) continue; if (line.StartsWith("Day")) continue; if (line.Contains("Sunset")) continue; int day = 0; if (!int.TryParse(line.Substring(4, 2), out day)) throw new Exception("Cannot parse day"); DailyData.TideType type = DailyData.TideType.Low; if (!Enum.TryParse<DailyData.TideType>(line.Substring(11, 4), out type)) throw new Exception("Cannot parse tide type"); DateTime timeOfTide = new DateTime(); if (!DateTime.TryParse(line.Substring(17, 8), out timeOfTide)) throw new Exception("Cannot parse time of tide"); DateTime? timeOfSun = null; if (line.Length > 42) { DateTime sun; if (!DateTime.TryParse(line.Substring(35, 8), out sun)) throw new Exception("Cannot parse time of sun"); timeOfSun = sun; } DailyData dailyData; //First Record if (!data.Any(x => x.DayOfMonth == day)) data.Add(new DailyData(day, startDate)); dailyData = data.First(x => x.DayOfMonth == day); if (type == DailyData.TideType.Low) { if (dailyData.FirstLowTide.HasValue) dailyData.SecondLowTide = timeOfTide; else dailyData.FirstLowTide = timeOfTide; } else { if (dailyData.FirstHighTide.HasValue) dailyData.SecondHighTide = timeOfTide; else dailyData.FirstHighTide = timeOfTide; } if (timeOfSun.HasValue) { if (!dailyData.SunRise.HasValue) dailyData.SunRise = timeOfSun; else dailyData.SunSet = timeOfSun; } } Data = data; } if (data.Any()) foreach (var d in data) Cache.StoreDailyData(d, d.Date, location); return data.First(); }